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 Ist Programm minimiert / in der Taskleiste? (https://www.delphipraxis.net/70755-ist-programm-minimiert-der-taskleiste.html)

Alien426 4. Jun 2006 09:00


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:
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;
Ein maximierter Zustand wird angezeigt. Den minimierten Zustand bekomme ich erst, wenn ich einen Button mit der folgenden Funktion versehe:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
  WindowState := wsMinimized;
end;
Dann allerdings ist das Fenster nicht in der Taskleiste, sondern auf Titelleisten-Größe geschrumpft über der Taskleiste.

Muss ich jetzt auf die Messages, die den Zustand des Fensters verändern reagieren und eine eigene Variable dafür verwenden?

Heffalump 4. Jun 2006 09:46

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 GetWindowPlacement benutzen (Ergebnis wegspeichern -> Registry; Ini etc.) und zum Wiederherstellen (beim Start) die Funktion SetWindowPlacement (mit den gespeichertem Wert). Beim Speichern und Lesen des Wertes den gesammten Inhalt des Records (TWINDOWPLACEMENT) verwenden, nicht einzelne Werte!!!!

Luckie 4. Jun 2006 14:52

Re: Ist Programm minimiert / in der Taskleiste?
 
Oder einfach MSDN-Library durchsuchenIsIconic abfragen. ;)

Alien426 4. Jun 2006 18:09

Re: Ist Programm minimiert / in der Taskleiste?
 
Zitat:

Zitat von Luckie
Oder einfach MSDN-Library durchsuchenIsIconic abfragen. ;)

...was ich auch gemacht habe (siehe Code).

Bringt aber auch nix. Erscheint mir sehr merkwürdig, dass diese Funktionen anscheinend über keine Daseinsberechtigung (mehr?) haben.

Alien426 10. Jun 2006 01:03

Re: Ist Programm minimiert / in der Taskleiste?
 
Bump.

Also sind WindowState und IsIconic unbrauchbar? Wundert mich sehr.

Sharky 10. Jun 2006 09:44

Re: Ist Programm minimiert / in der Taskleiste?
 
Zitat:

Zitat von Heffalump
Also ich würde das ganze nicht ganz so kompliziert machen. ...

Wenn es doch "kompliziert" sein soll ;-)
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;

SirThornberry 10. Jun 2006 09:46

Re: Ist Programm minimiert / in der Taskleiste?
 
Zitat:

Zitat von Alien426
Bump.

Also sind WindowState und IsIconic unbrauchbar? Wundert mich sehr.

Du musst IsIconic auf "Application.Handle" anwenden und das "wsMinimized" bezieht sich auch auf das einzelne Form und nicht auf die Anwendung (Application)

Heffalump 10. Jun 2006 11:55

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.

Alien426 11. Jun 2006 23:18

Re: Ist Programm minimiert / in der Taskleiste?
 
Zitat:

Zitat von SirThornberry
Du musst IsIconic auf "Application.Handle" anwenden

Danke, das wars.

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