Связать TMenuItem и объект классса

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Связать TMenuItem и объект классса

Сообщение ssnakess » 06.08.2023 20:31:00

Есть некоторое множество объектов класса TData
класс описан как:
Код: Выделить всё
  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;


Ну малоли :) может кому-то пригодиться такой вариант связки пункта меню и объекта
ssnakess
новенький
 
Сообщения: 36
Зарегистрирован: 24.09.2011 23:08:55

Re: Связать TMenuItem и объект классса

Сообщение Sergei I. Gorelkin » 06.08.2023 20:54:01

Вот эта вся муть с GetThisPointer не нужна. TData - уже указатель на экземпляр, его достаточно привести к PtrUInt и записать в MenuItem.Tag.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1397
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Связать TMenuItem и объект классса

Сообщение ssnakess » 06.08.2023 21:02:08

Sergei I. Gorelkin писал(а):Вот эта вся муть с GetThisPointer не нужна. TData - уже указатель на экземпляр, его достаточно привести к PtrUInt и записать в MenuItem.Tag

Да да, именно так :)) яж и написал, что совсем запутался в указателях на указатель :))
Как видите, убрав эту муть - все заработало :))
ssnakess
новенький
 
Сообщения: 36
Зарегистрирован: 24.09.2011 23:08:55

Re: Связать TMenuItem и объект классса

Сообщение sts » 07.08.2023 10:20:36

а еще лучше сделать по взрослому
Код: Выделить всё
type
TDataMenuItem = class(TMenuItem)
public
  Data: TData;
end;

procedure TMainForm.FillVariableMenu(Item: TMenuItem; Src: TData);
    t:TMenuItem;
begin
    t:=TDataMenuItem.Create(item);
    t.Caption:=Src.Caption;
    t.Data:=Src;
    t.OnClick:=@DefaultMenuItemClick;
    item.Add(t);
  end;
end;

procedure TMainForm.DefaultMenuItemClick(Sender: TObject);
begin
  ShowMessage(TDataMenuItem(Sender).Data.Caption);
end;


Добавлено спустя 8 минут 16 секунд:
и никогда не использовать Tag, за него вообще бить надо разработчиков Борланд
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Связать TMenuItem и объект классса

Сообщение iskander » 07.08.2023 11:28:43

sts писал(а):за него вообще бить надо разработчиков Борланд

Иных уж нет, а те далече... (с)
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56

Рейтинг@Mail.ru