Отловить событие при добавлении дочерних

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Отловить событие при добавлении дочерних

Сообщение Лекс Айрин » 27.04.2019 13:56:14

VirtUX, одно из первых вызывается wm_redraw с ходу могу не точно написать. Потом обработчик ее преобразует в соответствующее сообщение отрисовки нужного элемента. Здесь уже не скажу. Но все это время контрол уже существует, но не отображается.
А чем тебе не нравится манипуляция контролами? Необходимостью иметь актуальный список для сравнения?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Отловить событие при добавлении дочерних

Сообщение VirtUX » 27.04.2019 14:08:29

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 по умолчанию... Но думаю - это кроме меня никому не нужно)))
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Отловить событие при добавлении дочерних

Сообщение iskander » 27.04.2019 14:14:36

VirtUX писал(а):Вы написали похожий враппер

Безусловно, только он не требует установки, переопределенные контролы остаются достаточно "стандартными", чтобы с ними можно было работать в дизайнере.
В примере на форме лежат вполне стандартные контролы.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Отловить событие при добавлении дочерних

Сообщение VirtUX » 27.04.2019 15:08:31

iskander писал(а):он не требует установки

Гениально! Спасибо огромное! Я не сразу Вас понял, так как даже предположить не мог, что возможна схема TForm = class(Forms.TForm) при этом в uses и Forms и MyUnitWithWrapper. И как компилятор догадывается, что нужно использовать MyUnitWithWrapper.TForm, а не Forms.TForm? По принципу: что последним объявлено в uses, то и используем?
Аватара пользователя
VirtUX
энтузиаст
 
Сообщения: 880
Зарегистрирован: 05.02.2008 10:52:19
Откуда: Крым, Алушта

Re: Отловить событие при добавлении дочерних

Сообщение iskander » 27.04.2019 15:12:17

Нет, тут другой механизм, если интересно погуглите на тему "шаманский метод Гео", кажется, так он назывался.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Отловить событие при добавлении дочерних

Сообщение Снег Север » 27.04.2019 15:20:43

iskander писал(а):Полагаю, хелперы здесь не помогут.

Почему? Набор контролов - это обычный массив объектов. В хелпере сделать, например, сообщение при изменении его свойства Count.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Отловить событие при добавлении дочерних

Сообщение iskander » 27.04.2019 15:30:55

Снег Север писал(а):В хелпере сделать, например, сообщение при изменении его свойства Count

Например, как?
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Отловить событие при добавлении дочерних

Сообщение Снег Север » 27.04.2019 15:59:13

iskander писал(а):Например, как?

Да как угодно... Хотя бы в хелпере Create для TControl сделать чтение ControlCount будущего родителя.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Отловить событие при добавлении дочерних

Сообщение iskander » 27.04.2019 17:06:05

Если у вас есть рабочее решение с хелперами, то уже не томите, выкладывайте.
Было бы очень здорово.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Отловить событие при добавлении дочерних

Сообщение Снег Север » 27.04.2019 17:08:48

iskander писал(а):Если у вас есть рабочее решение с хелперами, то уже не томите, выкладывайте.

Нет, я этим не занимался. Просто теоретизирую... :?
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

Re: Отловить событие при добавлении дочерних

Сообщение iskander » 27.04.2019 18:06:44

Собственно мой скепсис относительно пользы хелперов в данной ситуации основан вот на этом:
https://www.freepascal.org/docs-html/current/ref/refse61.html#x122-14400010.2
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Отловить событие при добавлении дочерних

Сообщение DedFrend » 28.04.2019 10:55:49

Почитал "шаманский метод Гео" . Как прием просто изумительно! Где-нибудь обязательно использую!
DedFrend
постоялец
 
Сообщения: 156
Зарегистрирован: 25.11.2018 12:21:50

Re: Отловить событие при добавлении дочерних

Сообщение Makhaon » 30.04.2019 12:15:17

Лекс Айрин писал(а):iskander, видимо потому что придется делать для каждого окна свое добавление. А это сразу куча дублирующегося кода.

Значит нужно сделать один класс формы с нужным поведением, от которого наследовать все остальные. То есть наследовать их все не от TForm, а от TMyCoolForm.
Makhaon
новенький
 
Сообщения: 38
Зарегистрирован: 08.08.2018 15:23:24

Re: Отловить событие при добавлении дочерних

Сообщение sts » 30.04.2019 12:31:26

Код: Выделить всё
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 на свою (со вложенным вызовом родной) и в ней обрабатывал эти сообщения.
sts
постоялец
 
Сообщения: 406
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Отловить событие при добавлении дочерних

Сообщение Лекс Айрин » 30.04.2019 12:36:46

sts, только при использовании виджетов. Дело в том, что под линухами и прочими осями отличными от винды это все дело имитируется.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

Рейтинг@Mail.ru