Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Nicht Finalisierten Datensatz in eine Datei schreiben!


Prinzz - Di 03.02.04 14:14
Titel: Nicht Finalisierten Datensatz in eine Datei schreiben!
Hallo Leute!

Ich hab da mal wieder ein Problem, dass ich einfach nicht gelöst bekomme! Ich würde gerne einen Datensatz


Quelltext
1:
2:
3:
4:
5:
6:
type
  Datensatz=record
       Pasw: String[10];
       Name: String[8];
       Text: String {bzw. TStringList}
     end;


in eine Datei schreiben, das ist aber auf die Art und Weise in Delphi nicht möglich, das weiß ich schon.

Bei Text: String gibts ne Fehlermeldung, bei Text: TStringList nicht, es funzt aber trotzdem nicht, er schreibt es nicht rein!

Ich muss das unbedingt gelöst bekommen, kann mir bitte jemand weiterhelfen, oder wenigstens sagen, ob er auch schonmal Probleme damit hatte und wie er sich dann alternativ beholfen hat!?

Wäre euch sehr dankbar :D

Gruß Tobi


Maa83 - Di 03.02.04 16:08
Titel: Hallo
hab ich dich richtig verstanden:

du möchtest die 3 Werte des Records in eine Text-Datei abspeichern???

Untereinander oder Nebeneinader mit | getrennt oder wie?

erklär mir das mal nochmal genauer bitte dann schaun wir mal... :)


Maa83 - Di 03.02.04 16:09
Titel: Hallo
hab ich dich richtig verstanden:

du möchtest die 3 Werte des Records in eine Text-Datei abspeichern???

Untereinander oder Nebeneinader mit | getrennt oder wie?

erklär mir das mal nochmal genauer bitte dann schaun wir mal... :)


Prinzz - Di 03.02.04 17:24

Nönö :-)

Ich hab mir das so vorgestellt, dass ich eine


Quelltext
1:
var f: file of Datensatz;                    


und eine


Quelltext
1:
   dat: Datensatz;                    


Variable habe, und dann mittels


Quelltext
1:
2:
3:
4:
seek(f,egal);
write(f,dat);
seek(f,egal+1);
read(f,dat);


mit der Datei umgehen kann, aber irgendwie ist das nicht möglich... Weißt du da weiter?


rokdd - Di 03.02.04 17:36
Titel: stream?
hallo,
warum nicht die daten als stream speichern??? Müsstet die dann nacheinander einzeln reinschreiben und in der gleichen reihenfolge wieder heraus!


rokdd


Prinzz - Di 03.02.04 17:43

Hm, Stream, was ist das? Hab ich noch nie mit gearbeitet, ich kann ja mal gucken, ob ich hier was brauchbares drüber finde, aber wenns dir nichts ausmacht, kannst du vielleicht kurz schreiben, wie das funktioniert und dann kann ich mich da mal reinarbeiten, wenn das damit geht...


rokdd - Di 03.02.04 17:50

okay!
hier der quellcode der mein dateityp erzeugt:
[code]
type
Tbook=Record
titel:ansistring;
RSN:ansistring;
BC:ansistring;
Autor:ansistring;
Status:integer;
kommentar:ansistring;
bibo:integer;
sprache:integer;
datum:TDatetime;
category:integer;
id:integer;
end;
var books: array of Tbook;
[/code]

und schließlich das speichern:

[code]
var FS: TFileStream;
L,len, i: integer;
begin
fs:=Tfilestream.Create('C:\Programme\D-Verwaltung\'+users[c_user].name+'\save_book.mdb',fmcreate);
len:=length(books);
fs.write(len,sizeof(len));
for i:=0 to len-1 do begin
l:=length(books[i].titel);
fs.Write(l,sizeof(l));
fs.Write(PChar(books[i].titel)^, l);

l:=length(books[i].RSN);
fs.Write(l,sizeof(L));
fs.Write(PChar(books[i].rsn)^, L);

l:=length(books[i].BC);
fs.Write(l,sizeof(L));
fs.Write(PChar(books[i].bc)^, L);

l:=length(books[i].Autor);
fs.Write(l,sizeof(L));
fs.Write(PChar(books[i].autor)^, L);

l:=length(books[i].kommentar);
fs.Write(l,sizeof(L));
fs.Write(PChar(books[i].kommentar)^, L);

fs.Write(books[i].category,sizeof(books[i].category));

fs.Write(books[i].bibo,sizeof(books[i].bibo));

fs.Write(books[i].sprache,sizeof(books[i].sprache));

fs.Write(books[i].status,sizeof(books[i].status));

fs.Write(books[i].datum,sizeof(books[i].datum))
end;[/code]

Zu beachten ist dabei dass der string folgendermaßen geschreiben wird: erst die länge des strings und dann der string selber Z.B.
12
Hallo

Das Lesen der datei funktioniert ähnlich. auch ncoh posten???[/code]


Prinzz - Di 03.02.04 18:00

Das hört sich ja schonmal ganz gut an, ist ja das, was ich brauche. Nur was ist jetzt wenn ich einen ganz bestimmten Datensatz auslesen will? Ich meine hier kann ich ja nur einen nach dem anderen ansteuern!?

Und wie lösche ich etwas aus der Datei oder lege sie neu an? Hab nix zu in der Hilfe gefunden :-)

Übrigens Danke für deine Hilfe, wenn das erst mal klappt ist das sicher viel praktischer als diese blöden begrenzten Dateien die ich bisher benutzt habe :-)


rokdd - Di 03.02.04 18:03

hallo,
ich mache das immer folgendermaßen:
dateien vollständig in array übergeben
array editieren
array in datei schreiben, bei terminate

die daten änderst du dann einfach über:
books[3].titel:='';
logisch, oder? weiß aber was du für ein problem meinst aber das gleiche hast du doch auch mit deiner methode! oder?

rokdd


rokdd - Di 03.02.04 18:05

soory heb deinen letzten teil der frage vergessen!
also die datei wird neu angelegt da beim createn des streams in den parmatern fmcreate steht. löschen kannst du die datei mit: deletefile(path:string);
kopiernen mit
copyfileto(pathstring); braucht aber glaube ich die unit idglobal


rokdd


Prinzz - Di 03.02.04 18:17

Hm, das Problem beim Array ist ja, dass du wieder ne obere Grenze bekommst, das wollte ich ja eben gerade vermeiden... weiß jetzt auch nicht so recht, ich werde mal ein bisschen rumprobieren und denn sehen wir mal weiter...


PS: Kannst du die Read-Procedure doch nochmal posten, kapier das nicht mit den Pointern da...
Sorry für den vielen Aufwand...


rokdd - Di 03.02.04 18:22

der array den ich dir gepostet ahbe ist dynamisch.
setlength(books,4) setzt den array of 4 elemente

rokdd


Prinzz - Di 03.02.04 18:28

Man lernt doch immer wieder dazu, ich wusste gar nicht, das so etwas in Delphi möglich ist, auf die Idee es auszuprobieren nen Array einfach ohne Grenzen hinzuschreiben kommt man natürlich nicht :-) Sooo doof :-)


rokdd - Di 03.02.04 18:29

bekommst du das elsen alleine hin??? wenn nicht kannst du mir auch eine mail schreiben!


rokdd


rokdd - Di 03.02.04 18:55
Titel: read
hier der code:
beim öffnen des streams gibst du an in wie weit die adneren rechte auf diese datei werden des öffnens haben. bei mir bleiben alle rechte für andere programme offen(anstatt des fmcreate)
ansonsten liest du die ben mit der schleife aus und stzt vorher die array länge die aus der datei gelesen wurde ein.

rokdd


procedure Tfrm_book.open;
var FS: TFileStream;
Len,l, i: Cardinal;
begin
try
FS := TFileStream.Create('C:\Programme\D-Verwaltung\'+users[c_user].name+'\save_book.mdb',
(*fmOpenRead or *)fmShareDenynone);
except
showmessage('öffnen von modulbook fehlgeschlagen! bitte nutzen sie ggf. die Notfalltools!');
end;
fs.read(len,sizeof(len));
Setlength(books,len);
for I:=0 to len-1 do begin
fs.read(l,sizeof(l));
Setlength(books[i].titel,l);
fs.read(PChar(books[i].titel)^, L);

fs.read(l,sizeof(L));
Setlength(books[i].RSN,l);
fs.read(PChar(books[i].rsn)^, L);

fs.read(l,sizeof(L));
Setlength(books[i].BC,l);
fs.read(PChar(books[i].bc)^, L);

fs.read(l,sizeof(L));
Setlength(books[i].Autor,l);
fs.read(PChar(books[i].autor)^, L);

fs.read(l,sizeof(L));
Setlength(books[i].kommentar,l);
fs.read(PChar(books[i].kommentar)^, L);

fs.read(books[i].category, sizeof(books[i].category));

fs.read(books[i].bibo, sizeof(books[i].bibo));

fs.read(books[i].sprache, sizeof(books[i].sprache));

fs.read(books[i].status, sizeof(books[i].status));

fs.read(books[i].datum, sizeof(books[i].datum));
end;
fs.Free;
end;