AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anwendung todsicher beenden, aber wie??

Ein Thema von rollstuhlfahrer · begonnen am 18. Feb 2008 · letzter Beitrag vom 24. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#1

Anwendung todsicher beenden, aber wie??

  Alt 18. Feb 2008, 17:50
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. Nun ich meine so sieht kein Regestrierungsschutz aus...
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
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: Anwendung todsicher beenden, aber wie??

  Alt 18. Feb 2008, 17:59
Zeig doch mal den Aufruf des Registrierungsformulars und dessen Auswertung.
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
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Anwendung todsicher beenden, aber wie??

  Alt 18. Feb 2008, 18:13
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
Andreas
  Mit Zitat antworten Zitat
busybyte

Registriert seit: 15. Sep 2006
165 Beiträge
 
#4

Re: Anwendung todsicher beenden, aber wie??

  Alt 18. Feb 2008, 18:22
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;
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#5

Re: Anwendung todsicher beenden, aber wie??

  Alt 18. Feb 2008, 19:11
Todsicher beenden: 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.
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Anwendung todsicher beenden, aber wie??

  Alt 19. Feb 2008, 09:01
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...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Anwendung todsicher beenden, aber wie??

  Alt 19. Feb 2008, 09:16
Zitat von bigg:
Todsicher beenden: 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Anwendung todsicher beenden, aber wie??

  Alt 19. Feb 2008, 09:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Anwendung todsicher beenden, aber wie??

  Alt 19. Feb 2008, 09:37
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von bigg
bigg

Registriert seit: 1. Jul 2007
155 Beiträge
 
#10

Re: Anwendung todsicher beenden, aber wie??

  Alt 19. Feb 2008, 11:43
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 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.

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;
  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 14:52 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