Связать TMenuItem и объект классса
 Добавлено: 06.08.2023 20:31:00
Добавлено: 06.08.2023 20:31:00Есть некоторое множество объектов класса TData
класс описан как:
Количество объектов этого класса заранее не известно, т.е. они создаются в процессе работы приложения.
В процессе работы приложения, создаются пункты меню, и по смыслу, каждый создаваемый в рантайме пункт, связан с объектом класса TData.
Т.е. при обработке события OnClick созданного пункта меню, хотелось бы получить и связанный объект.
Пытаюсь получить его так
И естественно вместо значения Caption, получаю SIGSEGV
Подскажите, как можно связать создаваемый пункт меню и конкретный объект класса?
Или как в данном случае сделать преобразование ссылки на объект к целому и обратно ?
Например в классе TStringlist можно добавить элемент и объект TObject, т.е. связать каждый элемент и какойто объект.
Как такое можно сделать с TMenuItem ??
Добавлено спустя 21 минуту 12 секунд:
Вот елки-палки.
Ларчик просто открывался
видимо, я совсем запутался в преобразованиях
собственно решение такое
И соответственно в обработчике OnClick
Ну малоли может кому-то пригодиться такой вариант связки пункта меню и объекта
 может кому-то пригодиться такой вариант связки пункта меню и объекта
			класс описан как:
- Код: Выделить всё
- Type
 TData = class
 private
 fData: TStringList;
 fCaption:String;
 function GetThisPointer:Pointer;
 public
 constructor Create(Source:String);
 destructor Destroy; override;
 property This:Pointer read GetThisPointer;
 property Caption:String read fCaption;
 end;
 .....
 function TData.GetThisPointer;pointer;
 Begin
 result:=@Self;
 End;
Количество объектов этого класса заранее не известно, т.е. они создаются в процессе работы приложения.
В процессе работы приложения, создаются пункты меню, и по смыслу, каждый создаваемый в рантайме пункт, связан с объектом класса TData.
- Код: Выделить всё
- procedure TMainForm.FillVariableMenu(Item: TMenuItem; Src: TData);
 t:TMenuItem;
 begin
 t:=TMenuItem.Create(item);
 t.Caption:=Src.Caption;
 t.Tag:=PtrUInt(Src.This);
 t.OnClick:=@DefaultMenuItemClick;
 item.Add(t);
 end;
 end;
Т.е. при обработке события OnClick созданного пункта меню, хотелось бы получить и связанный объект.
Пытаюсь получить его так
- Код: Выделить всё
- procedure TMainForm.DefaultMenuItemClick(Sender: TObject);
 begin
 ShowMessage(TData(Pointer(TMenuItem(Sender).Tag)).Caption);
 end;
И естественно вместо значения Caption, получаю SIGSEGV
Подскажите, как можно связать создаваемый пункт меню и конкретный объект класса?
Или как в данном случае сделать преобразование ссылки на объект к целому и обратно ?
Например в классе TStringlist можно добавить элемент и объект TObject, т.е. связать каждый элемент и какойто объект.
Как такое можно сделать с TMenuItem ??
Добавлено спустя 21 минуту 12 секунд:
Вот елки-палки.
Ларчик просто открывался

видимо, я совсем запутался в преобразованиях
собственно решение такое
- Код: Выделить всё
- procedure TMainForm.FillVariableMenu(Item: TMenuItem; Src: TData);
 t:TMenuItem;
 begin
 t:=TMenuItem.Create(item);
 t.Caption:=Src.Caption;
 t.Tag:=PtrUInt(Src);
 t.OnClick:=@DefaultMenuItemClick;
 item.Add(t);
 end;
 end;
И соответственно в обработчике OnClick
- Код: Выделить всё
- procedure TMainForm.DefaultMenuItemClick(Sender: TObject);
 begin
 ShowMessage( TData( PtrUInt(TMenuItem(Sender).Tag) ).Caption);
 end;
Ну малоли
 может кому-то пригодиться такой вариант связки пункта меню и объекта
 может кому-то пригодиться такой вариант связки пункта меню и объекта