AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FileStream: Record speichern

Ein Thema von Nils_13 · begonnen am 17. Dez 2008 · letzter Beitrag vom 18. Dez 2008
Antwort Antwort
Seite 1 von 2  1 2      
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

FileStream: Record speichern

  Alt 17. Dez 2008, 16:48
Hi,

ich habe bisher sehr gute Erfahrungen mit FileStreams gemacht. Wenn ich ein Array mit einem Record aus Strings speichern will, weiß ich, wie das geht. Aber wie könnte man folgendes Array speichern ?
Delphi-Quellcode:
type
  TElementStyle = (esRechteck, esDach, esFenster, esTuer);
  TElement = record
    Name : String;
    Data : TRect;
    cFill, cBorder : TColor;
    Style : TElementStyle;
  end;

var Elements : Array of TElement;
Wie immer muss man natürlich Schritt für Schritt den Record jeden Array-Eintrags speichern. Aber wie speichert man zum Beispiel cFill, Style oder Data ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 16:57
Die stehen doch im Record und müssen nicht extra gespeichert werden. Probleme sehe ich eigentlich nur bei dem String, da ja vermutlich nur der Pointer darauf gespeichert wird, Du müsstest Dich also auf Shortstring beschränken.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#3

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 16:58
ShortString ginge. Nur wie müsste man das dann machen ? Etwa quasi die Anfangs- und Endposition des Records übergeben, damit FS.Write das schreibt ?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 17:01
Wenn ich gerade keinen Knick im Hirn habe, müsste das doch einfach so gehen:
Delphi-Quellcode:
for i := Low(Elements) to High(Elements) do
  FS.Write(Elements[i],SizeOf(TElement));
Die Records sind ja alle gleich groß, wenn Du Shortstring verwendest.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 17:08
Das könnte man prinzipiell auch in einem Rutsch machen. Die Records liegen ja sequenziell hintereinander. Aufpassen musst du lediglich, wenn du einen packed record, aber kein packed array verwendest.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 17:15
Hi,

mit Filestreams habe ich bisher nicht viel gemacht.
Aber mit den File of ... Deklarationen:

Delphi-Quellcode:
type
  TElementStyle = (esRechteck, esDach, esFenster, esTuer);
  TElement = record
    Name : String;
    Data : TRect;
    cFill, cBorder : TColor;
    Style : TElementStyle;
  end;

var
  Elements : Array of TElement;
  f1: File of Elements; // Elements müsste glaube ich auch ein Type sein
  f2: File of TElement; // also besser so
  elem: TElement;

procedure tuwas;
begin
  AssignFile(f2, Datei);
  Reset(f2); // Typisierte Datei! zum Schreiben öffnen
  Write(f2, elem);
  CloseFile(f2);

  // später, woanders
  Read(f2, elem);
  Seek(f2, 4711); // Datensatznummer anspringen
  Read(f2, elem);
end;
Mit den Strings wurde ja schon angesprochen.
Gerade das mit dem Seek eröffnet eine recht flexible rudimentäre Datenbank. Könnte bei Bedarf ein Beispiel rauskramen. (Vielleicht habe ich das sogar schonmal hier irgendwo gepostet )


Gruß
Michael
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 17:19
Jepp, wenn ich nicht irre, ist das dasselbe Prinzip. Allerdings vermisse ich die {$I-Direktriven bzw. einen try-except-Block
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 17:21
Auch jepp, habe meinen Beitrag wiedergefunden: http://www.delphipraxis.net/internal...=570728#570728

edit: was mir noch gerade einfällt

Wenn man die Datei mit Reset geöffnet hat, muss man mit Seek erst zum Ende gehen, sonst überschreibt man den 1. DS in der Datei
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 17:22
Nach wie vor geht das aber nicht für einen dynamischen String.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: FileStream: Record speichern

  Alt 17. Dez 2008, 17:27
Hatte ich das nicht erwähnt?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08: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