Autor |
Beitrag |
Prinzz
      
Beiträge: 31
|
Verfasst: 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
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
Gruß Tobi
|
|
Maa83
      
Beiträge: 160
Win XP Pro
D6 Ent
|
Verfasst: 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
      
Beiträge: 160
Win XP Pro
D6 Ent
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
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
      
Beiträge: 329
Win XP
D6
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 329
Win XP
D6
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 329
Win XP
D6
|
Verfasst: 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
      
Beiträge: 329
Win XP
D6
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 329
Win XP
D6
|
Verfasst: 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 
      
Beiträge: 31
|
Verfasst: 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
      
Beiträge: 329
Win XP
D6
|
Verfasst: Di 03.02.04 18:29
bekommst du das elsen alleine hin??? wenn nicht kannst du mir auch eine mail schreiben!
rokdd
|
|
rokdd
      
Beiträge: 329
Win XP
D6
|
Verfasst: 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;
|
|
|