summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraeme Geldenhuys <graemeg@gmail.com>2011-01-10 23:44:33 +0200
committerGraeme Geldenhuys <graeme@mastermaths.co.za>2011-01-11 09:45:29 +0200
commit9a622052b07b1605fe4cf4465404df11f0fd12da (patch)
tree91c246ed6dcebeab0ed90d3576af08f97042409e /src
parent912541f487ef8356352a452c005097623df0cf00 (diff)
downloadfpGUI-9a622052b07b1605fe4cf4465404df11f0fd12da.tar.xz
fixes Alignment and Anchor calculation even before we have a window handle
Updated the following methods by rather checking the ComponentState, than the HasHandle result. Why? Because we want alignment and anchor calculations to work, even before we have a window handle. Something that happens often when using a Frame-type design for the UI. * HandleMove() * HandleResize() * UpdateWindowPosition() Due to removing the HasHandle check in UpdateWindowPosition, we had to do the HasHandle check in each backend code instead. We don't want to trigger API calls when we don't have a window handle yet.
Diffstat (limited to 'src')
-rw-r--r--src/corelib/fpg_base.pas19
-rw-r--r--src/corelib/fpg_widget.pas6
-rw-r--r--src/corelib/gdi/fpg_gdi.pas19
-rw-r--r--src/corelib/x11/fpg_x11.pas20
4 files changed, 30 insertions, 34 deletions
diff --git a/src/corelib/fpg_base.pas b/src/corelib/fpg_base.pas
index 214744e9..2fb97580 100644
--- a/src/corelib/fpg_base.pas
+++ b/src/corelib/fpg_base.pas
@@ -1211,9 +1211,7 @@ procedure TfpgWindowBase.HandleMove(x, y: TfpgCoord);
begin
if FTop <> y then
begin
- // if we don't have a handle we are still setting up, so actual value and
- // previous value must be the same.
- if HasHandle then
+ if not (csLoading in ComponentState) then
FPrevTop := FTop
else
FPrevTop := y;
@@ -1223,9 +1221,7 @@ begin
if FLeft <> x then
begin
- // if we don't have a handle we are still setting up, so actual value and
- // previous value must be the same.
- if HasHandle then
+ if not (csLoading in ComponentState) then
FPrevLeft := FHeight
else
FPrevLeft := x;
@@ -1238,9 +1234,7 @@ procedure TfpgWindowBase.HandleResize(AWidth, AHeight: TfpgCoord);
begin
if FWidth <> AWidth then
begin
- // if we don't have a handle we are still setting up, so actual value and
- // previous value must be the same.
- if HasHandle then
+ if not (csLoading in ComponentState) then
FPrevWidth := FWidth
else
FPrevWidth := AWidth;
@@ -1250,9 +1244,7 @@ begin
if FHeight <> AHeight then
begin
- // if we don't have a handle we are still setting up, so actual value and
- // previous value must be the same.
- if HasHandle then
+ if not (csLoading in ComponentState) then
FPrevHeight := FHeight
else
FPrevHeight := AHeight;
@@ -1305,8 +1297,7 @@ end;
procedure TfpgWindowBase.UpdateWindowPosition;
begin
- if HasHandle then
- DoUpdateWindowPosition;
+ DoUpdateWindowPosition;
end;
procedure TfpgWindowBase.MoveWindow(const x: TfpgCoord; const y: TfpgCoord);
diff --git a/src/corelib/fpg_widget.pas b/src/corelib/fpg_widget.pas
index e13806be..7c728380 100644
--- a/src/corelib/fpg_widget.pas
+++ b/src/corelib/fpg_widget.pas
@@ -371,14 +371,14 @@ begin
{$IFDEF CStackDebug}
itf := DebugMethodEnter('TfpgWidget.DoUpdateWindowPosition - ' + ClassName + ' ('+Name+')');
{$ENDIF}
-// writeln('DoUpdateWindowPosition - ', Classname);
+// writeln('TfpgWidget.DoUpdateWindowPosition - ' + Classname + ' ('+Name+')');
dw := FWidth - FPrevWidth;
dh := FHeight - FPrevHeight;
if IsContainer and FSizeIsDirty then
begin
{$IFDEF CStackDebug}
- DebugLn(Format('w: %d h: %d', [dw, dh]));
+ DebugLn(Format(' Alignment deltas w: %d h: %d', [dw, dh]));
{$ENDIF}
HandleAlignments(dw, dh);
end;
@@ -1334,7 +1334,7 @@ begin
itf := DebugMethodEnter('TfpgWidget.MoveAndResize');
DebugLn(Format('Class:%s t:%d l:%d w:%d h:%d', [Classname, ATop, ALeft, AWidth, aHeight]));
{$ENDIF}
- if not (csLoading in ComponentState) {HasHandle} then
+ if not (csLoading in ComponentState) then
begin
if (ALeft <> FLeft) or (ATop <> FTop) then
HandleMove(ALeft, ATop);
diff --git a/src/corelib/gdi/fpg_gdi.pas b/src/corelib/gdi/fpg_gdi.pas
index 6d1ff0c7..9eb9f952 100644
--- a/src/corelib/gdi/fpg_gdi.pas
+++ b/src/corelib/gdi/fpg_gdi.pas
@@ -1976,14 +1976,17 @@ procedure TfpgGDIWindow.DoUpdateWindowPosition;
var
bx, by: integer;
begin
- FSkipResizeMessage := True;
- GetWindowBorderDimensions(Self, bx, by);
- Windows.SetWindowPos(
- WinHandle, HWND_TOP,
- FLeft, FTop, FWidth + bx, FHeight + by,
- SWP_NOZORDER);// or SWP_NOREDRAW);
- Windows.InvalidateRect(WinHandle, nil, True);
- FSkipResizeMessage := False;
+ if HasHandle then
+ begin
+ FSkipResizeMessage := True;
+ GetWindowBorderDimensions(Self, bx, by);
+ Windows.SetWindowPos(
+ WinHandle, HWND_TOP,
+ FLeft, FTop, FWidth + bx, FHeight + by,
+ SWP_NOZORDER);// or SWP_NOREDRAW);
+ Windows.InvalidateRect(WinHandle, nil, True);
+ FSkipResizeMessage := False;
+ end;
end;
{ TfpgGDICanvas }
diff --git a/src/corelib/x11/fpg_x11.pas b/src/corelib/x11/fpg_x11.pas
index 8ae27ec1..ab41dc6b 100644
--- a/src/corelib/x11/fpg_x11.pas
+++ b/src/corelib/x11/fpg_x11.pas
@@ -2348,17 +2348,19 @@ var
w: longword;
h: longword;
begin
- if FWidth > 1 then
- w := FWidth
- else
- w := 1;
- if FHeight > 1 then
- h := FHeight
- else
- h := 1;
+ if HasHandle then
+ begin
+ if FWidth > 1 then
+ w := FWidth
+ else
+ w := 1;
+ if FHeight > 1 then
+ h := FHeight
+ else
+ h := 1;
- if FWinHandle > 0 then
XMoveResizeWindow(xapplication.display, FWinHandle, FLeft, FTop, w, h);
+ end;
end;
procedure TfpgX11Window.DoSetMouseCursor;