Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Form maximiert, dennoch Breite und Höhe vom nichtmaximierten


trm - Mi 02.05.12 20:16
Titel: Form maximiert, dennoch Breite und Höhe vom nichtmaximierten
Hallihallo.

Gibt es unter Delphi 7 eine Möglichkeit die Werte für Breite und Höhe der Form im normalzustand (nicht maximiert) zu erhalten, wenn diese maximiert wurde?

(Windows speichert diese Werte ja auch irgendwo)


bummi - Mi 02.05.12 23:46


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm2.Button1Click(Sender: TObject);
var
wp:tagWINDOWPLACEMENT;
begin
  Getwindowplacement(handle,wp);
  Caption := 'Breite: ' + IntToStr(wp.rcNormalPosition.Right - wp.rcNormalPosition.Left)
             + ' - Höhe: ' + IntToStr(wp.rcNormalPosition.Bottom - wp.rcNormalPosition.Top)

end;


trm - Do 03.05.12 18:43

War nicht ganz korrekt, aber Getwindowplacement hat mir weitergeholfen, da ich es nicht kannte :)


bummi - Do 03.05.12 18:52

Verrätst Du noch was nicht korrekt war?


trm - Do 03.05.12 19:10


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function GetWindowState(Wnd: HWnd; var wp: PWINDOWPLACEMENT): Boolean;
var
  WPlacement: PWINDOWPLACEMENT;
begin
  Result := False;
  GetMem(WPlacement, SizeOf(TWINDOWPLACEMENT));
  WPlacement^.Length := SizeOf(TWINDOWPLACEMENT);
  if GetWindowPlacement(Wnd, WPlacement) then
    Result := True;
  wp := WPlacement;
  FreeMem(WPlacement);
end;


Allein die Variable war schon falsch ;)


bummi - Do 03.05.12 19:19

so sieht es unter XE aus

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function GetWindowPlacement(hWnd: HWND; WindowPlacement: PWindowPlacement): BOOL; external user32 name 'GetWindowPlacement';
function GetWindowPlacement(hWnd: HWND; var WindowPlacement: TWindowPlacement): BOOL; external user32 name 'GetWindowPlacement';

mit 

  TWindowPlacement = tagWINDOWPLACEMENT;


trm - Do 03.05.12 19:44

Hm, bei mir geht es nur mit der Variante, die ich Dir gezeigt habe (Win7, Delphi 7) :)

Danke, Du hast mir auf jeden Fall sehr geholfen.


jaenicke - Do 03.05.12 20:28

Deine Variante ist aber nicht wirklich gut, denn du reservierst dir zwar Speicher, gibst den aber wieder frei. Und zurück lieferst du nicht etwa die Daten, sondern nur einen Zeiger auf die freigegebenen Daten.
Das geht nur zufällig gut. ;-)

Die Variable kann ruhig direkt vom Typ des Records sein, bei D7 muss nur die Adresse übergeben werden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function GetWindowState(AWnd: HWND): TWindowPlacement;
begin
  Result.Length := SizeOf(TWindowPlacement);
  if not GetWindowPlacement(AWnd, @Result) then
    RaiseLastOSError;
end;


trm - Do 03.05.12 20:59

Das Problem ist, ich benötige einen Rückgabewert, ob der Funktionsaufruf geklappt hat.

Geht es auch hiermit ?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function GetWindowState(Wnd: HWnd; var wp: PWINDOWPLACEMENT): Boolean;
begin
  Result := False;
  GetMem(wp, SizeOf(TWINDOWPLACEMENT));
  wp^.Length := SizeOf(TWINDOWPLACEMENT);
  if GetWindowPlacement(Wnd, wp) then
    Result := True;
end;


Die Variable wird vorher initialisiert und auch nach Benutzung frei gegeben.


jaenicke - Do 03.05.12 21:03

Lass doch endlich die Pointerspielerei. ;-) :mrgreen:
Du übergibst einen Pointer (var-Parameter) auf einen Pointer als Parameter...

Wie wäre es so?

Delphi-Quelltext
1:
2:
3:
4:
5:
function GetWindowState(Wnd: HWnd; var wp: TWindowPlacement): Boolean;
begin
  wp.Length := SizeOf(TWindowPlacement);
  Result := GetWindowPlacement(Wnd, @wp);
end;


trm - Do 03.05.12 21:35

Hm, mit Deiner Lösung bekomme ich jedes mal einen Ausnahmefehler.

Mit meinem Konstrukt nicht.


jaenicke - Do 03.05.12 21:37

Wie benutzt du es denn? Bei mir funktioniert das. :nixweiss:


trm - Do 03.05.12 21:59


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function GetWindowState(Wnd: HWnd; var wp: TWindowPlacement): Boolean;
begin

// Hier bei dieser Zuweisung tritt der Fehler auf
  wp.Length := SizeOf(TWindowPlacement);
//
  Result := GetWindowPlacement(Wnd, @wp);
end;

//[..]

var
  wp: PWINDOWPLACEMENT;
begin
            GetMem(wp, SizeOf(TWINDOWPLACEMENT));
            if GetWindowState(WND, wp) then
            begin


Beim Zugriff auf die Größe des Records in der Funktion tritt der Fehler auf.
Ich nutze immer noch Delphi7.


Narses - Do 03.05.12 22:09

Moin!


Delphi-Quelltext
1:
2:
var
  wp: TWindowPlacement;
Und lass das GetMem weg. :idea:

cu
Narses


trm - Do 03.05.12 22:23

Ach, das war der Fehler.

Somit erklärt sich auch, warum der erste Vorschlag nicht funktioniert hat, denke ich.

Vielen Dank :)