Delphi-PRAXiS
Seite 1 von 2  1 2      

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 Event: Form über Schließen-Kreuz beenden (https://www.delphipraxis.net/100593-event-form-ueber-schliessen-kreuz-beenden.html)

Reinhardtinho 1. Okt 2007 08:18


Event: Form über Schließen-Kreuz beenden
 
Guten Morgen,

Gibt es ein Event, dass nur ausgelöst wird, wenn ich das Fenster über das "Schließen-Kreuz" beenden will?

Oder kann ich im OnCloseQuery abfragen, ob das Kreuz gedrückt wurde?

Vielen Dank und freundliche Grüße
Lorenz

Jens Schumann 1. Okt 2007 09:04

Re: Event: Form über Schließen-Kreuz beenden
 
Hallo,
der Source zeigt Dir wie das Drücken eines der drei Formbuttons abfangen kannst.
Evt hilft Dir das weiter.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
    FOldWndProc : TWndMethod;
    procedure MyWndProc(var Msg: TMessage);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  CanClose:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldWndProc := Self.WindowProc; // alte Fensterproceure merken
  Self.WindowProc:= MyWndProc; // Fensterproceure auf eigene Fensterprocedure umbiegen

end;

procedure TForm1.MyWndProc(var Msg: TMessage);
begin
  If Msg.Msg = WM_NCLBUTTONDOWN then
    begin
    FOldWndProc(Msg);
    end
      else FOldWndProc(Msg); // alte Fensterproceure aufrufen
end;

end.

negaH 1. Okt 2007 09:15

Re: Event: Form über Schließen-Kreuz beenden
 
wm_SysCommand Message müsste das können, schau mal in der Hilfe bei der Kodierung des wParam's nach.

Gruß Hagen

Reinhardtinho 1. Okt 2007 10:19

Re: Event: Form über Schließen-Kreuz beenden
 
Hi,

ich danke euch beiden erst mal für die Tipps.

Allerdings habe ich noch weitere Fragen:

@Jens Schumann:

Was wird hier gemacht, im If und im Else-Fall wird doch der gleiche Code aufgerufen. Was passiert da genau?

Zitat:

Zitat von Jens Schumann
Delphi-Quellcode:
procedure TForm1.MyWndProc(var Msg: TMessage);
begin
  If Msg.Msg = WM_NCLBUTTONDOWN then
    begin
    FOldWndProc(Msg);
    end
      else FOldWndProc(Msg); // alte Fensterproceure aufrufen
end;

@negaH

Zitat:

Zitat von negaH
wm_SysCommand Message müsste das können, schau mal in der Hilfe bei der Kodierung des wParam's nach.

Ich habe wParam in der Hilfe nicht gefunden :stupid:, kann ich die Message auf wm_SysCommand überprüfen oder wie meintest du das? Ist wm_SysCommand das Schließen-Kreuz?


Vielen Dank und mit freundlichen Grüßen
Lorenz

Luckie 1. Okt 2007 10:40

Re: Event: Form über Schließen-Kreuz beenden
 
Warum das Umbiegen der fensterprozedur? Die Ereignisse OnClose und OnCloseQuery werden imnmer ausgelöst.

Progman 1. Okt 2007 10:44

Re: Event: Form über Schließen-Kreuz beenden
 
Und für Minimieren/Maximieren gibt es die ApplicationEvents OnMinimize und OnMaximize (soviel ich weiß, kanns nur grad nicht probieren)

Reinhardtinho 1. Okt 2007 10:54

Re: Event: Form über Schließen-Kreuz beenden
 
Das Ereignis wird doch auch ausgelöst, wenn ich Close aufrufe oder man Alt-F4 drückt. Ich muss aber den Fall abfangen, wenn man das Form über das Kreuz schließt.

OregonGhost 1. Okt 2007 11:01

Re: Event: Form über Schließen-Kreuz beenden
 
Darf ich interessehalber fragen, warum du das Schließen per X anders behandeln musst als das Schließen per Alt-F4? In vielen Fällen liegt in so einer Situation ein Design-Fehler vor.

Edit: Beispiel aus der Interface Hall of Shame

s-off 1. Okt 2007 11:54

Re: Event: Form über Schließen-Kreuz beenden
 
Du kannst auch in der WM_NCHITTEST auf HTCLOSE prüfen.
Damit hättest Du schonmal das Event, sobald sich der Mauszeiger über dem Close-Button befindet.

Wenn Du dann noch den Status der linken Maustaste mit GetKeyState prüfst, sollte das eigentlich funktionieren.

Reinhardtinho 1. Okt 2007 12:12

Re: Event: Form über Schließen-Kreuz beenden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

Zitat:

Zitat von OregonGhost
Darf ich interessehalber fragen, warum du das Schließen per X anders behandeln musst als das Schließen per Alt-F4? In vielen Fällen liegt in so einer Situation ein Design-Fehler vor.

Also in meinem Fall sollte Alt-F4 und das Schließen per X das selbe sein, ich wollte oben nur allgemein andeuten, dass es ja verschiedene Wege gibt, ein Form zu schließen. :wink:



Ich hänge mal ein Screenshot von meiner Form an, vielleicht wird es dann etwas deutlicher.

Der Benutzer kann den Vorgang abbrechen, wenn er auf Abbrechen klickt oder auf das Kreuz, will ernich abbrechen, so soll die Form normal geschlossen werden, wenn eine bestimmte Prozedur bearbeitet wurde (dort rufe ich einfach nur Close auf).

Beim Abbruch kommt noch eine Abfrage, ob der Benutzer wirklich abbrechen will, das heißt, wenn er Nein sagt, geht der Vorgang normal weiter.


MFG
Lorenz


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:03 Uhr.
Seite 1 von 2  1 2      

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