Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Внизсписок процедур Найти похожие ветки
← →
Handle (2011-10-14 16:27) [0]есть несколько процедур без параметров ProcA, ProcB, ..., ProcZ. Нужно запихнуть их в список и вызывать из списка. Как это делается?
procedure ProcA;
begin
ShowMessage("A");
end;
procedure ProcB;
begin
ShowMessage("B");
end;
procedure ProcC;
begin
ShowMessage("C");
end;
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
ProcList: TList;
begin
ProcList := TList.Create;
try
ProcList.Add(@ProcA);
ProcList.Add(@ProcB);
ProcList.Add(@ProcC);
for I := 0 to ProcList.Count - 1 do
ProcList[I];
finally
ProcList.Free;
end;
end;
← →
Сергей М. © (2011-10-14 16:33) [1]type
TProc = procedure;
...
for I := 0 to ProcList.Count - 1 do
TProc(ProcList[I]);
← →
OW © (2011-10-14 16:35) [2]for I := 0 to ProcList.Count - 1 do
begin
proc := ProcList[i];
proc;
end;
var
proc: procedure;
← →
Handle (2011-10-14 16:35) [3]Спасибо.
← →
OW © (2011-10-14 16:35) [4]не успел :)
← →
Anatoly Podgoretsky © (2011-10-14 20:07) [5]> Handle (14.10.2011 16:27:00) [0]
Читай про процедурные типа/переменные
← →
bems (2011-10-15 20:17) [6]А между тем неожиданно наступил 2011й год
procedure FillAndCall;
var
Proc: TProcedure;
List: TList<TProcedure>;
begin
List := TList<TProcedure>.Create;
try
List.Add(ProcA);
List.Add(ProcB);
List.Add(ProcC);
for Proc in List do Proc;
finally
FreeAndNil(List)
end;
end;
← →
SQLEX © (2011-10-15 20:49) [7]
> type
> TProc = procedure;
> ...
>
> for I := 0 to ProcList.Count - 1 do
> TProc(ProcList[I]);
круче, все равно
лишних переменных нет и более "по-делфистски"? что ли..
← →
Юрий Зотов © (2011-10-15 20:53) [8]
> bems (15.10.11 20:17) [6]
Важнейшее расширение языка. И как мы раньше без него обходились...
← →
bems (2011-10-15 21:47) [9]
> ажнейшее расширение языка. И как мы раньше без него обходились.
> ..
Согласен, расширение не очень значительное. А типизация так вообще предрассудок
> более "по-делфистски"
Почему повторное объявление уже существующего типа и добровольный отказ от проверки компилятором типа элемента списка это более дельфистский подход?
← →
Юрий Зотов © (2011-10-15 23:09) [10]> bems (15.10.11 21:47) [9]
Кстати, интересно - а вот так компилятор распознает подлог, или нет:
var
P: Pointer;
begin
List := TList<TProcedure>.Create;
List.Add(TProcedure(P));
← →
bems (2011-10-15 23:17) [11]Достоинство обобщенного списка в том, что он позволяет обойтись без приведения типа. Подразумевается что использующий знает, что из двух вариантов кода предпочесть следует вариант свободный от привидений типов (только с точки зрения поддерживаемости и только при прочих равных условиях).
Если Вы всё равно используете приведение, то нет, не распознает, потому что Вы сами попросили его помолчать. В общем TProcedure(P) это такой же пример добровольного отказа от типизации как и TProc(ProcList[I])
← →
Jeer © (2011-10-15 23:51) [12]Космос - бесконечен. Кто спорит ?
Но, для того, чтобы построить личную Пирамиду соразмерными силами, совсем не обязательно вызывать Пришельцев с нейтринными резаками и спрашивать индульгенцию у Папы.
← →
bems (2011-10-15 23:52) [13]Что, простите?
← →
Jeer © (2011-10-15 23:54) [14]
> bems (15.10.11 23:52) [13]
>
> Что, простите?
Да нет, ничего страшного - вполне возможно, что Вы просто дверью ошиблись.
Бывает..
← →
Юрий Зотов © (2011-10-16 00:05) [15]
> bems (15.10.11 23:17) [11]
> Достоинство обобщенного списка в том, что он позволяет обойтись
> без приведения типа.
Думаю, что его главное достоинство все же не в этом, а в том, что автоматически контролируется тип заносимой в список переменной. Впрочем, и его, как выяснилось, можно обойти (хотя и незачем).
← →
bems (2011-10-16 00:05) [16]
> вполне возможно, что Вы просто дверью ошиблись
Не, я попал куда и пытался.
Про Папу и пришельцев это наверное была какая-то метафора, но уж больно тонкая. Я не понял что сравнивается с пришельцами и Папой. Дженерики гораздо проще и ближе. Если так рассуждать, то и стандартный TList это войска особого назначения, а свой корявый шалаш можно построить на динамическом массиве поинтеров и двух функциях к нему.
Хотя Вы бы наверное использовали не динамический массив а выделенный вручную буфер, а текущую длину хранили бы в отдельной переменной.
У каждого свой путь. Я предпочитаю побольше работы перекладывать на компилятор и RTL
← →
bems (2011-10-16 00:11) [17]
> Думаю, что его главное достоинство все же не в этом, а в
> том, что автоматически контролируется тип заносимой в список
> переменной
Да, всё верно, это я и говорю с самого начала. А приведение сводит это на нет
> хотя и незачем
Ну кажется это взаимопонимание.
← →
Юрий Зотов © (2011-10-16 00:27) [18]
> Ну кажется это взаимопонимание.
Дык... а разногласий и не было. Штука, в целом, полезная, я ею пользуюсь уже лет 5, как только начал на Джаве кодить. Правда, за все время моего программизьма (а это уже 42 года - страшно подумать) еще ни разу не было случая, чтобы я запихнул в список не то, что надо... так что надо просто аккуратно кодить (причем кодить надо аккуратно всегда, независимо ни от каких примочек).
← →
Jeer © (2011-10-16 00:32) [19]
> Хотя Вы бы наверное использовали не динамический массив
> а выделенный вручную буфер
Садомазохизм - не всегда болезнь и сладострастие.
Иногда - это просто искусство эффективности бытия.
P.S.
С учетом самоограничения экспонентциальности :)
← →
bems (2011-10-16 00:33) [20]
> еще ни разу не было случая, чтобы я запихнул в список не
> то, что надо
я не могу доказать что это неправда конкретно в Вашем случае, но в целом по индустрии давно известно что нужно стремиться к уменьшению человеческого фактора. Компилятор не бывает болен, с похмелья или с семейными проблемами.
> ак что надо просто аккуратно кодить (причем кодить надо
> аккуратно всегда, независимо ни от каких примочек)
Да, надо. Но польза этой аккуратности всё равно больше с дополнительным контролем со стороны компилятора, чем без него.
> а это уже 42 года - страшно подумать
И всё это время Вы сам пишете код? Вы наверное учень увлеченный человек
← →
Игорь Шевченко © (2011-10-16 00:42) [21]
> И всё это время Вы сам пишете код? Вы наверное учень увлеченный
> человек
вы предлагаете его диктовать секретарям ?
← →
bems (2011-10-16 00:46) [22]Нет, я просто восхищаюсь.
Спасибо, кажется мы всё выяснили.
Покидаю тред.
← →
Юрий Зотов © (2011-10-16 00:56) [23]
> bems (16.10.11 00:33) [20]
> И всё это время Вы сам пишете код? Вы наверное учень увлеченный
> человек
Возможно. Хотя, конечно, я пишу не только код (да и расточительно было бы использовать человека с 40-летним опытом программизма в качестве всего лишь кодера). Просто предпочитаю делать всю задачу сам, начиная с разговоров с заказчиком и кончая кодингом.
← →
DVM © (2011-10-16 13:25) [24]
> Юрий Зотов © (15.10.11 20:53) [8]
>
> > bems (15.10.11 20:17) [6]
>
> Важнейшее расширение языка. И как мы раньше без него обходились.
> ..
>
>
Хреново обходились. Каждый раз для создания списка из элементов нового типа приходилось делать тупую рутинную работу. И не только для списков.
Начиная с D7 в языке произошло много нововведений. Нужность и полезность их спорна и неочевидна для многих, тут как говорится на вкус и цвет товарищей нет, но большинство об этих нововведениях просто не знают и не используют. А использование их кем то другим принмают в штыки, так как для них самих такой стиль непривычен. Аргументируют обычно тем, что в D7 это не скомпилируется, даже если работа будет вестись исключительно под XE.
А между тем, есть куча действительно полезных нововведений, делающих код программы чище и понятнее хотя бы.
← →
Ega23 © (2011-10-16 14:35) [25]
> делающих код программы чище и понятнее хотя бы.
И не только.
Например, недавно для себя нашёл одно интересное применение хелперов, для "тестирования". Есть класс, есть у него метод. Есть куча вызовов данного метода данного класса. Но вот поведение его что-то не нравится. Надо бы данный метод переделать малость и сравнить, как лучше.
← →
Юрий Зотов © (2011-10-16 16:07) [26]> DVM © (16.10.11 13:25) [24]
> Начиная с D7 в языке произошло много нововведений.
Именно с D7 ?
← →
DVM © (2011-10-16 16:25) [27]
> Юрий Зотов © (16.10.11 16:07) [26]
> Именно с D7 ?
D7 - это своего рода рода рубеж, на котором остановились познания многих (и пишуших и не пишущих на Delphi) о языке Delphi.
← →
DVM © (2011-10-16 16:45) [28]
> Юрий Зотов © (16.10.11 16:07) [26]
изменения были и раньше, но никогда ранее имхо их не было столько. Например, новшества не самой последней D2010 по сравнению с D7:
strict private
Inline
перегрузки операторов
Class Helpers
записи-объекты
абстрактные классы
sealed классы
Классовые константы
Классовые переменные
Вложенные классы
Финальные методы класса
Статические методы класса
for-element-in-collection
Динамическая инициализация массивов
Дженерики
Unicode
это только часть, то что вспомнил.
Конечно, часть этого можно назвать синтаксическим сахаром, обойтись без которого конечно можно, дань моде и попытка угнаться за с#, но оно есть и почему бы это не использовать.
Почему попытка создать программу с развитым интерфейсом исключительно на WinAPI вызывает недоумение, а использование новых возможностей экономящих время (дженерики) вызывает странные язвительные замечания?
← →
Ega23 © (2011-10-16 17:07) [29]
> это только часть, то что вспомнил.
Анонимные методы, весьма мощный RTTI, а также довольно поганый фреймворк для юнит-тестирования.
← →
Юрий Зотов © (2011-10-16 17:20) [30]Так значит, начиная все же не с D7, а позже. А то я уж было испугался.
:o)
Правда, справедливости ради надо заметить, что понятия абстрактных классов и статических методов существовали и в D7, и даже раньше. То, что они в явном виде так не назывались, сути не меняет.
← →
DVM © (2011-10-16 17:46) [31]
> Юрий Зотов © (16.10.11 17:20) [30]
> понятия абстрактных классов и статических методов существовали
> и в D7, и даже раньше
Были классы с абстрактным конструктором. Не со всем то же самое, но на практике результат давали тот же.
А вот про статические методы класса я не совсем понял. Что под этим подразумеваешь из того что было до введения ключевого слова static ?
← →
Юрий Зотов © (2011-10-16 17:51) [32]> DVM © (16.10.11 17:46) [31]
> Были классы с абстрактным конструктором. Не со всем то же
> самое, но на практике результат давали тот же.
Не совсем так. Абстрактным назывался просто класс, содержащий хотя бы один абстрактный метод. Любой.
> А вот про статические методы класса я не совсем понял. Что
> под этим подразумеваешь из того что было до введения ключевого
> слова static ?
class procedure (function) - разве это не тот же самый статический метод, по сути своей?
← →
DVM © (2011-10-16 17:56) [33]
> Юрий Зотов © (16.10.11 17:51) [32]
> class procedure (function) - разве это не тот же самый статический
> метод, по сути своей?
Нет это не одно и то же.
Просто классовый метод (который есть в Delphi 7) имеет неявный скрытый параметр, в котором передаётся указатель на класс и классовый метод может использовать информацию о классе. Для статического классового метода (Из новых версий Delphi) такого параметра нет, что делает, например, возможным передавать такой метод в качестве функции обратного вызова в WinAPI.
← →
Sha © (2011-10-16 18:29) [34]DVM © (16.10.11 16:45) [28]
студента жалко
← →
DiamondShark © (2011-10-17 10:44) [35]
> Для статического классового метода (Из новых версий Delphi)
> такого параметра нет, что делает, например, возможным передавать
> такой метод в качестве функции обратного вызова в WinAPI.
Т.е. методом он является чисто синтаксически. Возникает резонный вопрос: а нафига?
← →
OW © (2011-10-17 11:20) [36]втиснусь.
полувопрос-полумысль
может быть удобнее стало, может быть (да, наверняка) что-то не понимаю, но все эти нововведения или реализуемы руками, или хуже выглядят.(ну а некоторые, строго имхо, совсем незачем.
Финальные методы класса - какой смысл? Зачем тогда класс вообще?
strict private и strict protected - дык, не юзай (сам же) где не надо, да и все
класс-в-класс - вообще не понятно, а до этого, что, не было что ли.. ALines содержит FLines, да сколько угодно.
ну и по списку
)
Да и выглядит старый способ( явное приведение, например, ) все же гораздо понятнее. К тому же, он явно показывает, что хотел программист. И просмотреть его подругому сложно.
только
> Class Helpers
представляется удобной штукой :)
← →
Ega23 © (2011-10-17 11:32) [37]
> Да и выглядит старый способ( явное приведение, например,
> ) все же гораздо понятнее. К тому же, он явно показывает,
> что хотел программист. И просмотреть его подругому сложно.
Ой не скажи... Я точно такую же позицию занимал, пока активно использовать не начал. Нереально удобно.
← →
DVM © (2011-10-17 11:34) [38]
> DiamondShark © (17.10.11 10:44) [35]
> Т.е. методом он является чисто синтаксически. Возникает
> резонный вопрос: а нафига?
А пёс его знает. Для того чтобы не болтались в коде свободные функции и процедуры. Для более строгой организации всего и вся в пространства имен.
← →
DVM © (2011-10-17 11:39) [39]
> OW © (17.10.11 11:20) [36]
> strict private и strict protected - дык, не юзай (сам же)
> где не надо, да и все
Нееее. Особенно strict private имхо очень полезная штука. Иногда когда классы в одном модуле и они по умолчанию дружественные, то при обращении из одного класса к свойствам другого иногда случайно (дополнение кода подсказывает не то что хотел) вместо свойства вставляется приватное поле класса. И все вобщем то работает, пока классы вдруг не понадобится разнести по разным модулям или защитить поле критической секцией. Да и вообще для подержания принципа строгой инкапсуляции полезно. Теперь всегда ставлю strict.
← →
Sha © (2011-10-17 11:40) [40]У меня ваще крамольная мысль имеется:
UnitName.ProcName(Object, Param) не хуже Object.ProcName(Param)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.01.29;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.004 c