AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Ist Programm minimiert / in der Taskleiste?

Ein Thema von Alien426 · begonnen am 4. Jun 2006 · letzter Beitrag vom 11. Jun 2006
Antwort Antwort
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#1

Ist Programm minimiert / in der Taskleiste?

  Alt 4. Jun 2006, 09:00
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?
  Mit Zitat antworten Zitat
Heffalump

Registriert seit: 3. Aug 2005
278 Beiträge
 
RAD-Studio 2009 Ent
 
#2

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 4. Jun 2006, 09:46
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!!!!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 4. Jun 2006, 14:52
Oder einfach MSDN-Library durchsuchenIsIconic abfragen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 4. Jun 2006, 18:09
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.
  Mit Zitat antworten Zitat
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 10. Jun 2006, 01:03
Bump.

Also sind WindowState und IsIconic unbrauchbar? Wundert mich sehr.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 10. Jun 2006, 09:44
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;
Stephan B.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 10. Jun 2006, 09:46
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Heffalump

Registriert seit: 3. Aug 2005
278 Beiträge
 
RAD-Studio 2009 Ent
 
#8

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 10. Jun 2006, 11:55
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.
  Mit Zitat antworten Zitat
Benutzerbild von Alien426
Alien426

Registriert seit: 21. Dez 2005
146 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Ist Programm minimiert / in der Taskleiste?

  Alt 11. Jun 2006, 23:18
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 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