Announcement

Collapse
No announcement yet.

Dynamisches Array in File speichern

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

  • Dynamisches Array in File speichern

    Hallo zusammen,

    habe ein ähnliches Problem wie der Kollege im Delphi6-Forum. Er schrieb:
    __________________________________________________ __________________________________________________ _
    bei meinem Versuch, Inhalte wie ein dynamisches array komplett in eine typisierte Datei (file of) zu speichern, begegnet mir jedesmal die Fehlermeldung´: Fehler(74) Typ...... benötigt Finalization - Im Datentyp nicht erlaubt
    Kann man typisierte Dateien hierfür überhaupt verwenden, oder sollte ein anderes Verfahren verwendet werden?
    __________________________________________________ __________________________________________________ _

    Bei mir befinden sich in dem dynamischen Array Records, die wiederum selbst dynamische Arrays enthalten. Deshalb geht es auch nicht, die einzelnen Records nacheinander rauszuschreiben.

    Hat mir jemand eine raffinierte Lösung? Ich will einfach einen Daten-Zustand nach dem nächsten Programmstart wieder herstellen. Es ist nicht notwendig auf einzelne Records oder deren Variablen zuzugreifen. Danke Euch schon mal vorab.

  • #2
    Hallo Achim,<br>natürlich kannst Du die Records, die in Deinen dynamischen Arrays sind speichern. Die Records dürfen jedoch keine AnsiStrings enthalten. Schau dort http://www.entwickler-forum.de\webx?50@@.ee86e57/2 nochmal etwas genauer nach.<br>Jens Schuman

    Comment


    • #3
      Hallo Jens,

      Danke für Deine schnelle Antwort. Im Record befindet sich kein AnsiString sondern nur ein Array[1..4] of String[60]. Aber das Problem ist, daß sich außerdem ein Array of XYZ darin befindet. XYZ ist ein kleiner Record mit zwei Integer-Werten. Dieses Array ist aber dynamisch und hat somit keine bekannte Größe - und genau das scheint mir das Problem zu sein.

      Achi

      Comment


      • #4
        Hallo Achim,<br>in einer typisierten Datei kann man nur Daten <u>eines</u> Typs speichern. Das ist Dein Problem.<br> Wenn Du anstatt der Arrays TCollection und TCollectionItems verwendest (was natürlich ein bißchen mehr Aufwand bedeutet), lösen sich Deine Speicherprobleme wie von selbst. Unter der og. Adresse befindet sich ein Beispiel. Evt mußt noch einem weiterem Link folgen.<br>Dyn Arrays verwende ich eigentlich nicht. Die hören sich so nach VB an.<br>Jens Schuman

        Comment


        • #5
          Hi

          Speicherroutinen für solche Records müssen immer auf den Recordtyp bezogen arbeiten. Erst durch die Anwendung eines OOP designs könnten die einzelnen Objecte sich selber speichern und wissen demnach auch was und wie zu speichern ist. Grundsätzlich kann man aber alles speichern.

          <pre>
          type
          PMyRec1 = ^TMyRec1;
          TMyRec1 = packed record
          X,Y: Integer;
          end;<br>

          PMyRec2 = ^TMyRec2;
          TMyRec2 = packed record
          Name: String;
          Points: array of TMyRec1;
          end;<br>

          procedure SaveRecords(Stream: TStream; Data: array of TMyRec2);
          var
          I,J,Count: Integer;
          begin
          Count := Length(Data);
          Stream.Write(Count, SizeOf(Count));
          for I := 0 to Count -1 do
          begin
          // speichere Namen
          J := Length(Data[I].Name));
          Stream.Write(J, SizeOf(J));
          Stream.Write(PChar(Data[I].Name)^, J);
          // speichere Data[I].Points
          J := Length(Data[I].Points);
          Stream.Write(J, SizeOf(J));
          Stream.Write(Data[i].Points, J * SizeOf(TMyRec1));
          end;
          end;<br>

          procedure LoadRecords(var Data: array of TMyRec2; Stream: TStream);
          var
          Count,I,J: Integer;
          begin
          Stream.Read(Count, SizeOf(Count));
          SetLength(Data, Count);
          for I := 0 to Count -1 do
          begin
          // namen lesen
          Stream.Read(J, SizeOf(J));
          SetLength(Data[I].Name, J);
          Stream.Read(PChar(Data[I].Name)^, J);
          // points lesen
          Stream.Read(J, SizeOf(J));
          SetLength(Data[I].Points, J);
          Stream.Read(Data[I].Points, J * SizeOf(TMyRec2));
          end;
          end;<br>

          </pre>

          Wie man sieht müssen bei dynamischen Daten auch die Längenangaben gespeichert werden. Es ist also kein Problem irgendwelche Daten zu speichern. Natürlich würde ich NUR mit Streams arbeiten, anstatt den veralteten DOS Funktionen, AssignFile(), Read(), BlockRead() usw.

          Gruß Hage

          Comment


          • #6
            Hi Jens,

            ich schau mir das Beispiel mal an und hoffe, daß sich damit mein Problem in warme Luft auflöst. (Übrigens muß ich nicht unbedingt in eine typisierte Datei speichern) Ich poste hier dann das Ergebnis. Danke nochmal und schönen Abend. Gruß Achi

            Comment


            • #7
              Hallo Hagen,

              Danke Dir für die Lösung! Um das ganze auf Platte zu speichern muß ich jetzt nur noch das Prinzip auf TFileStream anwenden und schon klappt das....:-))))

              Gruß Achi

              Comment


              • #8
                Hallo Jens,

                ich hab das jetzt mit 'nem TFileStream gelöst. Trotzdem Danke für Deine Unterstützung

                Gruß Achi

                Comment


                • #9
                  FileStreams sind sehr einfach, in Deinem Falle dürften die Speicher/Laderoutinen sehr einfach sein, haben aber den entscheidenden Nachteil das spätere Änderungen an den Recordstrukturen dazu führen das sich das Dateiformat ändert. Man sollte also von Anfang an Reserven im Dateiformat einplanen, oder eine Absolutlösung anstreben. Klar, man kann vieles mit OOP/TCollections und Delphis Streamingsystem machen, meistens ist das aber viel zu umständlich und resourcenfressend. Soll z.B. die datei bzw. das Format auch durch andere Anwendungen lesbar sein, gehen solche "highlevel" Funktionen dann eh nicht.

                  Gruß Hage

                  Comment

                  Working...
                  X