|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Доступ к классу-владельцу
Здравствуйте!
Не знаю, может ответ на мой вопрос уже есть, но я не нашел. Я создаю динамически графический контент. Для удобства помещаю созданные элементы в класс. Например Код:
type TCategory = class FID: integer; FName: string; FView: TRectangle; FLabel: TText; public constructor Create(AID: integer; AName: string; AOwner: TComponent); property ID: integer read FID write FID default 0; property Name: string read FName write FName; property View: TRectangle read FView write FView; end; Здесь графические элементы - FView (TRectangle) и FLabel (TText). Кроме них есть еще поля FID: integer и FName: string; Графика бесполезна без интерактива, потому создаю обработчик события FLabel.OnClick. Через обработчик передается только указатель на саму FLabel - (Sender). Как мне в этом обработчике добраться до полей FID и FName объекта, которому принадлежит FLabel? |
#2
|
|||
|
|||
При создании визуального объекта тебе надо сохранить в нем ссылку на класс, содержащий твои данные. Например, если ты используешь стандартные компоненты, то у них есть св-во Tag : Integer. Можно поступить так:
1. Создаем свой список объектов, в котором делаем метод function FindByID(AID : Integer) : TCategory - для поиска объекта по его ID. 2. При создании объекта добавляем его в этот список. 3. При создании визуального компонента в его св-ве Tag сохраняем ID объекта. 4. При клике по визуальному компоненту из св-ва Tag вытаскиваем ID и по этому ID находим нужный объект в списке и уже работаем с ним. |
#3
|
||||
|
||||
Цитата:
И выловить обратно родителя во время события: Parent := TCategory((Sender as TControl).Tag); Если я ничего не напутал Upd: Не напутал. На форме кнопка и лейбл: Код:
procedure TForm1.Button1Click(Sender: TObject); begin TLabel((Sender as TControl).Tag).Caption := 'Ta-da!'; end; procedure TForm1.FormCreate(Sender: TObject); begin Button1.Tag := Integer(Label1); end; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 01.07.2020 в 13:31. |
#4
|
|||
|
|||
Fin, на 64 бита надо смотреть... вроде работает, но как-то что-то смущает, там может все-таки всплыть разница размера указателя и инта (хотя, вроде как должно быть все ок, но лично я уже наступал на грабли, когда код на 32 бита работает, а на 64 - нет, пришлось указывать тип принудительно, то бы работало и там, и там). Именно по этому и предложил делать через доп. список, надежнее.
|
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
dr. F.I.N. (02.07.2020)
|
#5
|
||||
|
||||
Цитата:
Плюсик в карму Хотя... в D.Rio10.3 (за остальные не ручаюсь) свойство Tag имеет тип NativeInt (64bit) и тип Pointer (64bit). В D7 свойство Tag типа Integer (32bit) и Pointer (32bit). Так что работать будет, но разные типы - есть разные типы. В будущем может все поменяться. Так что - лучше перебдеть, чем недобдеть Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось dr. F.I.N., 02.07.2020 в 13:18. |