Autor Beitrag
WileECoyote
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Di 02.08.05 09:15 
Hi Leute,

hatte schon mal gepostet, weil ich Probleme habe beim speichern von verschiedenen Records in einer Datei in unterschiedlicher Anzahl (1 Header und 1 bis n Datenrecords). Der Datenrecord hat nun auch noch ein Bild als Komponente. Man hatte mir den TReader/Twriter empfohlen.
Leider habe ich noch gar nichts damit gemacht und die Delphi-Hilfe ist keine solche in diesem Fall. Auch habe ich mich schon hier durchs Forum gekämpft, leider noch nichts passendes gefunden.
Hat jemand von euch eventuell ein Muster, wie man TReader und TWriter benutzt? Und wie geht das, dass erkannt wird, dass es sich um unterschiedliche Records handelt?
Ausserdem kann man ja irgendwie die Satzgröße angeben. Aber ich weiss doch nicht, welche Größe zum Beispiel das Bild hat (wenn vorhanden). Wie funktioniert das?
Und das wichtigste: Das Ding muss sicher sein, korrupte Dateien etc dürfen nicht zum Absturz führen. Wie werden denn die erkannt?

Weiss, dass sind eine Menge Fragen, aber wenn jemand eine Vorlage hat und mir die Fragen eventuell auch beantwworten könnte (will das ja schließlich auch verstehen) wäre das echt sehr geil.

Danke schon mla, Wile E.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 02.08.05 19:10 
www.delphi-forum.de/...ight=treader+records
auch mal in den FAQ´s schauen, da gibt es auch noch was.

Ich persönliche schreibe die Daten des records einzeln in den stream, nicht das komplette record mit einem mal. Wenn du strings statt shortstrings im record verwendest, gehts sowieso nur einzeln. Mit dem Bild geht es genauso, einfach savetostream verwenden.
Durch das einzelne Schreiben habe ich auch eine Versionskontrolle und die Programme kommen mit unterschiedlichen Dateiversionen problemlos zurecht.
Mit einem Bitmap sollte es funktionen (bin mir da aber nicht sicher), bei einem jpg geht es nicht. Bei einem jpg steht die "Größe" der Daten für den Stream nicht fest. Du kannst das Bild aber in einen memorystream zwischenspeichern, und in deinen richtigen stream schreibst du zuerst die Größe des memorystreams und dann die Daten des Memorystreams. Beim Auslesen genau andersrum, erst die größe auslesen, denn die entsprechenden Anzahl bytes in den memorystream kopieren und aus diesem das Bild mit loadfromstream laden. Anschließend die weiteren Daten auslesen.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Di 02.08.05 20:06 
danke schon einmal für die tipps...muss allerdings gestehen, dass ich das immer noch nicht schnallen...in meinem gesamten delphi-leben (und das ist noch nicht so lange) habe ich bis jetzt immer nur mit typisierten dateien gearbeitet...
...wie schiebe ich denn das ganze auf einen memory-stream? und wie ermittle ich dabei die größe des bildes? muss ich das jpeg vorher konvertieren in ein bmp?
hast du eventuell scon mal so etwas in der art programmiert und könntest mir die source zur verfügung stellen? wäre echt dankbar für sowas.

vielen dank schon mal, Wile E.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 02.08.05 20:12 
nicht die größe des Bildes, die größe des memorystreams.

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Di 02.08.05 20:15 
hey, sorry, ich habe keine ahnung davon, wovon du redest...
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Di 02.08.05 20:21 
Einfach auch mal im Forum suchen, da gibt es bereits ein paar Beispiele, auch noch mal selber suchen:
www.delphi-forum.de/...highlight=jpg+stream

www.delphi-forum.de/...ight=stream+copyfrom
da ist ein Link von Luckie: der Link hat sich geändert www.luckie-online.de...er/Delphi/Sonstiges/ und dann Tarchive.

gugg es dir erstmal in Ruhe an und stell gezielt Fragen.

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Di 02.08.05 20:34 
hey, ist nicht so, dass ich nicht selbst suchen würde...aber warscheinlich habe ich die richtige lösung aus unwissenheit gar nicht als solche erkannt...aber auf jeden fall schon mal vielen dank für die links, werde mir das alles mal genau anschauen...und mich warscheinlich dann wieder melden...erstmal schönen abend noch,

gruß, Wile E.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Di 02.08.05 21:36 
Wie ist dein Record denn aufgebaut? Hättest du ein Beispiel gepostet, hättest du vielleicht besser verständliche Hinweise bekommen.

_________________
Ciao, Sprint.
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Mi 03.08.05 10:50 
HI,

also, meine Datenstruktur sieht ungefähr so aus:


Zu jedem Baum gibt es einen Header, der allgemeine Daten darüber speichert.
Diesen Header gibt es immer nur einmal, zurzeit liegt er bei mir in einer extra Datei, die denselben Namen
hat wie die Baumdatei. Darüber wird dann auch die Baumdatei identifiziert, löscht der Nutzer sie, hat er Pech gehabt...und das find ich doof.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
THEader = record
           Name : string[50];
           Beschreibung : string[100];
           Version : string[10];
           Ident1 : string[30];
           Ident2 : string[30];
           Datum : TDatetime;
           Protected : boolean;
           Baum : string;
          end;



Dann gibt es zu jedem Baum natürlich beliebig viele Elemente, die in der zweiten Datei gespeichert werden.
(TBaum). In diesen Baumelementen befinden sich auch die Bilder, wenn der Nutzer zu einem Datensatz eines lädt.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
TABhaengigkeiten = array[1..255] of integer;
Tauspraegung = 1..6;

TBaumpointer = ^TBaum;
TBaum = record
         QUESTION : string[255];
         Kapitel : string[20];
         Kapitellaenge : string[10];
         NUMMER : integer;
         UNUMMER : integer;
         ISCHECKED : boolean;
         ISVISIBLE : boolean;
         CANCHANGE : boolean;
         ABHAENGIGKEITEN : TAbhaengigkeiten;
         BEMERKUNG : string[255];
         Auspraegung : TAuspraegung;
         HILFE : string[255];
         BILD : TPicture;
         Hoch : TBaumpointer;
         Runter : TBaumpointer;
       end;


Kann ich diese beiden Records nun in eine Datei packen? Und wenn ja (man hat mir ja schon gesagt, dass es geht)
wie? Und wie prüft man, dass der Anwender die Datei nicht zerstört hat? Man hat uns mal beigebracht, dass man typisierte Dateien als file of byte öffnet, die Dateigröße mod Datentyp prüft etc. Das geht hier ja nicht, weil ich nicht weiss, wie groß ein Bild ist und weil verschiedene Datensätze drin sind. Außerdem würde ich dann ganz gerne für einige Datenfelder auch unbegrenzte Strings nehmen?

Vielen Dank und schönen Gruß, Frank

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 03.08.05 12:43 
Man siehe in user profile iconKeldorns Post: www.delphi-forum.de/...highlight=jpg+stream

Einzige Ausnahme: TPicture und andere Objekte kannst Du nicht direkt Streamen ... Die Objekte bieten aber häufig eine Möglichkeit sich selbst in einen Stream zu speichern ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Keldorn
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Mi 03.08.05 19:28 
user profile iconWileECoyote hat folgendes geschrieben:

Kann ich diese beiden Records nun in eine Datei packen? Und wenn ja (man hat mir ja schon gesagt, dass es geht)
wie?

das steht doch schon in den obengenannten links. ich persönlich würde das ganze objektorientiert aufbauen und statt der verkettetetn Liste gleich eine objektliste nehmen. Den objekten verpaßt du dann saveto und loadfromstream-methoden und die speichern jeweils nur die daten des jeweiligen objektes. Du kannst natürlich auch verschiedene Objekte in den stream speichern, du mußt nur darauf achten, das du sie in der gleichen Art und Weise einliest, wie du sie reingeschrieben hast.

Zitat:
Außerdem würde ich dann ganz gerne für einige Datenfelder auch unbegrenzte Strings nehmen?

dann tu es doch, den Twriter/Treader ist das egal. Wenn du strings in einen Stream speicherst, schreibst du zuerst die Länge des strings und dann den inhalt. Beim Auslesen des ganzen genau andersrum, erst die länge lesen, Größe des strings setzen und den inhalt auslesen. Wenn du den Twriter/Reader verwendest, brauchst du dich darum nicht zu kümmern, ein writestring/readstring reicht. intern arbeiten diese Methoden genauso.

Zitat:

Und wie prüft man, dass der Anwender die Datei nicht zerstört hat?

jeder, der einen Stream öffnet und ändern wikll, ist selber schuld. Auch wenn du nur strings drin speicherst, du kannst nichts ändern. Würdest du die Datei öffnen und irgendwo ein Zeichen hinzufügen, müßtest du auch die Größenangaben davor ändern und das wird so einfach nicht funktionieren. Verhindern kannst du das nicht. Aber jeder, der einen stream öffnet, sollte erkennen, das er dort nichts ändern kann.

Mfg Frank

_________________
Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
WileECoyote Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 82



BeitragVerfasst: Mi 03.08.05 19:35 
hey leute, vielen dank erstmal für die vielen infos.
werde mich da jetzt mal ransetzen und versuchen, dass zusammenzukleben
und mich dann ggf. nochmal melden.

dieses forum ist echt klasse, wäre schon öfter mal aufgeschmissen gewesen,
wenn man hier nicht immer gute ratschläge und how-to´s bekommen würde.

gruß, Wile E.