Приветствую вас, форумчане !
Прошу помощи в вопросе работы с классами. Длительное время я писал код, не создавая свои классы, что в итоге выливалось в кучу лишней работы. И сейчас решил наконец попробовать, провёл первые простейшие эксперименты.
Замысел такой: определить некие "мега-объекты" - в моём случае это дерево классификации, связанная с деревом таблица БД, и куча управляющих кнопок и прочих контролов. Для этих "мега-объектов" прописать логику работы, и затем создавать экземпляры класса "мега-объект", и связывать их с соответствующими контролами на форме, созданными в дизайн-тайме. Простейший эксперимент показал, что это работает. Однако далее я столкнулся с вопросом использования методов объектов, находящихся внутри класса.
Для пробы в моём классе были определены дерево и кнопка Expand/Collapse:
Код:
type
TMegaObject = class
public
uTree: TTreeView;
aExpandCollapseButton: TSpeedButton;
procedure aExpandCollapseButtonClick(Sender: TObject);
end;
.... (код обработчика aExpandCollapseButtonClick).
Затем создавались переменные - экземпляры этого класса и инициализировались их поля (или объекты внутри класса? – не знаю, как правильнее тут сказать):
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
mObj1:= TMegaObject.Create;
mObj1.uTree := tree;
mObj1.aExpandCollapseButton := SpeedButton3;
mObj1.aExpandCollapseButton.OnClick := aTree.aExpandCollapseButtonClick;
mObj2:= TMegaObject.Create;
......
end;
(контролы "дерево" и "кнопка" создавались в дизайн-тайме).
Нажатия / отжатия кнопки Expand/Collapse отрабатывались правильно, для любого количества экземпляров данного пользовательского класса.
Но вот возникла необходимость обрабатывать событие OnChange дерева uTree, объявленного в классе. Причём так, чтобы получать все параметры, которые объект TreeView передаёт в тело процедуры. Как это сделать – я не понял, и ответа в Инете нигде не нашёл.
В рамках "метода тыка" я объявил в своём классе, в секции public, процедуру с теми же параметрами, что и у OnChange стандартного TreeView:
Код:
procedure uTreeChange(Sender: TObject; Node: TTreeNode);
В реализации этой процедуры прописал просто showmessage(''); - чтобы посмотреть, вызывается ли эта процедура.
Затем в конструкторе своего класса прописал:
Код:
constructor TMegaObject.Create;
begin
inherited;
uTree.OnChange := uTreeChange;
end;
что вызвало исключение при запуске тестовой программы
Пробовал (понимая, что бредовое присвоение) в FormCreate написать:
Код:
mObj1.uTree.OnChange := mObj1.uTreeChange;
Тут уже компилятор не пропустил такую строку. А без связи процедур uTreeChange с uTree.OnChange ничего не будет происходить - объявленная процедура висит в воздухе, ни с чем не связанная. И объявить процедуру uTree.OnChange, чтобы написать для неё обработчик, тоже никак не получилось.
Уже кучу вариантов перебрал, и Self.uTree.OnChange пытался как-то прилепить – ничего не получается. Нутром чую – тут должно быть просто, но как? Что удивительно – нигде в просмотренных мною инетовских статьях этот вопрос даже не поднимается. Понимаю, что мои потуги со стороны выглядят идиотизмом, но я действительно впервые пробую работать с собственными классами. Поэтому прошу подсказки по данному вопросу.