![]() |
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; |
Re: Anwendung todsicher beenden, aber wie??
Hier muss man halt selber Hand anlegen, wenn die IDE meint, das Projektfile anpassen zu müssen.
Aber das passiert ja glücklicherweise nicht so regelmässig... |
Re: Anwendung todsicher beenden, aber wie??
Wenn man einen anderen Speichermanager verwendet oder viele Formulare erstellen muss, wird man eh nicht drum herum kommen, die Projektdatei zu bearbeiten. :stupid:
|
Re: Anwendung todsicher beenden, aber wie??
so, ich klink mich jetzt wieder ins Gespräch mit ein. Zuerst muss ich sagen: die Anzahl der Antworten überrascht mich positiv.
ich hab jetzt die Idee mit der Abfrage in der Hauptprojektdatei übernommen. Allerdings taucht noch ein nicht so kleiner Fehler auf. Woher der kommt, kann ich noch nicht sagen. Die erste vermutung, in der der Fehler vom BassPlayerEx produziert wurde, hat sich nicht bestätigt. Im Debugger tritt der Fehler auf, nachdem der letzte GDI+RoundButton aus dem Speicher genommen wurde, was ich ziemlich komisch finde. Windows-Fehlermeldung (datail):
Code:
aber mit einem eingefügten Windows.ExitProcess(0); funktionierts dann wieder
AppName: project1.exe AppVer: 0.1.0.0 ModName: project1.exe
ModVer: 0.1.0.0 Offset: 00003c4e Vielen Dank! rollstuhlfahrer |
Re: Anwendung todsicher beenden, aber wie??
Ich tippe mal darauf,das noch auf etwas zugegriffen werden soll,was schon entfernt wurde.
Ein bischen Kot könnte die Sache einfacher machen. |
Re: Anwendung todsicher beenden, aber wie??
ich hab jetzt noch was gefunden, was wesentlich humaner ist:
Delphi-Quellcode:
rollstuhlfahrer
PostQuitMessage();
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:33 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