Autor Beitrag
Masterrandy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Mo 07.04.03 15:27 
Ich habe folgende Records:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
TPosition = record
Datei: Integer;
Start: Integer;
Definition: Boolean;
end;

type
TAttribute = record
Name: String;
Typ: Char;
Laenge: Integer;
Position: array of TPosition;
end;

type
TDaten = record
Dateiinhalt: TMemoryStream;
Dateinamen: String;
end;

und damit zwei Variablen:
recAttribute
recDaten

Diese sind mit vielen Daten gefüllt. Wie kann ich diese Daten nun in Dateien abspeichern. Ich möchte aber nicht mehr als zwei Dateien haben, am liebsten nur eine.

Hat jemand eine Idee dazu? Bin für alle Tips offen.

Moderiert von user profile iconKlabautermann: Delphi-Tags hinzugefügt.
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mo 07.04.03 17:52 
Hallo,

ersteinmal würde ich dir empfehlen alle Records mit dem Schlüsselwort Packed versehen. Damit stellst du sicher das die Daten immer den ninimal Platz belegen, egal wie die äußeren umstände sind (Delphi version usw.).
Also Beispielsweise so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type
  TPosition = packed record
    Datei: Integer;
    Start: Integer;
    Definition: Boolean;
  end;

Dann musst du dir ein Dateiformat ausdenken um mehrere verschiedene Records in die selbe Datei zu bringen.
Z.b. könntest du dir eine Blockheader konstruieren, der Informationen enthällt von welchem Datrentyp der kommende Block ist. Inetwa so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
tBlockHeader = packed recod
  BlockType : LongInt;
  BlockSize : Longint;
  Deleted : Boolean;
END;

Diene Datei baust du dann als untypisierte Datei so auf, das immer ein Blockheader kommt und danach der Datenblock. Der Trick bei der sache ist, das du in BlockType eine nummer speichers, die angibt ob als nächstes ein TPosition, TAttribute, TDaten Datensatz kommt. In BlockSize steht wie groß dieser Block ist, das diehnt aber eher dazu schneller durch eine solche Datei scrolen zu können und kann vieleicht noch zur Versionskontrolle genutzt werden. Über Deleted kannst du dann ncoh einträge als gelöscht markieren, damit du nicht immer die ganze Datei neu schreiben musst, wenn du einen Datensatz löscht.

Wie gasagt das ist nur eine Lösung. Wenn du zwei Dateien verwendest (Daten und Indexdatei) könntest du das Arbeiten damit warscheinlich noch performanter gestalten.

Begriffe die du zu dem Thema in der Delphi-Hilfe nachschlagen solltest: FILE, AssifnFile, Blokread, Blockwrite, CloseFile, Reset, Rewrite, Dateitypen, tStream, Seek.

Gruß
Klabautermann
ShadowCaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Di 08.04.03 09:09 
Zitat:
ersteinmal würde ich dir empfehlen alle Records mit dem Schlüsselwort Packed versehen


hm.... ich finde es seltsam dass die ganze delphi-api auf packed aufgebaut ist. Schließlich bedeutet packed auch Geschwindigkeitseinbußen. Warum verwenden alle packed? Mir persönlich gehts immer um Systemperformance und ich verwende nie packed weils gerade komplexe Recordstrukturen langsamer für die Verarbeitung macht.

Könnt mich ja eines anderen belehren.
Masterrandy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55



BeitragVerfasst: Di 08.04.03 10:13 
Titel: Gibt es dazu vllt Beispiele?
Erstmal danke an dich Klabautermann für deine Antwort.

Gibt es vllt noch einige Beispiele oder wietere Literatur dazu außer in der Online-Hilfe?

Zur Geschwindigkeit will ich nur soviel sgaen: Hauptsach es tut :wink:


Übrigends: Echt tolles Forum mit Leuten die sich wirklich auskennen!
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 08.04.03 11:25 
Titel: Re: Gibt es dazu vllt Beispiele?
Hallo,
Masterrandy hat folgendes geschrieben:
Gibt es vllt noch einige Beispiele oder wietere Literatur dazu außer in der Online-Hilfe?

Eisenherz hat mal was entsprechendes entwickelt und auch ein Tutorial dazu geschrieben. Vieleicht ist das ja was für dich.

ShadowCaster hat folgendes geschrieben:
hm.... ich finde es seltsam dass die ganze delphi-api auf packed aufgebaut ist. Schließlich bedeutet packed auch Geschwindigkeitseinbußen. Warum verwenden alle packed?

Es ist richtig, das das auf die Performance geht, dafür schohnt es Resourcen, in Form von Speicher. Desweiteren erhöht es sobalt es gespeichert werden soll die Kompatibilität, da die verschiedenen Blockgrößen der verschiedenen Delphi Versionen nicht ins Gewicht fallen.

Gruß
Klabautermann
ShadowCaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: Di 08.04.03 12:24 
achso... ok dann verstehe ich