Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anwendung todsicher beenden, aber wie?? (https://www.delphipraxis.net/108732-anwendung-todsicher-beenden-aber-wie.html)

rollstuhlfahrer 18. Feb 2008 16:50


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

DeddyH 18. Feb 2008 16:59

Re: Anwendung todsicher beenden, aber wie??
 
Zeig doch mal den Aufruf des Registrierungsformulars und dessen Auswertung.

shmia 18. Feb 2008 17:13

Re: Anwendung todsicher beenden, aber wie??
 
Zitat:

Zitat von rollstuhlfahrer
Ich habs schon ergebnislos mit Halt und Application.Terminate (sowohl in der Haupt-, als auch in der Regestrierungsform) versucht.

Application.Terminate ist richtig, du muss nur noch zusätzlich etwas tun:
In jedem Formular und jedem Datenmodul in dem im Event OnCreate oder OnShow etwas passiert muss folgende Zeile rein:
Delphi-Quellcode:
procedure Tform57.FormCreate(sender);
begin
  if Application.Terminated then // <===
    exit;                        // <===

  // hier der ganze Rest
  FListe := TStringListe.Create;
  ....
end;
Man beachte Terminate <> Terminated

busybyte 18. Feb 2008 17:22

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:
uses shellapi;

procedure TForm1.Button2Click(Sender: TObject);
var
  h:hWnd;
begin
  h := FindWindow_('Editor');
  postmessage(h,WM_SYSCOMMAND,SC_CLOSE,0);
end;
deswegen verwende ich meist normale forms mit Arbeitsbereichsbegrenzung

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;

bigg 18. Feb 2008 18:11

Re: Anwendung todsicher beenden, aber wie??
 
Todsicher beenden:
Delphi-Quellcode:
Windows.ExitProcess(0);
PS: Ob das ganze dann sinnvoll ist sei mal dahingestellt.
Die Funktion beendet zumindest die Anwendung am schnellsten ohne die internen Routinen zum Freigeben des reservierten Speichers aufzurufen.

RavenIV 19. Feb 2008 08:01

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:
procedure TFoMain.HandleException(Sender: TObject; E: Exception);
begin
  Application.MessageBox(PChar(E.Message + '.' + #10#13 + 'Anwendung wird geschlossen.'), 'Anwendungsfehler', MB_OK);
  Application.Terminate;
end;
P.S. Das mit den Delphi-Codetags werde ich vermutlich nie kapieren...

Luckie 19. Feb 2008 08:16

Re: Anwendung todsicher beenden, aber wie??
 
Zitat:

Zitat von bigg
Todsicher beenden:
Delphi-Quellcode:
Windows.ExitProcess(0);
PS: Ob das ganze dann sinnvoll ist sei mal dahingestellt.
Die Funktion beendet zumindest die Anwendung am schnellsten ohne die internen Routinen zum Freigeben des reservierten Speichers aufzurufen.

Der Speicher wird von Windows wieder freigegeben. Es ist zwar kein sehr schöner Programmierstil andere hinter sich aufräumen zu lassen, aber das ist nicht das Problem. Das eigentliche Problem ist, dass die Referenzzähler von geladenen DLLs nicht dekrementiert werden und Windows diese dann nicht aus dem Speicher schmeissen kann, wenn sie nicht mehr benötigt werden.

sx2008 19. Feb 2008 08:33

Re: Anwendung todsicher beenden, aber wie??
 
In der Projektdatei:
Delphi-Quellcode:
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;
Jetzt kommt bestimmt ein grosser Aufschrei wegen Goto.
Aber das ist die beste Lösung!
Würde man schreiben:
Delphi-Quellcode:
begin
  Application.CreateForm(TPassWort, Passwort);
  if not Application.Terminated then
  begin
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);
    ...
    Application.Run;
  End;
end;
dann hat die IDE Probleme die Projektdatei zu ändern weil wir die Projektdatei so geändert haben,
dass die IDE nicht mehr weiss, wo sie die CreateForm Zeilen hintun soll.

Luckie 19. Feb 2008 08:37

Re: Anwendung todsicher beenden, aber wie??
 
Zitat:

Zitat von sx2008
IJetzt kommt bestimmt ein grosser Aufschrei wegen Goto.
Aber das ist die beste Lösung!

Schlechten Programmierstil aufgrund von Unzulänglichkeiten der Entwicklungsumgebung vorzuziehen, finde ich falsch. Lieber sauber programmieren und die paar nötigen Änderungen von Hand in der Projektdatei vornehmen.

bigg 19. Feb 2008 10:43

Re: Anwendung todsicher beenden, aber wie??
 
Zitat:

Zitat von Luckie
Der Speicher wird von Windows wieder freigegeben. Es ist zwar kein sehr schöner Programmierstil andere hinter sich aufräumen zu lassen, aber das ist nicht das Problem. Das eigentliche Problem ist, dass die Referenzzähler von geladenen DLLs nicht dekrementiert werden und Windows diese dann nicht aus dem Speicher schmeissen kann, wenn sie nicht mehr benötigt werden.

Jein. Unter NT-Systemen mag diese Aussage stimmen. Ältere Systeme werden da nicht ganz so gründlich sauber machen.

Zitat:

Zitat von Luckie
Schlechten Programmierstil aufgrund von Unzulänglichkeiten der Entwicklungsumgebung vorzuziehen, finde ich falsch. Lieber sauber programmieren und die paar nötigen Änderungen von Hand in der Projektdatei vornehmen.

Seh ich auch so. :zwinker:

Delphi-Quellcode:
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;
Hier ein Label zu verwenden ist schon ziemlich strange und lässt wie Luckie schon sagte auf schlechten Programmierstil schließen.
Warum nicht so:

Delphi-Quellcode:
  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;
oder so:

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 23:03 Uhr.
Seite 1 von 2  1 2      

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