Форум по Delphi программированию

 



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.06.2020, 13:34
Taras Taras вне форума
Прохожий
 
Регистрация: 28.11.2006
Сообщения: 6
Версия Delphi: Delphi 20.0
Репутация: 10
По умолчанию Доступ к классу-владельцу

Здравствуйте!
Не знаю, может ответ на мой вопрос уже есть, но я не нашел.
Я создаю динамически графический контент.
Для удобства помещаю созданные элементы в класс.
Например
Код:
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  
Старый 22.06.2020, 22:19
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,599
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

При создании визуального объекта тебе надо сохранить в нем ссылку на класс, содержащий твои данные. Например, если ты используешь стандартные компоненты, то у них есть св-во Tag : Integer. Можно поступить так:
1. Создаем свой список объектов, в котором делаем метод function FindByID(AID : Integer) : TCategory - для поиска объекта по его ID.
2. При создании объекта добавляем его в этот список.
3. При создании визуального компонента в его св-ве Tag сохраняем ID объекта.
4. При клике по визуальному компоненту из св-ва Tag вытаскиваем ID и по этому ID находим нужный объект в списке и уже работаем с ним.
Ответить с цитированием
  #3  
Старый 01.07.2020, 13:26
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 647
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от lmikle
При создании визуального объекта тебе надо сохранить в нем ссылку на класс, содержащий твои данные. Например, если ты используешь стандартные компоненты, то у них есть св-во Tag : Integer. Можно поступить так:
1. Создаем свой список объектов, в котором делаем метод function FindByID(AID : Integer) : TCategory - для поиска объекта по его ID.
2. При создании объекта добавляем его в этот список.
3. При создании визуального компонента в его св-ве Tag сохраняем ID объекта.
4. При клике по визуальному компоненту из св-ва Tag вытаскиваем ID и по этому ID находим нужный объект в списке и уже работаем с ним.
Да можно сразу в Tag хранить ссылку на родителя: SomeControl.Tag := Integer(ParentAsTCategory);
И выловить обратно родителя во время события: 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  
Старый 01.07.2020, 21:21
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,599
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Fin, на 64 бита надо смотреть... вроде работает, но как-то что-то смущает, там может все-таки всплыть разница размера указателя и инта (хотя, вроде как должно быть все ок, но лично я уже наступал на грабли, когда код на 32 бита работает, а на 64 - нет, пришлось указывать тип принудительно, то бы работало и там, и там). Именно по этому и предложил делать через доп. список, надежнее.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
dr. F.I.N. (02.07.2020)
  #5  
Старый 02.07.2020, 13:04
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 647
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от lmikle
Fin, на 64 бита надо смотреть... вроде работает, но как-то что-то смущает, там может все-таки всплыть разница размера указателя и инта (хотя, вроде как должно быть все ок, но лично я уже наступал на грабли, когда код на 32 бита работает, а на 64 - нет, пришлось указывать тип принудительно, то бы работало и там, и там). Именно по этому и предложил делать через доп. список, надежнее.
Согласен. Если Integer остался эквивалентным типом, то Pointer уже подведет на x64.
Плюсик в карму

Хотя... в D.Rio10.3 (за остальные не ручаюсь) свойство Tag имеет тип NativeInt (64bit) и тип Pointer (64bit). В D7 свойство Tag типа Integer (32bit) и Pointer (32bit). Так что работать будет, но разные типы - есть разные типы. В будущем может все поменяться. Так что - лучше перебдеть, чем недобдеть
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.

Последний раз редактировалось dr. F.I.N., 02.07.2020 в 13:18.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2020

ВКонтакте   Facebook   Twitter