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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2022, 19:44   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию Как объединить создание объектов в двухмерный цикл

Код:
   VF1_Bt8_PPM_Main:=TPopupMenu.Create(self);
   For i:=VF1_PPM_Zero to VF1_Bt8_PPM_Last do begin
     VF1_Bt8_PPM_01[i]:=TMenuItem.Create(self);
     VF1_Bt8_PPM_Main.Items.Add(VF1_Bt8_PPM_01[i]);
     VF1_Bt8_PPM_01[i].Caption:=VF1_Bt8_Names[i];
     VF1_Bt8_PPM_01[i].Tag:=i;
     VF1_Bt8_PPM_01[i].RadioItem:=true;
     VF1_Bt8_PPM_01[i].OnClick:=VF1_Bt8_PPM_01Click;
   End;
   VF1_Bt8_PPM_01[0].Checked:=true;

   VF1_Bt9_PPM_Main:=TPopupMenu.Create(self);
   For i:=VF1_PPM_Zero to VF1_Bt9_PPM_Last do begin
     VF1_Bt9_PPM_01[i]:=TMenuItem.Create(self);
     VF1_Bt9_PPM_Main.Items.Add(VF1_Bt9_PPM_01[i]);
     VF1_Bt9_PPM_01[i].Caption:=VF1_Bt9_Names[i];
     VF1_Bt9_PPM_01[i].Tag:=i;
     VF1_Bt9_PPM_01[i].RadioItem:=true;
     VF1_Bt9_PPM_01[i].OnClick:=VF1_Bt9_PPM_01Click;
   End;
   VF1_Bt9_PPM_01[0].Checked:=true;

   VF1_ChB2_PPM_Main:=TPopupMenu.Create(self);
   For i:=VF1_PPM_Zero to VF1_ChB2_PPM_Last do begin
     VF1_ChB2_PPM_01[i]:=TMenuItem.Create(self);
     VF1_ChB2_PPM_Main.Items.Add(VF1_ChB2_PPM_01[i]);
     VF1_ChB2_PPM_01[i].Tag:=i;
     VF1_ChB2_PPM_01[i].RadioItem:=true;
     VF1_ChB2_PPM_01[i].Caption:=VF1_ChB2_Names[i];
     VF1_ChB2_PPM_01[i].OnClick:=VF1_ChB2_PPM_01Click;
   end;
   VF1_ChB2_PPM_01[0].Checked:=true;
Суть кода вот в чем: создаются три менюшки. У всех идентичный принцип работы, но у всех разная длина массива. Код активации идентичен

Вопрос: как объединить все это в один двухмерный цикл?
Kronos913 вне форума Ответить с цитированием
Старый 30.01.2022, 19:49   #2
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Единственная идея, которая мне приходит на ум - это двухмерный массив
Но проблема в том, что там будет куча пустых ячеек тогда

Или, может быть, есть возможность сделать двухмерный массив, так чтобы в "строках" массива было разное число элементов?
Kronos913 вне форума Ответить с цитированием
Старый 31.01.2022, 09:46   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
procedure CreateSubMenu(parent: TMenuItem; listmenu: array of string; onclick: TNotifyItem);
begin
   for j:=low(listmenu) to high(listmenu) do begin
     r:=TMenuItem.create(..);
     r.caption:=listmenu[j];
     r.onClick:=onclick;
   end;
end;
Код:
item1:=TMenuItem.Create;
SubMenu(item1, ['1', '2', '3' ], self.OnClickMenu);
item2:=TMenuItem.Create;
SubMenu(item2, ['1', '6'     ], self.OnclickMenu );
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 31.01.2022, 18:06   #4
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию

Спасибо, заработало! Вот такой вот код получился:

Код:
type
  ProcedureClick=procedure(Sender: TObject) of object;
Код:
Procedure MakeMenuItem(PPM:TMenu; const Captions: array of string; Proc:ProcedureClick; RadioItems: boolean);
  var
    j:integer;
    MI:TMenuItem;
begin
    For j:=low(Captions) to high(Captions) do begin
      MI:=TMenuItem.Create(nil);
      PPM.Items.Add(MI);
      MI.Tag:=j;
      MI.Caption:=Captions[j];
      MI.RadioItem:=RadioItems;
      MI.OnClick:=Proc;
    end;
end;
PopupMenu, или верхнюю строчку MainMenu наполняет на ура
Теперь у меня еще один вопрос: как сделать так, чтобы при помощи этой же процедуры можно было наполнять под-пункты?
Kronos913 вне форума Ответить с цитированием
Старый 01.02.2022, 08:59   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

1. КАК-то усложнить передаваемый массив. (array of record).
2. Заполнять каждый из элементов меню в ещё одном цикле
3. записать иерархию меню в ресурсах программы (текстовый файл)
и создавать РЕКУРСИВНОЙ процедурой.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.02.2022 в 09:43.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ускорить создание объектов renat898 Компоненты Delphi 2 05.01.2017 13:16
C++ Как изменять значения закрытых данных переменных через функцию с открытыми данными?Правильно ли я понимаю создание объектов? Shadol Помощь студентам 4 14.02.2012 13:58
Создание и уничтожение объектов. Время жизни объектов C++/C# Anett// Помощь студентам 0 24.10.2011 23:26
Создание объектов voltageminh Общие вопросы C/C++ 7 11.05.2011 08:51
создание объектов в классе V@mpire Общие вопросы C/C++ 3 30.05.2010 21:34