Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   C# Warum klappt Abmeldung bei laufendem Programm nicht? (https://www.delphipraxis.net/75957-warum-klappt-abmeldung-bei-laufendem-programm-nicht.html)

Khabarakh 27. Aug 2006 22:03

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
Ist bei den Argumenten ein Hinweis azuf den Schließungsgrund drin? Der z.B. aufs Herunterfahren von Windows hinweist?

Jupp. Allerdings erst unter .Net 2.0 :mrgreen: .
Wer also immer noch 1.1 benutzt, wird wohl um die Botschaftsmehtoden nicht herumkommen:
Code:
const int WM_QUERYENDSESSION = 0x11;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_QUERYENDSESSION)
        Application.Exit(); // sollte unter 1.1 noch kein (Form)Closing Event aufrufen
base.WndProc(ref m);
}

DGL-luke 27. Aug 2006 22:05

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
@Khabarakh: :lol: Genau das hab ich vermutet :)

lizardking 27. Aug 2006 22:09

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
@Daniel G / Luckie: :shock: Naja, immerhin ist C# fürs .Net-Framework gebaut. Und das ist ein Framework, sollte einem die WinAPI-Arbeit also komplett abnehmen. Dazu gehört auch das Reagieren auf Windows-Nachrichten. Wenn sich das System beendet, sollte das Framework das eben z.B. per Event ans progamm melden - indem es das im MainFormClosing angibt.

Das sollte in der Tat so sein und wird auch so sein (sonst wuerde ja jede C#-Anwendung dieses Problem haben. Kann es sein, dass Du sonst irgendwo im Programm Messages verarbeitest und da aus Versehen die entsprechenden einfach "auffrisst" ?
Sowas hatte ich naemlich auch schonmal ;-) Immer fleissig Window-Messages abgefangen und nachgeschaut, ob es die erwartete ist und wenn nicht einfach weggeworfen anstatt weiterzuleiten.

Ist nur 'ne Idee...

Gruesse,

Lizzy

Chewie 27. Aug 2006 22:20

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Bisher hab ich noch keine Messages aufgefangen, ich werd den Vorschlag von Khabarakh verwenden. Er klingt so wissend, also wirds stimmen :D

Jetzt passiert was lustiges: Das Programm wird zwar beendet, der Abmeldevorgang aber unterbrochen. Wenn ich dann ein zweites mal den Befehl zum Abmelden geb, wird er durchgeführt :shock:

Daniel G 27. Aug 2006 22:25

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von Chewie
Jetzt passiert was lustiges: Das Programm wird zwar beendet, der Abmeldevorgang aber unterbrochen. Wenn ich dann ein zweites mal den Befehl zum Abmelden geb, wird er durchgeführt :shock:

Zitat:

Return Values
If an application can terminate conveniently, it should return TRUE; otherwise, it should return FALSE.
Was gibt's du denn zurück? :stupid:

Ansonsten Versuch doch mal meinen Vorschlag und nimm' WM_ENDSESSION :wink:

DGL-luke 27. Aug 2006 22:28

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von lizardking
sonst wuerde ja jede C#-Anwendung dieses Problem haben.

Ne..... weil nicht jede
Delphi-Quellcode:
e.Cancel = false;
enthält...

Khabarakh 27. Aug 2006 22:36

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von Chewie
Jetzt passiert was lustiges: Das Programm wird zwar beendet, der Abmeldevorgang aber unterbrochen. Wenn ich dann ein zweites mal den Befehl zum Abmelden geb, wird er durchgeführt :shock:

Nett :mrgreen: . Aber mir fällt gerade auf, dass man das Programm sowieso lieber nicht in QUERYSESSION schließen sollte. Setze also stattdessen lieber ein "Shutting Down"-Flag, in Closing kannst du dann
Code:
e.Cancel = !shuttingDown;
benutzen. Sollte nun wirklich funktionieren, da es so sogar im MSDN zu finden ist ;) .

Chewie 27. Aug 2006 22:47

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Ja, das ist ne gute Idee. Probier ich morgen mal, für heute ist mein VS zu müde ;)

Danke für die Antworten. Und probiert das Programm mal aus und gebt Feedback :D

Chewie 28. Aug 2006 13:03

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
So, ich habs jetzt so gemacht, wie Khabarakh vorgeschlagen hat, mit dem Shutdown-Flag. Zu Sicherheit wird auch noch eine 1 zurückgegeben in der Fensterprozedur (auch wenn das durch den Basisaufruf ohnehin passieren sollte, aber sicher ist sicher).

Code:
const int WM_QUERYENDSESSION = 0x11;

      protected override void WndProc(ref Message m)
      {
         if (m.Msg == WM_QUERYENDSESSION) {
            m.Result = new IntPtr(1); // signal windows to proceed
            endSession = true; // set flag that closing of form shouldn't be declined
         }
         base.WndProc(ref m);
      }
So funktioniert das ganz gut :)

Danke an alle!


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

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