Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.068 c
1-1282384267
MSV
2010-08-21 13:51
2012.01.29
Двустрорнняя печать


15-1318345230
Awesome-o 4000
2011-10-11 19:00
2012.01.29
Прошу дать совет


2-1318595246
Handle
2011-10-14 16:27
2012.01.29
список процедур


15-1318502205
PreDatoR
2011-10-13 14:36
2012.01.29
Проблема с классом.


2-1319306729
Katie
2011-10-22 22:05
2012.01.29
caption для лейб





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский