Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Array speichern (https://www.delphipraxis.net/70912-array-speichern.html)

luggaz 6. Jun 2006 17:46


Array speichern
 
Hallo,

bin leider blutiger Anfänger und suche mich gerade mit Google dumm und dämlich!

Ich muss in der Schule als Projekt "Schiffe versenken" programmieren und will die erzeugten Schiffe, die ich in einem Array of char speichere nun in eine Datei sichern, um sie jederzeit wieder laden zu können.

Ich hab nur irgendwelche sehr komplizierte Speichervorgänge für dynamische Arrays gefunden, blicke aber leider net durch. Ich suche einfach nur ne möglichkeit, das 2 dimensionelle Spielfeld zu speichern und wieder zu laden.

Wäre euch sehr dankbar für eure Hilfe!!!

MFG
LuGGaZ

waseo 6. Jun 2006 18:20

Re: Array speichern
 
Hallo!

Leider hast Du nicht geschrieben, welchen Datentyp Du für Dein Array verwendest. Ich würde eine StringList empfehlen. Hier mal ein kleines Beispiel mit einem 3 x 3 Feldern grossen Integer-Array:

Delphi-Quellcode:
type
  IntegerArray = Array[1..3,1..3] of integer;

procedure SpeichereArray(AArray: IntegerArray; FileName: String);
var
  i, j: integer;
  slDaten: TStringList;
begin
  slDaten := TStringList.Create;
  for i := 1 to 3 do
    for j := 1 to 3 do
      slDaten.Add(IntToStr(AArray[i, j]));
  slDaten.SaveToFile(FileName);
  slDaten.Free;
end;

procedure LadeArray(AArray: IntegerArray; FileName: String);
var
  i, j, Count: integer;
  slDaten: TStringList;
begin
  slDaten := TStringList.Create;
  slDaten.LoadFromFile(FileName);
  Count := 0;
  for i := 1 to 3 do
    for j := 1 to 3 do
    begin
      AArray[i, j] := StrToInt(slDaten[Count]);
      inc(Count);
    end;
  slDaten.Free;
end;
Vorher noch den Typ an eine Variable binden (z. B. var MeinArray: TIntegerArray) und die Zahlen ins Array schreiben. Dann kann man die Prozeduren so aufrufen: SpeichereArray(MeinArray, 'C:\array.txt')) bzw. LadeArray(MeinArray, 'C:\array.txt'))

marabu 6. Jun 2006 18:21

Re: Array speichern
 
Herzlich willkommen in der Delphi-PRAXiS, luggaz.

Dein "array of Char" kannst du als zusammenhängenden Speicherbereich betrachten und - wenn du willst - in einem Rutsch wegschreiben:

Delphi-Quellcode:
type
  TDemoForm = class(TForm)
    SaveButton: TButton;
    procedure SaveButtonClick(Sender: TObject);
  private
    Tiles: array [0..9, 0..9] of Char;
  end;

var
  DemoForm: TDemoForm;

implementation

{$R *.dfm}

procedure TDemoForm.SaveButtonClick(Sender: TObject);
var
  fn: TFileName;
begin
  fn := ChangeFileExt(ParamStr(0), '.cfg');
  with TFileStream.Create(fn, fmCreate) do
  begin
    WriteBuffer(Tiles, SizeOf(Tiles));
    Free;
  end;
end;
Freundliche Grüße vom marabu

luggaz 6. Jun 2006 18:29

Re: Array speichern
 
Also ich hatte im oberen Beitrag geschrieben, dass der Array of char ist, also mit Zeichen.

Wenn ich dein Beispielquelltext verwende markiert er mir folgende Zeile:

Delphi-Quellcode:
slDaten.Add(IntToStr(meer[i, k]));
und sagt: "Es gibt keine überladene Version von 'IntToStr', die man mit diesen Argumenten aufrufen kann!"

Die Meldung hatte ich schon mal, mit einem anderen Quelltext, den ich bei der Suche in Google gefunden hab. Leider kann ich mit dieser Meldung herzlich wenig anfangen.

@marabu
Bei deiner Lösung erhalte ich die Meldung:
"Es gibt keine überladene Version von 'WriteBuffer', die man mit diesen Argumenten aufrufen kann!"

Vielen Dank schon mal für eure Hilfe... hoffe dass ich das noch gelöst bekomme ;-)

MFG
LuGGaZ

droppi 6. Jun 2006 18:32

Re: Array speichern
 
du kannst keinen element vom array of char mit inttostr umwandeln denn der datentyp ist ja char.

marabu 6. Jun 2006 18:36

Re: Array speichern
 
Hallo luggaz,

deine fehlerhafte Anpassung des Codes von waseo - den ich hiermit auch recht herzlich als neues Mitglied im Forum begrüßen möchte - hat droppi ja schon korrigiert. Was du bei meinem Code falsch gemacht hast, kann ich nur raten. Wahrscheinlich hast du auch dort nicht auf den Parametertyp geachtet:

Delphi-Quellcode:
WriteBuffer(meer, SizeOf(meer));
marabu

luggaz 6. Jun 2006 18:56

Re: Array speichern
 
Ok, mit dem ersten Beispiel hab ichs jetzt gebacken bekommen, aber wenn ich versuche statt einem festen Dateinamen
Delphi-Quellcode:
savedialog1.filename
einzusetzen bringt er mir nen Fehler und ich will, dass der Benutzer die Datei, bzw. den Speicherort auswählen kann.

MFG
LuGGaZ

nailor 6. Jun 2006 19:03

Re: Array speichern
 
a) was für einen fehler?
b) hast du den savedialog auch vorher erstellt?

luggaz 6. Jun 2006 19:48

Re: Array speichern
 
jo, klar hab ich den SaveDialog vorher erstellt und der Name stimmt auch.

Meldung:
Zitat:

Im Projekt X_y.exe ist eine Exception der Klasse System.Exception mit der Meldung 'Ungültiges Thread-Modell (STAThreadAttribute erforderlich)' aufgetreten.
MFG
LuGGaZ


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:54 Uhr.

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