Announcement

Collapse
No announcement yet.

TIniFile.WriteBool schreibt NICHTS

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

  • TIniFile.WriteBool schreibt NICHTS

    Hallo,<p>
    ich habe eine neue Anwendung erzeugt:<p>
    <pre>
    DPR-Datei:<p>
    program Project1;

    uses
    Forms,
    Unit1 in 'Unit1.pas' {Form1};

    {$R *.res}

    begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    // wird Application Run auskommentiert,
    // kommt der Fehler
    //
    // Application.Run;
    end.
    <p><p>
    Unit1.pas:<p>
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, IniFiles;

    type
    TForm1 = class(TForm)
    procedure FormDestroy(Sender: TObject);
    private
    { Private-Deklarationen }
    public
    { Public-Deklarationen }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    with TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'test.ini') do
    try
    WriteBool('Test','Test',True);
    finally
    Free;
    end;
    end;

    end.</pre>
    <p>
    Das Problem ist, wenn ich Application.Run nicht ausführe, also die Anwendung sofort wieder beendet wird, arbeitet WriteBool falsch, es wird anstelle 0 oder 1 einfach NICHT als Wert in die Ini eingetragen.<p>
    Kann mir das jemand erklären?<p>
    Schöne Grüße, Mario Noack
    Schöne Grüße, Mario

  • #2
    Bei mir geht´s. Und ich habe deinen Code 1:1 übernommen:

    <pre>[Test]
    Test=1</pre&gt

    Comment


    • #3
      <p>Hallo!</p>
      <p>Ist es nicht so, das erst mit 'Application.Run' die Instanz der Form auch wirklich angelegt wird und demzufolgen auch nur dann zerstört werden kann?!?</p>
      <p>Gruß Nico</p&gt

      Comment


      • #4
        wenn ich das richtig sehe, hängt FormDestroy in der Nachrichetnwarteschlange für das zugehörige Windows-Ereignis. Da die Appl. niemals gestartet wurde, wird das Ereignis von Windows aus, auch nicht aufgerufen...<BR>
        PM

        Comment


        • #5
          ich seh das genau so , zwar wird es versucht eine Instanz zu starten , aber zum Ereignis FormDestroy kommt es nie.
          Welchen Sinn soll es haben das Application.Run auszukommentieren?????????

          Comment


          • #6
            @Nico: Nein. Die Instanz wurde zuvor mit CreateForm angelegt und ist auch verwendungsfähig. Run zeigt das MainForm an und geht dann in Warteschleife.<p>
            @Peter: Nein, WriteBool wird im OnDestroy auch dann aufgerufen, wenn ich Run auskommentiere. Nur arbeitet es nicht richtig. Es schreibt den Eintrag, aber leider keinen Wert dahinter.<p>
            @Rafael: Leider auch nein. Das Formular wird mit dem Owner der Application erzeugt. Dann kommt bereits das <b>end.</b> zum Zug. Dabei wird die Application zerstört und das Form auch mit. Ich kann es nachweisen, indem ich sehe, dass in der Ini-Datei folgender Eintrag hinzukommt:<br>
            <i>[Test]<br>
            Test=<br></i>
            Aber mehr halt leider nicht. Normalerweise schreibt WriteBool eine 0 oder eine 1.<p>
            Sicherlich ist der Fall konstruiert, es handelt sich hier auch nur um ein Minimalbeispiel. In der Praxis nutze ich die, um im HauptForm Parameter abzuarbeiten. Wenn die Anwendung mit bestimmten Parameter gestartet wird, sollen nur Befehle abgearbeitet werden und dann soll die Anwendung wieder geschlossen werden. Da kann ich den Run-Befehl natürlich nicht einsetzt, was mich dann zu diesem Problem gebracht hat.<p>
            Zwischenzeitlich habe ich es so gelöst, das ich einen eigenen WriteBool-Befehl geschrieben habe, welcher sauber arbeitet.<p>
            Schöne Grüße, Mario Noac
            Schöne Grüße, Mario

            Comment


            • #7
              Hallo Mario,

              ich habe die Tage gelesen, daß Borland empfhiehlt die Ereignisse OnCreate() und OnDestroy() nicht zu verwenden, sondern statt dessen den Kostruktur und Destruktor zu überschreiben - zumindest im Borland C++ Builder. Ich nehme mal an, daß das auch für Delphi gilt (Vermutung!).

              Ich hätte das Problem aber auch anders gelöst. Man kann doch im Konstruktor die Parameter prüfen, die gewünschten Aktionen durchführen und zum Schluß die Applikation mit PostMessage(this->Handle, WM_QUIT, NULL, NULL); beenden.

              Grüße Joche

              Comment

              Working...
              X