Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

список процедур   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.007 c
2-1319204159
Alez
2011-10-21 17:35
2012.01.29
Не правильно работает код после перехода на Delphi XE2


8-1220035851
Doki
2008-08-29 22:50
2012.01.29
3д модель


1-1283231923
Элия
2010-08-31 09:18
2012.01.29
Как определить виден ли скролл. ListView.


1-1282292479
TComponent
2010-08-20 12:21
2012.01.29
Компонент для сетевой структуры


2-1319387815
Очень злой
2011-10-23 20:36
2012.01.29
Как узнать HANDLE окна, на форме которого находится компонент.