Autor Beitrag
Prinzz
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Di 03.02.04 14:14 
Hallo Leute!

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

Win XP Pro
D6 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 160

Win XP Pro
D6 Ent
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Di 03.02.04 17:24 
Nönö :-)

Ich hab mir das so vorgestellt, dass ich eine

ausblenden Quelltext
1:
var f: file of Datensatz;					


und eine

ausblenden Quelltext
1:
   dat: Datensatz;					


Variable habe, und dann mittels

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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...


Zuletzt bearbeitet von Prinzz am Di 03.02.04 18:23, insgesamt 1-mal bearbeitet
rokdd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: Di 03.02.04 18:29 
bekommst du das elsen alleine hin??? wenn nicht kannst du mir auch eine mail schreiben!


rokdd
rokdd
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: 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;