Entwickler-Ecke

Sonstiges (Delphi) - Minimieren, Maximieren, Schließen


hui1991 - Di 06.06.06 10:07
Titel: Minimieren, Maximieren, Schließen
Wie kann ich testen ob eine Anwendung Minimiert, Maximiert oder geschlossen Wird.
Ich will die Anwendung nicht beim X (Schließen oben Rechts) nicht beenden sondern in den Tray ablegen. Wie kann ich das am besten machen. Muss ja nur wissen wann das ereigniss zum Schließen aufgerufen wird und das Beenden der Anwendung verhindern.

MfG
hui1991


Fighter#1 - Di 06.06.06 10:12

Also zum schließen :
Im OnCloseQuery ereignis CanClose auf False setzen (Programm kann nicht mehr beendet werden)
In OnClose halt mit den Jedis, oder was du halt hast, in den ray senden.
das andere geht glaubich über Windowstate also ob wsMinimized oder wsMaximized oder halt wsNormal


hui1991 - Di 06.06.06 10:17

WindowState hab ich schon ausprobiert.
Schon vor dem Thema schreiben.
CanClose finde ich aber nicht.
Ist bei mir irgendwie nicht vorhanden.
Wo kann ich es finden.
In Form1 ist es nicht dabei.

MfG
hui1991


Fighter#1 - Di 06.06.06 10:23

Im Auf das Formular klicken --> Im Objektinspektor den Reiter Ereignisse wählen --> Doppelklick auf das leere Feld rechts neben OnCloseQuery.

Welches Delphi benutzt du?


Gausi - Di 06.06.06 10:25

Wenn die Form minimiert wird, kann man folgendermaßen eine eigene Prozedur ausführen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
// ins OnCreate der Form:
Application.OnMinimize := MeineMiniProzedur;

procedure TForm1.MeineMiniProzedur(Sender: TObject);
begin
  showmessage('Sososo, ich soll mich also klein machen...');
end;


CanClose ist ein Var-Parameter im OnCloseQuery der Form. Setzt man sie in der Prozedur auf False, kann die Form nicht geschlossen werden. Zumindest nicht über das X. Abschießen über den Taskmanager geht selbstverständlich ;-)


azubi_20 - Di 06.06.06 10:27

CanClose setzen :


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := false;
end;


Fighter#1 - Di 06.06.06 10:32

Man kann die Form auch noch mit Application.Terminate "beenden" wenn CanClose False ist :zwinker:


hui1991 - Di 06.06.06 10:42

Blind :cry:
Hab OnCloseQuery gefunden hab dann in den Ereignissen gesucht.
Das ist ja aber in OnCloseQuery drin.
Habe Delphi 7 und hab des ja auch gefunden.
Naja Schließen tut es sich nicht und in den Tray will es auch nicht.
Ich teste dann mal rum.
Wenn was schief geht dann melde ich mich wieder.

MfG
hui1991


bms - Di 06.06.06 11:12

Hier die Lösung:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    procedure WMSYSCOMMAND(var Msg: TMessage); Message WM_SYSCOMMAND;
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.WMSYSCOMMAND(var Msg: TMessage);
var
  k: Integer;
begin
    { wParam prüfen }
    case Msg.wParam of
      { fängt das Minimieren ab }
      SC_MINIMIZE:
        begin
          //...
          //inherited;
        end;
      { fängt das Schließen ab }
      SC_CLOSE:
        begin
          //...
          //inherited;
        end;
      //Weitere Parameter
    else
      { alle anderen Fälle weiterreichen an die standard Fensterprozedur }
      inherited;
    end;
end;


Wie funktioniert das? Zuerst fängst du die Message WM_SYSCOMMAND ab und leitest sie an deine eigene Prozedur weiter. Mit Msg.wParam fragst du den Parameter ab. Ist es z. B. SC_MINIMIZE, dann wurde versucht das Fenster zu minimieren. In dem Block kannst du das programmieren was das Programm in diesem Fall machen soll. Soll es nicht minimiert werden, dann darf inherited nicht ausgeführt werden. Soll das Programm zwar vor dem Minimieren was machen, aber dann doch minimiert werden, dann zum Schluß einfach inherited ausführen. Das gleiche gilt auch für die anderen Parameter.


hui1991 - So 11.06.06 13:21

So jetzt wo ich wieder zeit gefunden habe diesen Beitrag mir durchzulesen schreibe ich mal mein ergebniss.
Der Code von bms funktioniert bei mir wunderbar.

Also Danke an alle die mir versucht haben zu helfen :D

MfG
hui1991