![]() |
Ist Programm minimiert / in der Taskleiste?
Die Frage hört sich etwas simpel an. Ich möchte herausfinden, ob mein Programm minimiert ist. Wenn es das beim Beenden ist, möchte ich das in einer INI speichern und beim nächsten Mal minimiert starten. Bei folgendem Code wird nie angezeigt, wenn ich auf die "Minimieren"-Schaltfläche in der Titelleiste klicke:
Delphi-Quellcode:
Ein maximierter Zustand wird angezeigt. Den minimierten Zustand bekomme ich erst, wenn ich einen Button mit der folgenden Funktion versehe:
procedure TForm1.Timer1Timer(Sender: TObject);
var State: String; begin case Form1.WindowState of wsMinimized: State := '*** minimized ***'; wsNormal: State := 'normal'; wsMaximized: State := 'maximized'; else State := '*** dunno ***'; end; if IsIconic(Form1.Handle) then State := State + ', *** is iconic ***' else State := State + ', not iconic'; if IsZoomed(Form1.Handle) then State := State + ', is zoomed' else State := State + ', not zoomed'; ListBox1.Items.Add(State); ListBox1.ItemIndex := ListBox1.Items.Count - 1; end;
Delphi-Quellcode:
Dann allerdings ist das Fenster nicht in der Taskleiste, sondern auf Titelleisten-Größe geschrumpft über der Taskleiste.
procedure TForm1.Button2Click(Sender: TObject);
begin WindowState := wsMinimized; end; Muss ich jetzt auf die Messages, die den Zustand des Fensters verändern reagieren und eine eigene Variable dafür verwenden? |
Re: Ist Programm minimiert / in der Taskleiste?
Also ich würde das ganze nicht ganz so kompliziert machen. Zum Merken (beim Beenden) kannst Du die Funktion
![]() ![]() |
Re: Ist Programm minimiert / in der Taskleiste?
Oder einfach
![]() |
Re: Ist Programm minimiert / in der Taskleiste?
Zitat:
Bringt aber auch nix. Erscheint mir sehr merkwürdig, dass diese Funktionen anscheinend über keine Daseinsberechtigung (mehr?) haben. |
Re: Ist Programm minimiert / in der Taskleiste?
Bump.
Also sind WindowState und IsIconic unbrauchbar? Wundert mich sehr. |
Re: Ist Programm minimiert / in der Taskleiste?
Zitat:
Delphi-Quellcode:
private
myWindowState: TWindowState; procedure OnMinimize(Sender: TObject); procedure OnRestore(Sender: TObject); public { Public-Deklarationen } end; var DemoForm: TDemoForm; implementation {$R *.dfm} uses IniFiles; procedure TDemoForm.FormCreate(Sender: TObject); var ini: TIniFile; begin Application.OnMinimize := OnMinimize; Application.OnRestore := OnRestore; ini := TIniFile.Create('c:\test.ini'); try myWindowState := TWindowState(ini.ReadInteger('system', 'windowstate', 0)); finally ini.Free; end; self.WindowState := myWindowState; end; procedure TDemoForm.FormDestroy(Sender: TObject); var ini: TIniFile; begin ini := TIniFile.Create('c:\test.ini'); try ini.WriteInteger('system', 'windowstate', Ord(myWindowState)); finally ini.Free; end; end; procedure TDemoForm.OnMinimize(Sender: TObject); begin myWindowState := wsMinimized; end; procedure TDemoForm.OnRestore(Sender: TObject); begin myWindowState := wsNormal; end; |
Re: Ist Programm minimiert / in der Taskleiste?
Zitat:
|
Re: Ist Programm minimiert / in der Taskleiste?
Und noch eine komplizierte Lösung (welchen nicht nur den minimiert oder maximiert Status speichert)
Delphi-Quellcode:
unit Unit2;
interface uses Forms, IniFiles, Windows, Classes; type Bytes = array of byte; procedure SaveWindowPlacement(pvForm: TForm; pvIniFile: String); procedure RestoreWindowPlacement(pvForm: TForm; pvIniFile: String); implementation procedure SaveWindowPlacement(pvForm: TForm; pvIniFile: String); var lvIniFile: TIniFile; lvWindowPlacement: Bytes; function WindowPlacementToStr(pvWindowPlacement: Bytes):String; var lvSize: Byte; begin lvSize := SizeOf(TWindowPlacement); SetLength(Result,lvSize*2); BinToHex(@pvWindowPlacement[0],@Result[1],lvSize); end; begin if pvForm = nil then Exit; if Length(pvIniFile)=0 then Exit; lvIniFile := TIniFile.Create(pvIniFile); SetLength(lvWindowPlacement,SizeOf(TWindowPlacement)); TWindowPlacement((@lvWindowPlacement[0])^).length:=SizeOf(TWindowPlacement); if Windows.GetWindowPlacement(pvForm.Handle, @lvWindowPlacement[0]) then begin lvIniFile.WriteString(pvForm.Name,'WindowPlacement',WindowPlacementToStr(lvWindowPlacement)); end; lvIniFile.Free; end; procedure RestoreWindowPlacement(pvForm: TForm; pvIniFile: String); var lvIniFile: TIniFile; lvWindowPlacement: Bytes; function StrToWindowPlacement(pvWindowPlacement: String): Bytes; var lvSize: Byte; begin lvSize := SizeOf(TWindowPlacement); if length(pvWindowPlacement)<>(lvSize*2) then Result := nil; SetLength(Result,lvSize); HexToBin(@pvWindowPlacement[1],@Result[0],lvSize); end; begin if pvForm = nil then Exit; if Length(pvIniFile)=0 then Exit; lvIniFile := TIniFile.Create(pvIniFile); if lvIniFile.ValueExists(pvForm.Name,'WindowPlacement') then begin lvWindowPlacement := StrToWindowPlacement(lvIniFile.ReadString(pvForm.Name,'WindowPlacement','')); if lvWindowPlacement <> nil then Windows.SetWindowPlacement(pvForm.Handle,@lvWindowPlacement[0]); end; end; end. |
Re: Ist Programm minimiert / in der Taskleiste?
Zitat:
Danke auch an Heffalump und Sharky für die ausführlichen Quelltexte. Im Moment brauch ichs nicht, aber ist ja schön wenn man sowas noch 'im Schreibtisch' hat. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz