пятница, 26 апреля 2013 г.

Проблемы с докингом в VCL


destructor TControl.Destroy;
begin
  Application.ControlDestroyed(Self);
  if (FHostDockSite <> nil) 
      and not (csDestroying in FHostDockSite.ComponentState) // - это я добавил
  then
  begin
    FHostDockSite.Perform(CM_UNDOCKCLIENT, 0, Integer(Self));
    SetParent(nil);
    Dock(NullDockSite, BoundsRect);
    FHostDockSite := nil;
  end else
    SetParent(nil);
...
end;

Без этого падало на Delphi 7 и продолжает падать на Delphi XE3. Если просто сделать конструкцию из нескольких панелей и вдоченных форм. А потом попытаться одну из вдоченных форм убить. Честными средствами.

Это тоже был долгий разбор лет 10-ть назад. Примеры повторения - есть. Но рафинированный - пока не выделил.

Но опять же - никакого "хоккея" - там не было. Просто чистое использование VCL.

2 комментария:

  1. Что интересно, в Delphi 2007 это исправлено, а в XE5 - нет. Т.е. получается, что где-то между Delphi 7 и 2007 они это исправили, а между 2007 и XE3 (с Ваших слов) потеряли, и даже до XE5 "не нашли". К сожалению, всех исходников нет, поэтому установить точную версию, когда они это поправили и убрали не могу, но факт остается фактом.

    ОтветитьУдалить