Отловить событие при добавлении дочерних
Модератор: Модераторы
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Отловить событие при добавлении дочерних
VirtUX, одно из первых вызывается wm_redraw с ходу могу не точно написать. Потом обработчик ее преобразует в соответствующее сообщение отрисовки нужного элемента. Здесь уже не скажу. Но все это время контрол уже существует, но не отображается.
А чем тебе не нравится манипуляция контролами? Необходимостью иметь актуальный список для сравнения?
А чем тебе не нравится манипуляция контролами? Необходимостью иметь актуальный список для сравнения?
Re: Отловить событие при добавлении дочерних
iskander писал(а):вы в пример заглядывали?
Вы же понимаете, что:
Код: Выделить всё
TForm = class(Forms.TForm, IWcObserved)
private
FOnCtrlInsert: TOnCtrlInsert;
FOnCtrlRemove: TOnCtrlRemove;
protected
procedure Loaded; override;
public
procedure InsertControl(aControl: TControl; aIndex: Integer); override;
procedure RemoveControl(AControl: TControl); override;
procedure AddHandlerInsert(aHandler: TOnCtrlInsert);
procedure AddHandlerRemove(aHandler: TOnCtrlRemove);
end;
TPanel = class(ExtCtrls.TPanel, IWcObserved)
private
FOnCtrlInsert: TOnCtrlInsert;
FOnCtrlRemove: TOnCtrlRemove;
public
procedure InsertControl(aControl: TControl; aIndex: Integer); override;
procedure RemoveControl(AControl: TControl); override;
procedure AddHandlerInsert(aHandler: TOnCtrlInsert);
procedure AddHandlerRemove(aHandler: TOnCtrlRemove);
end;
TGroupBox = class(StdCtrls.TGroupBox, IWcObserved)
private
FOnCtrlInsert: TOnCtrlInsert;
FOnCtrlRemove: TOnCtrlRemove;
public
procedure InsertControl(aControl: TControl; aIndex: Integer); override;
procedure RemoveControl(AControl: TControl); override;
procedure AddHandlerInsert(aHandler: TOnCtrlInsert);
procedure AddHandlerRemove(aHandler: TOnCtrlRemove);
end;это Вы написали похожий враппер, как и у меня?
Но я хочу избавиться от этого... Но если нет возможности, то придется так и оставить.
Вот подумываю написать рацпредложение команде Lazarus, чтобы
Код: Выделить всё
...
property OnInsertControl: TOnInsertControl read FOnInsertControl write FOnInsertControl;
property OnRemoveControl: TOnRemoveControl read FOnRemoveControl write FOnRemoveControl;
были в TForm, TFrame, Tpanel, etc по умолчанию... Но думаю - это кроме меня никому не нужно)))
Re: Отловить событие при добавлении дочерних
VirtUX писал(а):Вы написали похожий враппер
Безусловно, только он не требует установки, переопределенные контролы остаются достаточно "стандартными", чтобы с ними можно было работать в дизайнере.
В примере на форме лежат вполне стандартные контролы.
Re: Отловить событие при добавлении дочерних
iskander писал(а):он не требует установки
Гениально! Спасибо огромное! Я не сразу Вас понял, так как даже предположить не мог, что возможна схема TForm = class(Forms.TForm) при этом в uses и Forms и MyUnitWithWrapper. И как компилятор догадывается, что нужно использовать MyUnitWithWrapper.TForm, а не Forms.TForm? По принципу: что последним объявлено в uses, то и используем?
Re: Отловить событие при добавлении дочерних
Нет, тут другой механизм, если интересно погуглите на тему "шаманский метод Гео", кажется, так он назывался.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Отловить событие при добавлении дочерних
iskander писал(а):Полагаю, хелперы здесь не помогут.
Почему? Набор контролов - это обычный массив объектов. В хелпере сделать, например, сообщение при изменении его свойства Count.
Re: Отловить событие при добавлении дочерних
Снег Север писал(а):В хелпере сделать, например, сообщение при изменении его свойства Count
Например, как?
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Отловить событие при добавлении дочерних
iskander писал(а):Например, как?
Да как угодно... Хотя бы в хелпере Create для TControl сделать чтение ControlCount будущего родителя.
Re: Отловить событие при добавлении дочерних
Если у вас есть рабочее решение с хелперами, то уже не томите, выкладывайте.
Было бы очень здорово.
Было бы очень здорово.
- Снег Север
- долгожитель
- Сообщения: 3067
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Re: Отловить событие при добавлении дочерних
iskander писал(а):Если у вас есть рабочее решение с хелперами, то уже не томите, выкладывайте.
Нет, я этим не занимался. Просто теоретизирую...
Re: Отловить событие при добавлении дочерних
Собственно мой скепсис относительно пользы хелперов в данной ситуации основан вот на этом:
https://www.freepascal.org/docs-html/current/ref/refse61.html#x122-14400010.2
https://www.freepascal.org/docs-html/current/ref/refse61.html#x122-14400010.2
Re: Отловить событие при добавлении дочерних
Почитал "шаманский метод Гео" . Как прием просто изумительно! Где-нибудь обязательно использую!
Re: Отловить событие при добавлении дочерних
Лекс Айрин писал(а):iskander, видимо потому что придется делать для каждого окна свое добавление. А это сразу куча дублирующегося кода.
Значит нужно сделать один класс формы с нужным поведением, от которого наследовать все остальные. То есть наследовать их все не от TForm, а от TMyCoolForm.
Re: Отловить событие при добавлении дочерних
Код: Выделить всё
procedure TWinControl.InsertControl(AControl: TControl; Index: integer);
begin
AControl.ValidateContainer(Self);
Perform(CM_CONTROLLISTCHANGE, WParam(AControl), LParam(True));
Insert(AControl,Index);
if not (csReading in AControl.ComponentState) then
begin
AControl.Perform(CM_PARENTCOLORCHANGED, 0, 0);
AControl.Perform(CM_PARENTSHOWHINTCHANGED, 0, 0);
AControl.Perform(CM_PARENTBIDIMODECHANGED, 0, 0);
AControl.ParentFontChanged;
if AControl is TWinControl then
TWinControl(AControl).UpdateControlState
else
if HandleAllocated then
AControl.Invalidate;
//DebugLn('TWinControl.InsertControl ',Name,':',ClassName);
end;
if not (csDestroying in ComponentState) then
AControl.RequestAlign;
Perform(CM_CONTROLCHANGE, WParam(AControl), LParam(True));
//debugln(['TWinControl.InsertControl ',DbgSName(Self),' ',csDesigning in ComponentState,' ',DbgSName(AControl),' ',csDesigning in AControl.ComponentState]);
end;
а разве под линухом эти сообщения не шлются?
CM_CONTROLLISTCHANGE
CM_CONTROLCHANGE
Добавлено спустя 4 минуты 24 секунды:
тобишь на делфе я бы сделал компонент который кидаешь на форму а но подменяет ее WndProc на свою (со вложенным вызовом родной) и в ней обрабатывал эти сообщения.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Re: Отловить событие при добавлении дочерних
sts, только при использовании виджетов. Дело в том, что под линухами и прочими осями отличными от винды это все дело имитируется.
