Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

FormPparent feature, Patch to KOL   Найти похожие ветки 

 
L505   (2006-06-13 06:21) [0]

In a NON-MDI application, when a form"s parent is changed, the behaviour of KOL is not like VCL. The form"s Left and Top properties are broken.

The patch which I have found works (some testing done) is as follows to KOL.PAS in order to get form positioning working when a form has a parent:
function TControl.GetBoundsRect: TRect;
var W: PControl;
   P: TPoint;
begin
  Result := fBoundsRect;
  if fHandle <> 0 then
  begin
     GetWindowRect( fHandle, Result );
//      if fIsControl or fIsMDIChild then  //bug here, comment out
//      begin
       W := fParent; // WindowedParent;
       if W <> nil then
       begin
         P.x := 0; P.y := 0;
         P := W.Client2Screen( P );
         OffsetRect( Result, -P.x, -P.y );
       end;
//      end;
     fBoundsRect := Result;
  end;
end;

I don"t always wish to use an "MDI" application myself when setting a form"s parent. Setting the form"s parent is powerful for plug in systems and just in cases where you do not need an MDI application..


 
ECM ©   (2006-06-13 13:42) [1]

Тут всё не так просто... хотя с закоментированными строками обычные проекты работают нормально (вроде... надо тестировать). Но вот, что я думаю по этому поводу.Если есть необходимость устанавливать Parent для формы, то тут есть два разных случая:
1) Parent и наше окно находятся в одном проекте - тогда это исправление будет работать корректно. Но в данном случае гораздо эффективнее вместо формы использовать просто Panel (Создавать форму вызовом NewPanel). Для MCK - отличное решение это TKOLFrame. И в этом случае исправлять ничего не надо - оно и так будет работать (С исправлением будет работать если форму создавать через NewForm, хотя если и комментировать то наверное только fIsControl)
2) Parent и наше окно находятся в разных проектах (например наше окно находится в Dll и его надо отобразить внутри окна основного модуля). В этом случае расчитывать на то что Parent тоже написан  на KOL (на той же версии KOL, с теми же опциями компилятора и т.д.) крайне опастно.
И смену Form.Parent производить каким-либо присваиванием - опять же черевато непредсказуемыми падениями в дальнейшем. В этом случае имеет смысл выполнить следующее:

  Form.Parent := nil; // Чтобы сбросить поле fParent
  Windows.SetParent(Form.Handle, ParentHWND);


В этом случае GetBoundsRect действительно будет выдавать ошибочные(?)
данные соответсвующие абсолбтному положению окна. Чтобы получить координаты относительно Parent-окна можно внести следующие исправления:

function TControl.GetBoundsRect: TRect;
var W: PControl;
   P: TPoint;
   H: THandle;
   R: TRect;
begin
  Result := fBoundsRect;
  if fHandle <> 0 then
  begin
     GetWindowRect( fHandle, Result );
     if fIsControl or fIsMDIChild then
     begin
       W := fParent; // WindowedParent;
       if W <> nil then
       begin
         P.x := 0; P.y := 0;
         P := W.Client2Screen( P );
         OffsetRect( Result, -P.x, -P.y );
       end;
     end else begin
       H := GetWindowLong(fHandle,GWL_HWNDPARENT);
       if H <> 0 then begin
         GetWindowRect(H,R);
         OffsetRect(Result, -R.Left,-R.Top);
       end;
     end;
     fBoundsRect := Result;
  end;
end;



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.04 c
1-1168507230
alex_***
2007-01-11 12:20
2007.03.04
фильтрация в DBGridEh через STFilter - работает неадекватно


2-1171375484
newbie2
2007-02-13 17:04
2007.03.04
Как избежать затирание обработки события в своем контроле?


15-1170952605
Riply
2007-02-08 19:36
2007.03.04
Утилиты для проверки диска.


1-1167498291
Piroxyline
2006-12-30 20:04
2007.03.04
Object Manager


3-1165068946
Armot
2006-12-02 17:15
2007.03.04
Информационные базы докуметнов