Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2022, 14:43   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Массив процедур

Код:
type
  ProcedureClick=procedure(Sender: TObject) of object;
И при попытке создать массив, выдает ошибку
Код:
const
  Btt_Pr:array [0..5] of ProcedureClick=(But19C, But21C, But31C, But23C, But22C, But15C);
Вопрос: как сделать массив констант типа процедура?
Kronos913 вне форума Ответить с цитированием
Старый 04.10.2022, 15:20   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

ДО создания формы методы как-бы не существуют
заполнение глобальных констант идет не то что бы ДО создания формы, но и до запуска программы

Цитата:
выдает ошибку
любопытно, а какую?
опять же ради любопытства, а зачем нужен такой массив.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 04.10.2022, 15:48   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Зачем: большое количество кнопок заданы массивом array [a..b] of TButton
И нужно задать им каждому свою процедуру-реакцию
Kronos913 вне форума Ответить с цитированием
Старый 04.10.2022, 17:41   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Скорее всего выдает ошибку из-за того, что процедуры перечислены в виде вызовов. А вам надо создать массив указателей. Попробуйте так
Код:
// Процедуры обязательно надо объявить до использования ссылки на нее
procedure But15C(Sender: TObject) of object;
procedure But19C(Sender: TObject) of object;
procedure But21C(Sender: TObject) of object;
procedure But22C(Sender: TObject) of object;
procedure But23C(Sender: TObject) of object;
procedure But31C(Sender: TObject) of object;
const
  Btt_Pr:array [0..5] of ProcedureClick=(@But19C, @But21C, @But31C, @But23C, @But22C, @But15C);
Вот только не уверен, что компилятор позволит вам это сделать с процедурами of object. Без этого должен создать массив как положено. Вместо нее возможно указать тип вызова safecall
macomics вне форума Ответить с цитированием
Старый 04.10.2022, 21:10   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Скоро придётся заводить новый подраздел "Kronos913" спрашивает
Зачем такие <censored> - разве нельзя сделать case с ветвлением по индексу кнопки в массиве?

Последний раз редактировалось digitalis; 05.10.2022 в 11:22.
digitalis вне форума Ответить с цитированием
Старый 04.10.2022, 22:03   #6
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Интересно каким образом вы дошли до того что вам нужен именно массив процедур?
В нормальной ситуации, я-бы взял ActionList заранее создал с десяток Action-ов, или сколько там у вас кнопок? Каждому Action свой OnExecute, Caption, индекс иконки (если нужны) и тп. Потом при создании кнопок просто назначил нужный action и не нужно никаких массивов прцедур и прочих извращений. Это кстати облегчило бы создание главного и контекстного меню.
А если хочется всё-же извращений, то можно тупо создать одну процедуру, которую будете присваивать каждой кнопке, в которой определять имя нажатой кнопки и выполнять что нужно:
Код:
procedure TForm1.ButtonClick(Sender: TObject);
begin
  if Sender is TButton then else Exit;
  case IndexStr(TButton(Sender).Name, buttonnames) of
    0: begin //buttonnames[0] = 'Button1'
      ShowMessage('Button1 pressed!');
    end;
    1: begin
      ShowMessage(TButton(Sender).Name+' pressed!');
    end;
//  ...
    6: begin
       ShowMessage(TButton(Sender).Name+' pressed!');
    end;
  end;
end;
Где buttonnames это переменная или константа, массив строк где хранятся имена ваших кнопок. Может быть как динамическим, так и статическим.
Но лучше всё-же использовать ActionList.
Цитата:
Сообщение от macomics Посмотреть сообщение
Btt_Pr:array [0..5] of ProcedureClick=(@But19C, @But21C, @But31C, @But23C, @But22C, @But15C);
Это не будет работать. В этом контексте объекта не существует, а TNotifyEvent это (Sender: TObject) of object, то-бишь процедура должна принадлежать объекту. Было бы просто procedure (Sender: TObject), то туда хоть анонимные процедуры пихай.
DIONISKA вне форума Ответить с цитированием
Старый 05.10.2022, 09:14   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
большое количество кнопок заданы массивом array [a..b] of TButton
и это константный массив?
или же есть КОД по его наполнению?
почему нельзя в данный код добавить код задания реакции OnClick?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать массив с помощью процедур и функций You-Lol Паскаль, Turbo Pascal, PascalABC.NET 1 22.11.2014 19:29
Массив процедур или идеи получше? Alex Cones Общие вопросы Delphi 13 14.07.2010 22:11
Динамический массив процедур ZaRDaK Общие вопросы Delphi 14 11.07.2010 15:47
Массив процедур - как? boris-blade Microsoft Office Word 1 21.02.2010 23:13
Массив процедур garik Общие вопросы Delphi 0 18.03.2009 21:08