Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fenstergröße im wsNormal-Zustand trotz wsMaximized (https://www.delphipraxis.net/52766-fenstergroesse-im-wsnormal-zustand-trotz-wsmaximized.html)

Delphi-Freak 3. Sep 2005 11:06


Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
Hi!

Ich würde gerne die Fenstergröße auslesen, die das Fenster haben würde, wenn es "wiederhergestellt" wäre, also mit WindowState = wsNormal; allerdings ist das Fenster maximiert (wsMaximized) und wenn ich auf die Eigenschaften TForm.Width bzw. TForm.Height zugreife, dann bekomme ich die Breite bzw. Höhe des maximierten Zustands heraus.
Bis jetzt habe ich es so ähnlich gemacht:
Delphi-Quellcode:
WindowState := wsNormal;
ShowMessage(IntToStr(Width) + ' x ' + IntToStr(Height)); //die Werte irgendwie auslesen - nur als Beispiel ShowMessage
WindowState := wsMaximized;
Jedoch ist dann das Problem, dass man das Fenster kleiner und wieder größer werden sieht. Ich habe auch schon probiert mit Perform bzw. SendMessage WM_SETREDRAW auf 0 und danach wieder auf 1 zu setzen, aber es bringt nicht wirklich was.
Übrigens der Sinn dahinter ist, die Größe des Fensters fürs nächste Mal abzuspeichern; allerdings möchte ich keine fertige Komponente, die das in die Registry oder in eine Ini-Datei speichert, weil ich meine Einstellungen selber in eine eigene Datei speichern möchte.

LG, Gerhard

Flocke 3. Sep 2005 11:10

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
Siehe MSDN-Library durchsuchenGetWindowPlacement

Also etwa so:
Delphi-Quellcode:
var
  wp: TWindowPlacement;
begin
  wp.length := SizeOf(TWindowPlacement);
  GetWindowPlacement(Form1.Handle, wp);
  // in wp.rcNormalPosition steht das "normale" Fensterrechteck
end;

Delphi-Freak 4. Sep 2005 16:52

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
Bitte entschuldige, dass ich erst heute antworte :roll:
Ich habe deine Antwort schon gelesen, nur ist dann folgender Fehler rausgekommen, woran ich mich zuerst selbst versucht habe, aber zu keinem Ergebnis gekommen bin; und dann bin ich nicht zum Weiterprobieren gekommen...
Inzwischen habe ich jetzt den Beschluss gefasst, dass ich nicht draufkomme und deshalb frage ich wieder: Also der Fehler
Zitat:

E2010 Inkompatible Typen: 'PWindowPlacement' und 'tagWINDOWPLACEMENT'
direkt bei dieser Zeile:
Code:
GetWindowPlacement(MainForm.Handle, [u]wp[/u]);
Ich hoffe du (ihr) könnt mir wieder weiterhelfen (*liebschau* :mrgreen: )

SirThornberry 4. Sep 2005 16:55

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
wie hast du den "wp" definiert? GetWindowPlacement erwartet einen Pointer auf TWindowPlacement
Delphi-Quellcode:
var wp: TWindowPlacement;
begin
[...]
GetWindowPlacement(MainForm.Handle, @wp);
steht im msdn und in der Hilfe so, einfal nächstes mal lesen und verstehen.

Flocke 4. Sep 2005 17:11

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
Ich wusste den Prototypen nicht mehr genau. Einfach wie SirThornberry schon geschrieben hat ein @ vor den 2. Parameter setzen.

Zitat:

Zitat von SirThornberry
steht im msdn und in der Hilfe so, einfal nächstes mal lesen und verstehen.

Normalerweise ist es aber so, dass Zeigerparameter, die nicht NULL sein dürfen, als var oder const und eben nicht als Zeiger deklariert werden. Bei der API-Funktion GetClientRect wird der zweite Parameter ja auch als var lpRect: TRect und nicht als lpRect: PRect angegeben.

SirThornberry 4. Sep 2005 17:14

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
naja, einmal "Strg + Shift + Space" nach dem Klammer auf und man sieht es. Hab da am Anfang auch nicht so hingeschaut und ewig gesucht. Alternativ zu dem "@" kann man natürlich auch gleich ein PWindowPlacement übergeben
Delphi-Quellcode:
var
  wp: PWindowPlacement;
begin
  new(wp);
  wp.length := SizeOf(TWindowPlacement);
  GetWindowPlacement(Form1.Handle, wp);
  dispose(wp);

Delphi-Freak 4. Sep 2005 17:20

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
Aaaah, der @-Operator, ich erinnere mich, bei den ShellNotifyIcons braucht man den auch. Aber was macht der eigentlich genau, habe mich das schon manchmal gefragt :gruebel:

@SirThornberry: Mit PWindowPlacement habe ich es auch probiert, aber die Zeile "new(wp);" habe ich nicht hineingegeben, weil ich diese Funktion nicht kenne, aus der Hilfe bin ich auch nicht gescheit geworden, meine Frage also, was macht diese Funktion?

Übrigens vielen Dank mal euch beiden!!! :thumb:

LG

SirThornberry 4. Sep 2005 17:25

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
das "@" gibt die Speicheradresse von der Variablen zurück. Kurz und knapp: Die funktion erwartet einen Pointer/Zeiger(auf eine Speicheradresse).
PWindowPlacement ist vom Typ Pointer (typisierter Pointer).
Allerdings ist dies eben nur ein Pointer und zeigt nur irgendwo hin, Speicher muss man also selbst reservieren und das geht mit "new". Freigegeben wird der Speicher dann mit "dispose" (es gibt noch andere Funktionen für diese Zwecke).

bei variante1 (@wp) wird also die Adresse durch das "@" geholt und
bei variante2 (wp(PWindowplacement)) ist wp bereits die Adresse/Pointer und diesen muss man noch auf speicher zeigen lassen.

Bezüglich des @ operators etc. empfehle ich die Grundlagen von http://www.delphi-source.de

falls du englisch kannst hier ein Beitrag mit Link zu einem tollen Lehrvideo zu Pointern (sollte man gesehen haben (selbst ohne Englischkenntnisse verständlich))
http://www.delphipraxis.net/internal...=357830#357830

Delphi-Freak 4. Sep 2005 18:47

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
Super danke!!! :thumb: Jetzt wird mir einiges klarer!
Bezüglich des Videos: Am Englischen happerts nicht (meines Erachtens ist Englisch sogar eine ziemlich "schöne" Sprache), momentan nur an der Zeit. Aber ich denke, ich werde noch darauf zurück kommen und mir es dann anschauen!

Also vielen Dank nochmal!!!

Flocke 4. Sep 2005 21:54

Re: Fenstergröße im wsNormal-Zustand trotz wsMaximized
 
Zitat:

Zitat von SirThornberry
naja, einmal "Strg + Shift + Space" nach dem Klammer auf und man sieht es.

So meinte meinte ich das nicht ... ich hab' halt mein Delphi nicht immer offen und es aus dem Kopf hingetippt :stupid: (und ich habe nicht immer die Geduld, nur dafür 5 Minuten zu warten bis es fertig geladen ist, um in Windows.pas eine Definition nachzuschlagen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz