AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Wie das Blockieren beim Herunterfahren verhindern/umgehen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie das Blockieren beim Herunterfahren verhindern/umgehen?

Ein Thema von Schucki · begonnen am 16. Nov 2009 · letzter Beitrag vom 27. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
Schucki

Registriert seit: 17. Jul 2004
158 Beiträge
 
Delphi 2010 Architect
 
#1

Wie das Blockieren beim Herunterfahren verhindern/umgehen?

  Alt 16. Nov 2009, 12:01
Hallo DP'ler!

ich habe folgenes Problem und finde die Lösung nicht. Vielleicht kann mirhier einer helfen der das vlt. schon gelöst hat.
Meine Anwendung läst sich nicht durch die Aktion "Windos gerunterfahren" schließen. Warum weiß ich derzeit noch nicht.

Wichtig ist, das ich beim Beenden noch einie Aktionen ausführen muß!
Mein Quelltext dazu sieht wie folgt aus:

Delphi-Quellcode:
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if mbtnCon.Down then begin
    if (not bolMainCanClose) and (not timClose.Enabled) then begin
      mbtnCon.Click;
      intCanClose:=0;
      timClose.Enabled:=True;
    end;
    CanClose:=False;
  end;
  frmSetup.SaveSetupExit;
end;
Wenn das Programm hier gefragt wird ob es geschlossen werden darf dann wird der Timer aktiviert weil noch Handlungen vor dem Schließen ausgeführt werden müssen. Der Timer ruft nach Ende nochmal neu das frmMain.Close auf und da bolMainCanClose dann true ist, geht die Anwendung auch zu. Allerdings klappt das nicht wenn man START BEENDEN HERUNTERFAHREN macht.



Hat jemand einen Tip für mich?

Gruß Frank
Frank
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#2

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 16. Nov 2009, 12:51
ja, lies mal unter msdn und hier
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 16. Nov 2009, 13:39
Hallo Frank,

warum arbeitest Du nicht mit WM_QUIT / Application.Terminated

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#4

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 16. Nov 2009, 19:28
Zitat von p80286:
Hallo Frank,

warum arbeitest Du nicht mit WM_QUIT / Application.Terminated

Gruß
K-H
Es geht ihm hier um das Verhalten beim Beenden, sprich die Bearbeitugn von WM_ENDSESSION und WM_QUERYENDSESSION.
  Mit Zitat antworten Zitat
Schucki

Registriert seit: 17. Jul 2004
158 Beiträge
 
Delphi 2010 Architect
 
#5

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 17. Nov 2009, 12:25
Danke für die Hinweise,
ich habe es nur überflogen. Muß mir das nun mal viel genauer ansehen aber im Prinzip muß es das sein denn das normale "OnCloseQuery" macht's ja nicht. Das geht nur solange ich es per HAnd beende einwandfrei. Soll der PC heruntergefahren werden, dann soll das auch funktionieren... das tut's ja im Moment nicht

Also selber die MSG abfangen und abarbeiten, dann wenn es fertig ist erneut sdiese MSG des herunterfahrens verschicken?


Gruß Frank
Frank
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 17. Nov 2009, 12:36
Hast schonmal CanClose auf true gesetzt?

Wird nur der Code nicht ausgeführt, oder wird das Programm und damit WIndows nicht beendet?
Welches Windows verwendest du und wie äussert sich das, dass es nicht funktioniert?
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Schucki

Registriert seit: 17. Jul 2004
158 Beiträge
 
Delphi 2010 Architect
 
#7

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 18. Nov 2009, 01:15
Hi,

Zitat von Angel4585:
Hast schonmal CanClose auf true gesetzt?
Habe es mal wie folgt erweitert...

Delphi-Quellcode:
procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if mbtnCon.Down then begin
    if (not bolMainCanClose) and (not timClose.Enabled) then begin
      mbtnCon.Click;
      intCanClose:=0;
      timClose.Enabled:=True;
    end;
    CanClose:=False;
    Exit;
  end;
  frmSetup.SaveSetupExit;
  CanClose:=True;
end;
Ergebniss ist leider das selbe...

Zitat von Angel4585:
Welches Windows verwendest du und wie äussert sich das, dass es nicht funktioniert?
Windows XP SP3
Es funktioniert solange ich die Anwendung von Hand beende, drück ich im Windows auf herunterfahren geht zwar meine Anwendung zu aber der PC fährt nicht runter.

Dank im Voraus!
Gruß Frank
Frank
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#8

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 19. Nov 2009, 21:02
Zitat von Schucki:
Also selber die MSG abfangen und abarbeiten, dann wenn es fertig ist erneut sdiese MSG des herunterfahrens verschicken?
Delphi-Quellcode:
unit Unit1;

interface

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

const
  WM_DENYSHUTDOWN = WM_USER + $AB;

type
  TForm1 = class(TForm)
    procedure FormDenyShutdown(var msg: TMsg); message WM_DENYSHUTDOWN;
  protected
    procedure WndProc(var Message: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WndProc(var Message: TMessage);
const
  LONGBOOL_FALSE : Cardinal = 0;
  LONGBOOL_TRUE : Cardinal = 1;
begin
  if (Message.Msg <> WM_QUERYENDSESSION) then
    begin
      inherited WndProc(Message)
    end
  else
    begin
      SendMessage(Form1.Handle,WM_DENYSHUTDOWN,0,0);
      Message.Result := LONGBOOL_FALSE;
    end;
end;

procedure TForm1.FormDenyShutdown(var msg: TMsg);
begin
  Application.MessageBox(
          'We can''t stop here. This is bat country!',
          'Cannot stop here',
          MB_ICONWARNING or MB_OK);
end;

end.

Komplizierter wirds nicht Ich würde aber nicht mehr mit timern arbeiten, weil ich dir an der Stelle nicht garantieren kann, dass zum Zeitpunkt des Runterfahrens (dein Programm wird ja nicht als erstes gefragt) alles noch so abgearbeitet wird und einem timing folgt, wie du dir das vorstellst. Um als erster benachrichtigt zu werden, ob die Arbeitsstation heruntergefahen wird, musst du die Funktionalität in eine .dll packen und mit dem Modulhandle einen globalen message hook einrichten (keine gute Praxis ...). Wenn du das wirklich machen willst, kannst du hier einen Überblick über die Vorgehensweise bekommen.


Edit: dass einem aber auch immer erst danach noch was einfällt...
Edit: nach Hinweis unten modifiziert
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#9

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 19. Nov 2009, 21:10
@helgew: so geht es "leider" nicht.

Windows gibt jedem Programm eine gewisse Zeit (ein paar Sekunden), um diese Nachricht zu beantworten.
Wenn das Programm da nicht antwortet/reagiert, dann wird es "oftmals" einfach abgeschossen.
(jenachdem, die Windows eingestellt ist und bei mir ist "schnelles Herrunterfahren" aktivert)

Also mußt du erstmal das runterfahren abbrechen (also die Nachricht fertig verarbeiten)
und dann erst die MessageBox anzeigen (z.B. dir selber eine Message schicken, welche dann die MessageBox anzeigt)


PS: WM_QUERYENDSESSION fragt erstmal alle Programme, ob sie was dageben haben.
Hier wird noch nicht runtergefahren, also ist die Reihenfolge egal, in welcher die Programme gefragt werden.
WM_ENDSESSION sagt dann erst "So, beende dich mal ... ich fahre gleich/jetzt runter".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
helgew

Registriert seit: 30. Jul 2008
125 Beiträge
 
#10

Re: Wie das Blockieren beim Herunterfahren verhindern/umgehe

  Alt 19. Nov 2009, 21:14
himitsu:

es geht bedingt. Ich habe es hier selbst ausprobiert, bevor ich es reingestellt hab und bis auf den Schönheitsfehler, dass nach einer Zeit die "Programm reagiert nicht" Benachrichtigung kommt. Aber selbst Windowsprogramme machen es nicht besser, bei notepad beobachtet man das gleiche Verhalten (ok... schlechte Legitimation...). Allerdings ist der Einwand berechtigt. Mir ging es aber im Moment nur darum, die Frage nach der default window procedure zu beanworten. ich trage es nach...

Edit: Änderungen siehe oben

ps. ich rate aber davon ab, nachträglich den Rechner herunterzufahren, denn es ist der WM_QUERYENDSESSION message nicht zu entnehmen, welcher Modus gewählt wurde. Der Nutzer soll also nachträglich noch einmal auf Start>Computer ausschalten und sich dann für Neustart, Herunterfahren (oder Ruhezustand, wenn das auch dazugehört) entscheiden können.
  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 19:13 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