Announcement

Collapse
No announcement yet.

Problem mit AddObjects

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

  • Problem mit AddObjects

    Hallo,

    ich füge einer Listbox ein Objekt zu, bekomme aber beim Auslesen eine Zugriffsverletzung. Ich verstehe aber nicht, warum!

    Hier der Code:

    <pre>
    type
    TData = class(TObject)
    Filename : string;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var FData: TData;
    begin
    FData := TData.create;
    FData.filename := 'c:\test';
    listbox1.items.addObject('Test',FData);
    FData.free;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    var FData : TData;
    begin
    FData := TData(listbox1.items.objects[0]);
    showmessage(FData.filename);
    FData.free;
    end;
    </pre>

    Wäre schön, wenn jemand helfen könnte. Danke!

    Gruß Felix

  • #2
    Hallo,<p>
    schau mal folgenden Beitrag an:<br>
    http://www.entwickler-forum.de\webx?50@@.ee886d

    Comment


    • #3
      Hallo Felix,<br>
      <pre>
      <font face="Verdana" size="1" color="#000000">procedure TForm1.Button1Click(Sender: TObject);
      var
      FData: TData;
      begin
      FData := TData.create;
      FData.filename := 'c:\test';
      listbox1.items.addObject('Test',FData);
      <b><font face="Verdana" size="1" color="#FF0000">FData.free; </font></b>
      end;
      </font></pre>
      FData.Free isz falsch. Mit listbox1.items.addObject('Test',FData); übergibst Du einen Zeiger auf FData<br>
      an die Items.Objects Eigenschaft. Wenn Du anschließend FData.Free; aufrufst, zeigt der Zeiger in Objects<br>
      ins NIX. In Button2Click ist FData.Free richtig. <br>
      Jens Schumann<br&gt

      Comment


      • #4
        Hallo Jens,

        vielen Dank! Jetzt versteh ich's und nun klappt es auch.

        Unklar ist aber noch das FData.free in Button2Click. Mein Code zum Auslesen durchläuft in einer Schleife alle Einträge einer Listbox. Er wird von einem Timer ausgeführt.

        Mit FData.free funktioniert das Ganze nur einmal, beim nächsten Timer-Event gibt's wieder eine Zugriffsverletzung.

        Wenn ich FData.free rausnehme, geht alles. Das verstehe ich noch nicht ganz.

        @Elmar: da hab' ich das Beispiel ja her, aber eben die Grundlage nicht verstanden.

        Gruß Feli

        Comment


        • #5
          Hallo,<p>
          mit <b>FData.Free</b> wird der belegte Speicher des Objects freigegben. In deinem Beispiel wird nach dem Anklicken des Button2 der Speicher freigegeben. Versuchst Du nun erneut auf das Object zuzugreifen führt dies zu einer Schreinschutzverletzung, da das Object nicht mehr im Speicher vorhanden ist. Ich würde an Deiner Stelle so vorgehen:<bR>
          1. Beim Starten des Programms das Object laden<br>
          2. Bearbeitungen im Programmablauf ausführen<br>
          3. Beim Beenden Speicher wieder freigeben.<br>
          <pre>
          type
          TData = class(TObject)
          Filename : string;
          end;
          <p>
          type
          TForm1 = class(TForm)
          ....
          private
          FData: TData;
          end;
          <p>
          procedure TForm1.FormCreate(Sender: TObject);
          begin
          FData := TData.create;
          end;
          <p>
          procedure TForm1.Button1Click(Sender: TObject);
          begin
          FData.filename := 'c:\test';
          listbox1.items.addObject('Test',FData);
          end;
          <p>
          procedure TForm1.Button2Click(Sender: TObject);
          begin
          FData := TData(listbox1.items.objects[0]);
          showmessage(FData.filename);
          end;
          <p>
          procedure TFormApplet.FormClose(Sender: TObject; var Action: TCloseAction);
          begin
          FData.free;
          end;
          </pre&gt

          Comment


          • #6
            Super, Elmar,

            jetzt habe ich es endgültig kapiert.

            Gruß Feli

            Comment

            Working...
            X