AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Win7: Problem mit Speichern von Daten in OnClose
Thema durchsuchen
Ansicht
Themen-Optionen

Win7: Problem mit Speichern von Daten in OnClose

Ein Thema von Helmi · begonnen am 5. Mär 2010 · letzter Beitrag vom 6. Mär 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#1

Win7: Problem mit Speichern von Daten in OnClose

  Alt 5. Mär 2010, 20:01
Hallo,

ich verwende folgenden Code um mitzubekommen ob Windows runter gefahren wird, um dann noch Dateien zu speichern:

Delphi-Quellcode:
{ ... }
  private
    { Private-Deklarationen }
    Windows_Session_End : Boolean;

    procedure WMQueryEndSession(var Msg: TWMQueryEndSession); message WM_QueryEndSession;
  public
    { Public-Deklarationen }
  end;
{ ... }

procedure TMainForm.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  //Windows erlauben zu beenden
  Msg.Result := 1;

  //Wenn Windows beendet wird, dann Variable auf true setzen
  Windows_Session_End := true;

  inherited;
end;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //Verbindung beenden

  //Inidatei schreiben

  //ListViews in "Monitor.xml" speichern
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //Beenden erlauben/verweigern
  CanClose := Windows_Session_End or
              (MessageDlg(Msg1, mtConfirmation, [mbYes, mbNo], 0) = mrYes);
end;
Also beim Schliessen werden im OnClose noch Dateien (Ini-Dateien, XML-Dateien) gespeichert.
Bei XP hat dies fehlerfrei funktioniert. Bei Win7 scheint es so, als würde mir Win7 den Boden unter den Füßen wegziehen und ich komm gar nicht mehr zum speichern. Jedenfalls hab ich keine gespeicherten Dateien.

Muss man für Win7 etwas spezielles beachten?
(Oder ich hab schon von vorn herein einen Fehler drin, der bei WinXP nicht auffiel)
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 5. Mär 2010, 20:12
Seit Windows Vista ist der empfohlene Weg nicht mehr "Versuchen wir mal runterzufahren, wird sich schon wer melden wenns nicht passt" sondern "wer nicht will dass runtergefahren wird, soll das bitte vorher sagen" (hab ich zumindest jetzt do im Hinterkopf ...)

http://msdn.microsoft.com/en-us/library/ms700677(VS.85).aspx
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 5. Mär 2010, 20:17
Aber wenn ich deinen Satz richtig versteh, müsst ich ja verhindern dass Win7 runterfährt. Aber ich will ja wenn Win7 den Befehl rumschickt zum Runterfahren noch Daten speichern.
Oder hab ich was falsches verstanden?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 5. Mär 2010, 20:23
Oh, da hab ich dich wohl ein bisschen falsch verstanden
In dem Link sind auch Tabellen weil ein paar Timeout verkürzt wurden - aber die Message solltest ud eigentlich immernoch bekommen und speichern können
Und wenn du einfach mal testweise den Shutdown abbrichst? Oder einfach mal so queryendsession&endsession an dein Programm schickst? Vll. kannst du so debuggen woran das liegt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#5

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 5. Mär 2010, 20:23
Hast Du den verlinkten Artikel nicht gelesen? Kleiner Auszug:
Zitat:
Applications that must block shutdown should use the new shutdown reason API

In Windows XP, Microsoft recommended that if an application needed to block shutdown, it should display its own UI explaining why it needed to do so, so users would be less frustrated when shutdown failed. As discussed earlier, Windows Vista will reduce user frustration when shutdown fails even more, by displaying new UI that lists all the reasons applications have provided for blocking shutdown.

In Windows Vista, if your application must block shutdown, in addition to returning FALSE or not responding to WM_QUERYENDSESSION, it should leverage this new UI by using a simple API to provide Windows with a reason string explaining why it is blocking shutdown. This API is straightforward:

BOOL ShutdownBlockReasonCreate(HWND hWnd, LPCWSTR pwszReason);

BOOL ShutdownBlockReasonDestroy(HWND hWnd);

BOOL ShutdownBlockReasonQuery(HWND hWnd, LPWSTR pwszBuff, DWORD *pcchBuff);

Use of this API is detailed more fully later in this topic, as well as in the MSDN documentation for the individual ShutdownBlockReason() functions.

Again, note that this API does not replace the need to return FALSE (or delay responding) to WM_QUERYENDSESSION to block shutdown. Applications need to do this in addition to using the API. Applications that return TRUE to WM_QUERYENDSESSION will be closed at shutdown, regardless of whether they have used the API.

Also note that if your application has no visible top-level windows, it must use this API if it needs to successfully block shutdown. Such applications will automatically be terminated if they block shutdown without using the API.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 5. Mär 2010, 20:31
Also wenn ich das richtig entziffere, dann muss das etwa so aussehen:

Delphi-Quellcode:
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// ShutdownBlockReasonCreate(Application.Handle, Format('%s speichert noch Dateien!', [Application.Title]));

  //Verbindung beenden

  //Inidatei schreiben

  //ListViews in "Monitor.xml" speichern

// ShutdownBlockReasonDestroy(Application.Handle);
end;
Nur steh ich gerade auf dem Schlauch: Wie kann ich die Funktionen "ShutdownBlockReasonCreate" und "ShutdownBlockReasonDestroy" von Delphi aus ansteuern?

[edit]
so - nun hab ich den Aufruf hinbekommen:
Delphi-Quellcode:
function ShutdownBlockReasonCreate(HWND: hWnd; LPCWSTR: String): Boolean; stdcall;
  external user32;
function ShutdownBlockReasonDestroy(HWND: hWnd): Boolean; stdcall;
  external user32;
Aber leider funktionierts trotzdem nicht...
Wenn ich den Eintrag bei MSDN richtig entziffere, dann müsste mit ShutDownBlockReasonCreate eine Meldung ausgeben mit dem Text den ich hinterlege, wenn meine Anwendung noch etwas braucht zum Runterfahren.
Mit ShutDownBlockReasonDestroy müsste dann meine Anwendung diese Meldung rücksetzen damit Windows normal runterfahren kann.

Aber es bleibt beim Alten - es wird nichts gespeichert und Win7 gibt keine Meldung aus
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#7

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 6. Mär 2010, 09:51
Zitat:
In Windows Vista, if your application must block shutdown, in addition to returning FALSE or not responding to WM_QUERYENDSESSION, ...
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 6. Mär 2010, 10:36
Zitat von DeddyH:
Zitat:
In Windows Vista, if your application must block shutdown, in addition to returning FALSE or not responding to WM_QUERYENDSESSION, ...
Es scheint mir als wärst du der Meister im zitieren!

Ich dachte es würde so funktionierten:

Delphi-Quellcode:
procedure TMainForm.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
  //Windows erlauben zu beenden
  Msg.Result := 0; //<-- jetzt null

  //Wenn Windows beendet wird, dann Variable auf true setzen
  Windows_Session_End := true;

  inherited;
end;
Aber das ergibt auch nicht den gewünschten Effekt.

Hätte jemand vielleicht ein Delphi-Beispiel dafür?
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#9

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 6. Mär 2010, 10:42
Und mir scheint, Du bist der Meister im Überlesen. Du musst zusätzlich zum WM_QUERYENDSESSION die ShutdownBlockReason...-Routinen benutzen. Es steht doch alles da, aber man muss sich halt durcharbeiten.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#10

Re: Win7: Problem mit Speichern von Daten in OnClose

  Alt 6. Mär 2010, 10:56
Zitat von DeddyH:
Und mir scheint, Du bist der Meister im Überlesen.
Lesen und Verstehen sind zwei paar Stiefel!
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:27 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