Announcement

Collapse
No announcement yet.

Application.Terminate

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Application.Terminate

    Hallo,

    ich möchte, dass mein Progamm schon beim Laden wieder beendet wird, wenn festgestellt wird, dass eine notwendige Datei fehlt.

    Dabei soll aber nicht die FormClose-Procedur ausgeführt werden.

    Mir ist es noch nicht gelungen, das zu unterdrücken. Wie macht man das?

    Ich dachte application.Terminate wäre ein Lösungsweg. Aber irgend etwas mache ich scheinbar falsch.

    Ich habe es auch schon ohne application.terminate probiert und mit einer public-Variablen p_fehler:integer

    Auf dem Weg meldete sich immer der Norton CrashGuard mit einem Fehler, verursacht durch meinen Programm.

    <pre>
    procedure TForm1.FormCreate(Sender: TObject);
    var
    Ini: TIniFile;
    s,ss,s1,s2:string;
    tes:integer;
    ter:real;
    begin
    // p_fehler:= 0;
    if not FileExists('x.ini') then
    begin
    // p_fehler:=1;
    showmessage('Die INI-Datei x.ini fehlt.'+#13#10+'Das Programm wird deshalb abgebrochen.');
    application.Terminate;
    close;
    end;

    if not FileExists('x.dat') then
    begin
    showmessage('Die Datendatei x.dat fehlt.'+#13#10+'Das Programm wird deshalb abgebrochen.');
    application.Terminate;
    close;
    end;
    try
    Ini:=TIniFile.Create('x.ini');
    p_spg:=Ini.ReadString('Tab','SPG','');
    try
    tes:= strtoint(p_spg); // p_ variablen sind bei "public"
    except
    p_spg:= '5';
    showmessage('Die INI-Datei ist beschädigt (Anzahl der Spalten ist ungültig). Es werden nur 5 Spalten angezeigt');
    end;
    finally
    Ini.Free;
    end;
    </pre>
    <pre>
    //************************************************** *********************

    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    var i:integer;
    begin
    // if p_fehler = 0 then
    //begin

    i:= application.MessageBox(Pchar('Tabelle speichern?'),Pchar('Sicherheit'),mb_YesNo);
    if i = 6 then SaveStringGridToFile(sg1,'x.dat'); // 6 = JA
    // end;
    end;
    </pre>
    Gruß
    Werner

  • #2
    Hallo, <br>
    um zu verhindern, dass Form OnClose ausgeführt wird, muss das Programm beendet werden, befor (!!!) das Form erzeugt wird! Das kann man machen, indem man schon in der .DPR befor das Form erzeugt mit CreateForm() erzeugt wird das Programm mit Application.Terminate() beendet.<br>
    <br>
    mfg
    <br> Simon Rot

    Comment


    • #3
      Nochmal Hallo,

      ich dachte immer Delphi ist objekt- und ereignisorient. Mit welchen Ereignis kann ich eine Procedur (hier: prüfen, ob eine Datei existiert)aufrufen ohne ein Formular zu benutzen?

      Übrigens die Programmabstürze habe ich ausgemerzt. Ich habe doch wieder die public-Variablen genommen.
      Hinter jedes Close; noch ein Abort;.
      Im OnClose-Ereignis
      if p_fehler = 1 then Application.Terminate;

      Gruß
      Werne

      Comment


      • #4
        Hallo Werner,<br>anstatt Application.Terminate verwende lieber PostMessage(Handle,WM_CLOSE,0,0)

        Comment


        • #5
          Hallo Jens,

          das Stabilitätsproblem lag nicht daran. Es lag an den Aborts. Warum, weiß ich nicht. Aber ohne Abort sprang der Norton Crash-Guard an.

          Hallo Simon,

          damit sich das Formular nicht zeigt, trotz OnCreate, habe ich vor
          <pre>
          Application.Run
          </pre>
          folgende Zeile eingefügt:
          <pre>
          Application.ShowMainForm := false
          </pre>
          eingefügt.
          Dann noch bei den Eigenschaften für Form1
          <pre>
          visible = false
          </pre>
          eingestellt.
          Die MessageBox mit der Fehlermeldung wird aber angezeigt, nicht aber das Form.

          Falls kein Fehler auftritt, muss man das Form natürlich zur Laufzeit wieder sichtbar machen.

          Ich glaube, so machen es auch die Profis.

          Gruß
          Werne

          Comment

          Working...
          X