Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

список процедур


Страницы:   1 2

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]);


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо