Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Daten von 2D Array speichern (https://www.delphipraxis.net/50001-daten-von-2d-array-speichern.html)

Yheeky 19. Jul 2005 15:01


Daten von 2D Array speichern
 
Hi,

ich habe folgende types erstellt und möchte nun meine Daten sichern. Die Daten befinden sich in dem 2D Array Felder:

Delphi-Quellcode:
type
    TFeldDaten = record
      FeldArt : Integer;
    end;

type
    TFelder = record
      FeldX, FeldY : Integer;
      Felder : Array of Array of TFeldDaten;
    end;
Wie kann ich die nun speichern? var Datei : File of TFelder; funktioniert nicht, da kommt folgende Fehler:
Code:
[Fehler] Unit[...](82): Typ 'TFelder' benötigt Finalization - nicht im Dateityp erlaubt
Danke.

Dax 19. Jul 2005 15:04

Re: Daten von 2D Array speichern
 
File of? :shock:

Mach dir statt einem record lieber eine Klasse mit SaveToStream, LoadFromStream und vielleicht noch Assign-Methoden.. Dürfte um einiges besser sein ;)

(Macht ja am Ende auch nix anderes - schon mal die Sourcen für Read, Write, und Reset gesehen?)

Yheeky 19. Jul 2005 15:09

Re: Daten von 2D Array speichern
 
Aha, hört sich gut an *g*.
Nee, noch keinerlei Code in der Hinsicht gesehen.

barf00s 19. Jul 2005 15:11

Re: Daten von 2D Array speichern
 
es gäbe da 2 möglichkeiten :)

type
T2DArray = array of array of whatever;

oder

type
T2DArray = array of whatever; // ooh wunder

procedure Init2DArray(aArray: T2DArray; Width, Height: integer);
begin
SetLength(aArray, Width * Height);
end;

// gäbe natürlich auch noch ne 3te variante über pointer

type
P2DArray = ^T2DArray;
T2DArray = array of whatever;

procedure Init2DArray(var aArray: P2DArray; Width, Height: integer);
begin
GetMem(aArray, Width * Height * sizeof(whatever);
end;


um jetz aber nen 2d feld aus dem 1d feld zu machen behilft man sich einer einfachen rechnung
da die "zeilen" des "2d" feldes aneinandergereit im 1d feld untergebracht sind

function PositionToIndex(X, Y: integer): integer;
begin
Result := Y * Height + X;
end;

Index wäre die position im 1d feld ;)

ich denke IndexToPosition(Index: integer): TPoint; kannst dir selber herleiten...


so und dann is das speichern auch kein problem mehr

var
xFS: TFileStream;

begin
xFS := TFileStream('2ddaten.bin', fmCreate);
xFS.Write(Width * Height, 4);
for i := 0 to (Width * Height) - 1 do
xFS.Write(aArray[i], sizeof(whatever));
FreeAndNil(xFS);
end;

"whatever" wäre dann integer, oder byte, oder wieder nen anderes record - da müsste man dann die schreib routine anpassen ;)

Yheeky 19. Jul 2005 18:14

Re: Daten von 2D Array speichern
 
Das Speichern scheint zu funktionieren, aber das Laden nicht. Woher weiss der Code, dass ich die Isokarte.Felder[i].Feldart speichern will? Das steht doch garnicht im Code. Und was hat es mit SizeOf aus sich? Warum wird einmal eine 4 und einmal SizeOf an der Stelle von Write verwendet?

barf00s 29. Jul 2005 12:05

Re: Daten von 2D Array speichern
 
ich bin zu faul jedesmal SizeOf(integervariable_oder_integer) zu schreiben, da ich weiß, das aufnem 32bit betriebssystem nen integer (in delphi) 32bit - 4 bytes "groß" ist


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz