класс описан как:
- Код: Выделить всё
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;
Ну малоли
