![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
список процедур
Handle © (2011-10-14 16:27:00)есть несколько процедур без параметров 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;
bems (2011-10-16 00:33:00) [21]
> еще ни разу не было случая, чтобы я запихнул в список не
> то, что надо
я не могу доказать что это неправда конкретно в Вашем случае, но в целом по индустрии давно известно что нужно стремиться к уменьшению человеческого фактора. Компилятор не бывает болен, с похмелья или с семейными проблемами.
> ак что надо просто аккуратно кодить (причем кодить надо
> аккуратно всегда, независимо ни от каких примочек)
Да, надо. Но польза этой аккуратности всё равно больше с дополнительным контролем со стороны компилятора, чем без него.
> а это уже 42 года - страшно подумать
И всё это время Вы сам пишете код? Вы наверное учень увлеченный человек
Jeer (2011-10-16 00:32:00) [22]
> Хотя Вы бы наверное использовали не динамический массив
> а выделенный вручную буфер
Садомазохизм - не всегда болезнь и сладострастие.
Иногда - это просто искусство эффективности бытия.
P.S.
С учетом самоограничения экспонентциальности :)
Юрий Зотов (2011-10-16 00:27:00) [23]
> Ну кажется это взаимопонимание.
Дык... а разногласий и не было. Штука, в целом, полезная, я ею пользуюсь уже лет 5, как только начал на Джаве кодить. Правда, за все время моего программизьма (а это уже 42 года - страшно подумать) еще ни разу не было случая, чтобы я запихнул в список не то, что надо... так что надо просто аккуратно кодить (причем кодить надо аккуратно всегда , независимо ни от каких примочек).
bems (2011-10-16 00:11:00) [24]
> Думаю, что его главное достоинство все же не в этом, а в
> том, что автоматически контролируется тип заносимой в список
> переменной
Да, всё верно, это я и говорю с самого начала. А приведение сводит это на нет
> хотя и незачем
Ну кажется это взаимопонимание.
bems (2011-10-16 00:05:00) [25]
> вполне возможно, что Вы просто дверью ошиблись
Не, я попал куда и пытался.
Про Папу и пришельцев это наверное была какая-то метафора, но уж больно тонкая. Я не понял что сравнивается с пришельцами и Папой. Дженерики гораздо проще и ближе. Если так рассуждать, то и стандартный TList это войска особого назначения, а свой корявый шалаш можно построить на динамическом массиве поинтеров и двух функциях к нему.
Хотя Вы бы наверное использовали не динамический массив а выделенный вручную буфер, а текущую длину хранили бы в отдельной переменной.
У каждого свой путь. Я предпочитаю побольше работы перекладывать на компилятор и RTL
Юрий Зотов (2011-10-16 00:05:00) [26]
> bems (15.10.11 23:17) [11]
> Достоинство обобщенного списка в том, что он позволяет обойтись
> без приведения типа.
Думаю, что его главное достоинство все же не в этом, а в том, что автоматически контролируется тип заносимой в список переменной. Впрочем, и его, как выяснилось, можно обойти (хотя и незачем).
Jeer (2011-10-15 23:54:00) [27]
> bems (15.10.11 23:52) [13]
>
> Что, простите?
Да нет, ничего страшного - вполне возможно, что Вы просто дверью ошиблись.
Бывает..
bems (2011-10-15 23:52:00) [28]Что, простите?
Jeer (2011-10-15 23:51:00) [29]Космос - бесконечен. Кто спорит ?
Но, для того, чтобы построить личную Пирамиду соразмерными силами, совсем не обязательно вызывать Пришельцев с нейтринными резаками и спрашивать индульгенцию у Папы.
bems (2011-10-15 23:17:00) [30]Достоинство обобщенного списка в том, что он позволяет обойтись без приведения типа. Подразумевается что использующий знает, что из двух вариантов кода предпочесть следует вариант свободный от привидений типов (только с точки зрения поддерживаемости и только при прочих равных условиях).
Если Вы всё равно используете приведение, то нет, не распознает, потому что Вы сами попросили его помолчать. В общем TProcedure(P) это такой же пример добровольного отказа от типизации как и TProc(ProcList[I])
Юрий Зотов (2011-10-15 23:09:00) [31]> bems (15.10.11 21:47) [9]
Кстати, интересно - а вот так компилятор распознает подлог, или нет:
var
P: Pointer;
begin
List := TList<TProcedure>.Create;
List.Add(TProcedure(P));
bems (2011-10-15 21:47:00) [32]
> ажнейшее расширение языка. И как мы раньше без него обходились.
> ..
Согласен, расширение не очень значительное. А типизация так вообще предрассудок
> более "по-делфистски"
Почему повторное объявление уже существующего типа и добровольный отказ от проверки компилятором типа элемента списка это более дельфистский подход?
Юрий Зотов (2011-10-15 20:53:00) [33]
> bems (15.10.11 20:17) [6]
Важнейшее расширение языка. И как мы раньше без него обходились...
SQLEX (2011-10-15 20:49:00) [34]
> type
> TProc = procedure;
> ...
>
> for I := 0 to ProcList.Count - 1 do
> TProc(ProcList[I]);
круче, все равно
лишних переменных нет и более "по-делфистски"? что ли..
bems (2011-10-15 20:17:00) [35]А между тем неожиданно наступил 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;
Anatoly Podgoretsky (2011-10-14 20:07:00) [36]> Handle (14.10.2011 16:27:00) [0]
Читай про процедурные типа/переменные
OW (2011-10-14 16:35:00) [37]не успел :)
Handle (2011-10-14 16:35:00) [38]Спасибо.
OW (2011-10-14 16:35:00) [39]for I := 0 to ProcList.Count - 1 do
begin
proc := ProcList[i];
proc;
end;
var
proc: procedure;
Сергей М. (2011-10-14 16:33:00) [40]type
TProc = procedure;
...
for I := 0 to ProcList.Count - 1 do
TProc(ProcList[I]);