![]() |
Anwendung todsicher beenden, aber wie??
HI,
ich hab mir ein Programm gebaut, das regestriert werden muss. Die Regestrierungsform wird mit .ShowModal aufgerufen und das Modalresult wird auch ausgewertet. Wie schaffe ich es jetzt, dass ich die Anwendung bei einem falschen Ergebnis todsicher beenden kann? Ich habs schon ergebnislos mit Halt und Application.Terminate (sowohl in der Haupt-, als auch in der Regestrierungsform) versucht. Jedes mal lief das Programm weiter, auch wenn man in der Regestrierungsform auf das X geklickt hat. :wiejetzt: Nun ich meine so sieht kein Regestrierungsschutz aus... :gruebel: Ich will auch keine Diskussion über die Sicherheitsmethoden, da ich momentan eh alles auf Debug-Gründen im Klartext in einer Datei namens config.ini speichere. rollstuhlfahrer |
Re: Anwendung todsicher beenden, aber wie??
Zeig doch mal den Aufruf des Registrierungsformulars und dessen Auswertung.
|
Re: Anwendung todsicher beenden, aber wie??
Zitat:
In jedem Formular und jedem Datenmodul in dem im Event OnCreate oder OnShow etwas passiert muss folgende Zeile rein:
Delphi-Quellcode:
Man beachte Terminate <> Terminated
procedure Tform57.FormCreate(sender);
begin if Application.Terminated then // <=== exit; // <=== // hier der ganze Rest FListe := TStringListe.Create; .... end; |
Re: Anwendung todsicher beenden, aber wie??
Keine Ahnung, ob das für Deine Zwecke ausreichend ist und mit showmodal etwas bringt,vieleichet hat auch shmia recht?
Delphi-Quellcode:
deswegen verwende ich meist normale forms mit Arbeitsbereichsbegrenzung
uses shellapi;
procedure TForm1.Button2Click(Sender: TObject); var h:hWnd; begin h := FindWindow_('Editor'); postmessage(h,WM_SYSCOMMAND,SC_CLOSE,0); end;
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Rec: TRect; begin Rec.Left := Left; Rec.Top := Top; Rec.Right := Left + Width; Rec.Bottom := Top + Height; ClipCursor(@Rec); end; procedure TForm1.Button2Click(Sender: TObject); begin // Und wieder freigeben: ClipCursor(nil); end; |
Re: Anwendung todsicher beenden, aber wie??
Todsicher beenden:
Delphi-Quellcode:
PS: Ob das ganze dann sinnvoll ist sei mal dahingestellt.
Windows.ExitProcess(0);
Die Funktion beendet zumindest die Anwendung am schnellsten ohne die internen Routinen zum Freigeben des reservierten Speichers aufzurufen. |
Re: Anwendung todsicher beenden, aber wie??
Also ich mach das meistens so:
Wenn in einer Funktion etwas unerwartetes passiert, schmeisse ich eine eigene Exception. raise MyException.Create('Ini-File "' + IniFileName +'" nicht gefunden'); Dann setzte ich einen eigenen Exception-Handler mit Application.OnException := HandleException; Die Funktion sieht dann so aus:
Delphi-Quellcode:
P.S. Das mit den Delphi-Codetags werde ich vermutlich nie kapieren...
procedure TFoMain.HandleException(Sender: TObject; E: Exception);
begin Application.MessageBox(PChar(E.Message + '.' + #10#13 + 'Anwendung wird geschlossen.'), 'Anwendungsfehler', MB_OK); Application.Terminate; end; |
Re: Anwendung todsicher beenden, aber wie??
Zitat:
|
Re: Anwendung todsicher beenden, aber wie??
In der Projektdatei:
Delphi-Quellcode:
Jetzt kommt bestimmt ein grosser Aufschrei wegen Goto.
label
Ende; begin Application.CreateForm(TPassWort, Passwort); // Wenn PWD falsch, dann wird Application.Terminate aufgerufen if Application.Terminated then goto Ende; // wir sind fertig Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); ... Application.Run; Ende: end; Aber das ist die beste Lösung! Würde man schreiben:
Delphi-Quellcode:
dann hat die IDE Probleme die Projektdatei zu ändern weil wir die Projektdatei so geändert haben,
begin
Application.CreateForm(TPassWort, Passwort); if not Application.Terminated then begin Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); ... Application.Run; End; end; dass die IDE nicht mehr weiss, wo sie die CreateForm Zeilen hintun soll. |
Re: Anwendung todsicher beenden, aber wie??
Zitat:
|
Re: Anwendung todsicher beenden, aber wie??
Zitat:
Zitat:
Delphi-Quellcode:
Hier ein Label zu verwenden ist schon ziemlich strange und lässt wie Luckie schon sagte auf schlechten Programmierstil schließen.
label
Ende; begin Application.CreateForm(TPassWort, Passwort); // Wenn PWD falsch, dann wird Application.Terminate aufgerufen if Application.Terminated then goto Ende; // wir sind fertig Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); ... Application.Run; Ende: end; Warum nicht so:
Delphi-Quellcode:
oder so:
Application.Initialize;
Application.CreateForm(TPassWort, Passwort); if (Passwort <> nil) then begin if (Passwort.Correct) then begin Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run; end; end;
Delphi-Quellcode:
begin
Application.Initialize; Application.CreateForm(TPassWort, Passwort); Application.Run; end; procedure TPassWort.Login_Correct_Click(Sender: TObject); begin if (Self.Correct) then begin Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); end else Self.Close end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz