Текущий архив: 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