Announcement

Collapse
No announcement yet.

Objekte in Records

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

  • Objekte in Records

    Hallo,
    kann ich bei der Definition eines Records auch Objekte, wie z. B. des Types TStringliste hinzufuegen ?
    Wie wird der Speicher einer Record-Instanz dann resierviert, mit der Definition, oder mit Create
    Danke

    Ciao
    Frank A.

  • #2
    <p>Hallo Frank,<br>
    <br>
    <pre>
    <b>type</b><br>
    TRec=<b>record</b>
    aInt :Integer;
    aList:TStringList;
    <b>end</b>

    <b>function</b> InitRec(<b>var</b> aRec:TRec);
    <b>begin</b>
    aRec.aInt:=0;
    aRec.aList:=TStringList.Create;
    <b>end</b>

    <b>function</b> ClearRec(<b>var</b> aRec:TRec);
    <b>begin</b>
    aRec.aList.Free;
    <b>end</b>
    </pre>
    <br>
    Gruß Thomas<br></p&gt

    Comment


    • #3
      Kann man solche "Spezial-Records" auch speichern (über file of TRec)

      Comment


      • #4
        Nein, denn Delphi würde nur einen Pointer speichern. Also mußt Du das Objekt enzelnd speichern. Bei "TStringList" z.B. über die Eigenschaft "Text". Vorsicht: Auch dieses Objekt ist eigentlich nur ein Pointer. Speichere am besten jeden Char für sich in einer Schleife. Beispiel?

        WriteBuffer(Datei, Length(Rec.Text), 4)
        FOR i := 1 TO Length(Rec.Text) DO
        BEGIN
        WriteBuffer(Datei, Rec.Text[i], 1);
        END

        Comment


        • #5
          Na, jedes zeichen einzeln zu speichern ist ein bischen übertrieben:

          <pre>

          var
          I: Integer;
          S: String;
          begin
          S := StringList.Text;
          I := Length(S);
          WriteBuffer(Datei, I, SizeOf(I));
          WriteBuffer(Datei, PChar(S)^, I);
          // und nun das Einlesen

          ReadBuffer(Datei, I, SizeOf(I));
          SetLength(S, I);
          ReadBuffer(Datei, PChar(S)^, I);

          StringList.Text := S;
          end;<br>

          // einfacher gehts mit TStream<br>

          var
          S: TFileStream;
          begin
          S := TFileStream.Create(FileName, fmCreate);
          try
          StringList.SaveToStream(S);
          // oder
          StringList.LoadFromSteam(S);
          finally
          S.Free;
          end;
          end;

          </pre>

          Gruß Hage

          Comment


          • #6
            Man sage mir mal, wie man Strings nach der PChar-Methode wieder einladen soll???<bt>
            Und die Stream Methode: Kann man im gleichen Stream dann auch noch was anderes speichern als den StringList? Ich weiß nämlich nicht, wie dieser im Stream gespeichert wird

            Comment


            • #7
              Hi

              das Laden nach der "PChar()^" Methode ist oben demonstriert, lesen

              Gruß Hage

              Comment

              Working...
              X