AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Record und in File speichern

Offene Frage von "delphinia"
Ein Thema von delphinia · begonnen am 17. Nov 2006 · letzter Beitrag vom 13. Mär 2007
Antwort Antwort
Seite 1 von 2  1 2   
delphinia

Registriert seit: 16. Feb 2006
444 Beiträge
 
Delphi 11 Alexandria
 
#1

Record und in File speichern

  Alt 17. Nov 2006, 16:17
hey,

habe folgenden Record:

Delphi-Quellcode:
type
  TArtRec = record
    ID: Integer;
    D1: string;
    D2: string;
  end;
var
  ArtArr: array of TArtRec;

Wie speichere ich dessen Inhalt am sinnigstenn in einer File?
Doreen
Gruss Doreen
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#2

Re: Record und in File speichern

  Alt 17. Nov 2006, 16:31
Hi,
so richtig elegant geht das leider nicht.
Du hast die Auswahl dir eine eigene Dateistruktur zu überlegen und die zu implementieren, kannst aber auch auf ein Ini-File, XML oder CSV zurückgreifen. Zu letzten findest du eine Menge Komponenten, teilweise auch gleich bei Delphi beiliegend.
Legst du dir ein eigenes Dateiformat an, so solltest du darauf achten, dass du die Länge der Strings speichern musst. Ein String hat in Delphi eine Variable Länge von bis zu 2^{31}-1 Zeichen (sind ca. 2.1 Mrd. Zeichen). Da ein Record eine feste größe hat, musst du hier aufpassen, Strings werden nur als Zeiger im Record abgelegt. Möchtest du den Inhalt in ein Stream schreiben, musst du den Strings dereferenzieren (z.B. D1[1], wäre jetzt das erste Zeichen im String und ist damit der Anfang). Dabei geht dann aber dass davor sitzende Längenwort verloren, deswegen wie gesagt, musst du die Länge vorher abspeichern.

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Record und in File speichern

  Alt 17. Nov 2006, 16:41
als Schritt Nr.1 solltest Du die String durch string[xxx] ersetzen.
Delphi-Quellcode:
type
  TArtRec = record
    ID: Integer;
    D1: string[100];
    D2: string[100];
  end;
Dann kannst Du folgendermassen abspeichern:
Delphi-Quellcode:
procedure Speichern ();
var
  stream : TFileStream;
  filename : string;
begin
  filename := ChangeFileExt (Application.ExeName, '.ext'); // Filename setzen
  stream := TFileStream.Create (filename, fmCreate); // Stream erzeugen
  try
    stream.WriteBuffer (PDeinRecord^, SizeOf (DeinRecord));
  finally
    stream.Free; // Stream wieder freigeben
  end;
end;
Natürlich kannst Du auch das ganze Array speichern, indem Du eine geeignete Schleife um das Speichern herum legst.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
delphinia

Registriert seit: 16. Feb 2006
444 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Record und in File speichern

  Alt 17. Nov 2006, 17:16
Ok ich ahb es so gelöst!

ist da was zu verbessern drinne?


Delphi-Quellcode:
function TWK_Form.write_Data: boolean;
var
  f: Textfile;
  i: Integer;
begin
  pro_1.MaxValue := allcnt;
  Result := False;

  AssignFile(f, FileName);
  try
    if FileExists(FileName) = False then
      Rewrite(f)
    else
    begin
      ReWrite(f);
    end;

    for i := 0 to allcnt - 1 do
    begin
      pro_1.Progress := i;
      WriteLn(f, IntToStr(ArtArr[i].ID) + ';' + ArtArr[i].d1 + ';' + ArtArr[i].d2);
      Application.ProcessMessages;
    end;

    Result := True;
  finally
    CloseFile(f);
    pro_1.Progress := 0;
  end;
end;
Doreen
Gruss Doreen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Record und in File speichern

  Alt 17. Nov 2006, 17:18
Ich würde nicht mit Records arbeiten, sondern mit Klassen: http://www.delphipraxis.net/internal...=640273#640273

Und zuim Speichern würde ich eine XML-Datei nehmen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
peteress

Registriert seit: 6. Sep 2004
49 Beiträge
 
#6

Re: Record und in File speichern

  Alt 17. Nov 2006, 19:20
Geht man von Pascal in der ursprünglichen Version aus, dann ist die obige Deklaration gleichbedeutend mit:
Delphi-Quellcode:
  TArtRec = record
    ID: Integer;
    D1: string[255];
    D2: string[255];
  end;
Dann geht mdas mit dem Speichern schon sehr elegant:
Delphi-Quellcode:
var i :integer;
  aFile: File of TArtRec;
begin
  AssignFile(aFile,'Filename');
  Rewrite(aFile);
  for i := 0 to length(ArtArr)-1 do begin;
    Write(aFile, ArtArr[i]);
  end;
  CloseFile(aFile);
end;
Gruss
Peter
  Mit Zitat antworten Zitat
delphinia

Registriert seit: 16. Feb 2006
444 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Record und in File speichern

  Alt 18. Nov 2006, 14:43
hmm na ja wichtig ist das die ; mit in der speicehrung zwecks CSV verwertbarkeit vorhanden sind!
Doreen
Gruss Doreen
  Mit Zitat antworten Zitat
peteress

Registriert seit: 6. Sep 2004
49 Beiträge
 
#8

Re: Record und in File speichern

  Alt 19. Nov 2006, 12:51
Zitat von delphinia:
hmm na ja wichtig ist das die ; mit in der speicehrung zwecks CSV verwertbarkeit vorhanden sind!
Nun, das ist eine Information, die du sinnigerweise von Anfang an hättest mit uns teilen sollen.
Dann iterier durch das Array, schreibe jedes Record in eine Zeile einer TStringlist, trenne die Einträge durch Komma, und nutze dann die Methode TStringlist.SavetoFile zum speichern

cu
Peter
  Mit Zitat antworten Zitat
Nicodius

Registriert seit: 25. Apr 2003
Ort: Graz
2.234 Beiträge
 
Delphi 2006 Architect
 
#9

Re: Record und in File speichern

  Alt 28. Feb 2007, 16:39
ich hab dasselbe problem

Delphi-Quellcode:
  Vert_Ent = record
  vtjahr : Integer;
  vtproz : array [0..11] of Integer;
end;

Steuer = record
  st_bez : string[30];
  st_jahr : array [0..11] of Integer;
  st_vert : string[10];
  st_aufk : array [0..11] of longint;
end;

Modell = record
  und_bez : string[30];
  und_st : array [0..31] of Steuer;
end;


Alles= record
  Vert_ast : array [0..30] of array [0..22] of string ;
  vert_datum : array [0..31] of Vert_ent;
  mod_ : array [0..15] of Modell;


procedure TMain.Speichern1Click(Sender: TObject);
var
  stream : TFileStream;
  filename : string;
begin
  filename := ChangeFileExt (Application.ExeName, '.ext'); // Filename setzen
  stream := TFileStream.Create (filename, fmCreate); // Stream erzeugen
  try
    stream.WriteBuffer (TAlles^, SizeOf (TAlles)); // hier kommt eine fehelrmeldung dass nach TAlles^ eine klammer fehlt ( und
                                                    // dass eine anweisung erforderlich ist aber ein integer gefunden wurde
  finally
    stream.Free; // Stream wieder freigeben
  end;
end;
was mach ich falsch?

lg nico
Nico Müller
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#10

Re: Record und in File speichern

  Alt 28. Feb 2007, 16:47
Zitat von Nicodius:
ich hab dasselbe problem
Delphi-Quellcode:
Alles= record
  Vert_ast : array [0..30] of array [0..22] of string ;
Hi,
das sollte schon nicht funktionieren. Ein String hat keine feste Größe, die wird aber von einem Record benötigt. Ein String kann im Worst-Case 2^31 Zeichen enthalten, das wären gute 2 GByte pro String, bei 31 * 23 * 2 GByte dürfte das doch etwas viel werden (pro Record!).

Zitat von Nicodius:
ich hab dasselbe problem
Delphi-Quellcode:
procedure TMain.Speichern1Click(Sender: TObject);
var
  stream : TFileStream;
  filename : string;
begin
  filename := ChangeFileExt (Application.ExeName, '.ext'); // Filename setzen
  stream := TFileStream.Create (filename, fmCreate); // Stream erzeugen
  try
    stream.WriteBuffer (TAlles^, SizeOf (TAlles)); // hier kommt eine fehelrmeldung dass nach TAlles^ eine klammer fehlt ( und
                                                    // dass eine anweisung erforderlich ist aber ein integer gefunden wurde
  finally
    stream.Free; // Stream wieder freigeben
  end;
end;
was mach ich falsch?
Wo kommt denn TAlles her? Ist TAlles ein Datentyp? Dann würde das mit der Klammer daher kommen, dass Du schon eine Variable brauchst, die Du hier übergibst. TAlles(x) wäre dann der Cast der Variable x in ein TAlles. Jedenfalls brauchst Du eine Variable vom Typ TAlles, die kannst Du dann übergeben, sizeOf(Talles) kann dann hingegen bleiben (solange es sich nicht um einen Zeiger handelt, der sollte dann aber auch besser PAlles heißen!)

Gruß Der Unwissende
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 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