Announcement

Collapse
No announcement yet.

Kann man ein dynamisches Array in ein record packen ??

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

  • Kann man ein dynamisches Array in ein record packen ??

    Hallo zusammen,

    ich habe mir ein Record gebastelt mit folgendem Aussehen:
    <PRE>
    ImpExpDataRec = record
    CompCount : Integer;
    PCID : Integer;
    RPName : array [0..150] of char;
    RPID : Integer;
    CompID : array [0..200] of Integer;
    CompValue : array [0..200] of Double;
    end;
    </PRE>
    Nun wäre es für mich aber schöner das Integer- und Double-Array dynamisch zu halten, da ich erst zur Laufzeit die tatsächliche Array-Grösse bestimmen kann.
    Ich habe das schon versucht, aber der Compiler fängt an zu meckern sobald ich den Filetyp <I>File of ImpExpDataRec</I> deklariere und Im Record die Array-Grösse weglasse. Er sagt etwas von finalize!

    Hat jemand eine Erklärung, oder noch besser eine Lösung?

    Mfg
    Carsten

  • #2
    Der Compiler meckert mit Recht. Bei einem "File of" ist ja der Knackpunkt das die Recordgroesse fest und vorgegeben ist. Das File wird dann in genau diesen Blockgroessen verwaltet. Wie sind die Daten denn eigentlich im File abgelegt. Du brauchst wahrescheinlich eine andere Lesestrategie und ein anderes Format fuer deine records

    Comment


    • #3
      Hi,
      die Daten lese ich aus einer Datenbank aus und speichere Sie zwecks Datensicherung auf einer Diskette. Die Anzahl der Daten kann dabei variieren, wobei ein Datensatz immer der Struktur meines Records entspricht. Das dynamische Array wäre deshalb von Vorteil, da die Datensatzeinträge eine unterschiedliche Anzahl von Rezeptwerte haben

      Comment


      • #4
        Delphi weigert sich, diese Daten als Datei abzuspeichern, weil ein Dynamisches Array (und Strings) eigentlich nur ein Pointer auf die Daten sind. Beim nächsten Start sind die Daten bei diesem Pointer ganz andere. Ich löse das Problem meist, indem ich eine Schreib- und lese Prozedur einrichte: (wie Robert vorgeschlagen hat)<p>
        <pre>
        ImpExpDataRec = record
        CompCount : Integer;
        PCID : Integer;
        RPName : String
        RPID : Integer;
        CompID : array of Integer;
        CompValue : array of Double;
        end;

        PROCEDURE WriteImpExpDataRec(Value: ImpExpDataRec; FileName: String);
        var
        Stream: TFileStream;
        begin
        Stream := TFileStream.Create(FileName, fmCreate);

        Stream.WriteBuffer(Value.CompCount, SizeOf(Integer));
        Stream.WriteBuffer(Value.PCID, SizeOf(Integer));

        // Länge des Arrays screiben
        Stream.WriteBuffer(Length(Value.RBName), SizeOf(Integer));
        // Daten schreiben
        Stream.WriteBuffer(PPonter(Value.RBName)^, Length(Value.RBName));

        Stream.WriteBuffer(Value.RBID, SizeOf(Integer));

        // Länge des Arrays schreiben
        Stream.WriteBuffer(Length(Value.CompID), SizeOf(Integer));
        // Daten schreiben
        Stream.WriteBuffer(PPonter(Value.CompID)^, Length(Value.CompID));

        ...

        Stream.Free;
        end;

        </pre&gt

        Comment

        Working...
        X