![]() |
Records
Hallo DP-lers!
Ich habe eigentlich noch nie wirklich mit Records gearbeitet, jedoch wollte ich es gerne ändern. Im Prinzip ist das Programm, was ich zum üben schreiben möchte eine Adressbuchverwaltung. Ich habe dafür einen Typ 'Datensatz' deklariert:
Delphi-Quellcode:
Danach habe ich die Variable 'datei' deklariert:
type Datensatz = record
vorname: string[25]; nachname: string[25]; tag: integer; monat: integer; jahr: integer; bild: string[100]; end;
Delphi-Quellcode:
var datei: file of Datensatz;
Des Weiteren habe ich laut Tutorial folgende Prozeduren erstellt:
Delphi-Quellcode:
Weitergehend verstehe ich das Umgehen mit den Records nicht wirklich.
//Zum Öffnen der Datei
procedure TForm1.FormCreate(Sender: TObject); begin AssignFile(datei,'daten.dat'); if FileExists('daten.dat') then ReSet(datei) else ReWrite(datei); end; //Zum Schließen der Datei procedure TForm1.FormDestroy(Sender: TObject); begin CloseFile(datei); end; Also wenn ich jetzt mehrere Personen abspeichern will, wie mache ich das? Und wie kann ich diese wider aufrufen? Eigentlich will ich nur Strings aus Edit-Feldern speichern und dann den gewünschten Datensatz wieder in diese Felder laden. Kann mir das jemand nochmal erklären? Danke :) PS: ![]() |
Re: Records
Also:
Delphi-Quellcode:
Mit FileSize(datei) bekommst Du heraus wie viele Datensätze Deine Datei enthält.
var
data : Datensatz; .. Read(datei,data); Write(datei,data); data.vorname:=edit1.text; data.nachname:=edit2.text; .. Mit Seek(datei,DatensatzNummer) kannst Du direkt zu einem Datensatz gelangen. Grüße Klaus |
Re: Records
Erstmal vorweg: den Dateinamen ohne jeden Pfad ist schonmal gefährlich, denn falls mal ne Verknüpfung drauf erstellt wird, vielleicht mit anderem Arbeitspfad, sucht das Programm die schon woanders, und dann wundert man sich natürlich, warum das Programm die Daten auf einmal nicht mehr findet...
Die Daten im Programmverzeichnis an sich sind natürlich auch so eine don't-do-Sache, aber fürs üben... Bleibt zu meinem Vorredner noch EoF (End-of-File) zu erwähnen, will man einfach alle Daten nacheinander auslesen:
Delphi-Quellcode:
Und in ganz weiter Ferne merkt man dann irgendwann, daß es mit einer TCollection irgendwie komfortabler ist ;)
while not EoF(datei) do begin
Read(datei, satz); Verarbeite(satz); end; |
Re: Records
Delphi-Quellcode:
Schreibe ich so am Ende der Datei den String aus Edit1 ?
var z : integer;
person : Datensatz; z:=FileSize(datei); Seek(datei,z); Write(datei,person); person.vorname:=edit1.text; |
Re: Records
Delphi-Quellcode:
[edit] paar fehler beseitigt^^[/edit]
type TDatensatz = record
vorname: string[25]; nachname: string[25]; tag: integer; monat: integer; jahr: integer; bild: string[100]; end; var Tabelle: Array of TDatensatz; //... procedure SaveToFile(Dest: string); var f: file of TDatensatz; I: Cardinal; begin try assignFile(f, Dest); reWrite(f); //oder reset(f) for I := low(Tabelle) to high(Tabelle) do write(f, Tabelle[i]); finally closeFile(f); end; end; function LoadFromFile(Source: string); var f: file of TDatensatz; I: Cardinal; begin I := 0; try assignFile(f, Source); reset(f); SetLength(Tabelle, FileSize(f)); while not eof(f) do begin read(f, Tabelle[I]); Inc(I); end; finally closeFile(f); end; end; procedure irgendwas; begin LoadFromFile('C:\Test.dat'); if high(Tabelle) > 0 then begin Tabelle[0].Vorname := editVorname.text; editNachname.Text := Tabelle[0].Nachname; end; SaveToFile('C:\Test.dat'); end; |
Re: Records
Ich will bloß mal kurz sagen, dass es nach dem Lesen dieses wunderbaren Tutorials eigentlich keine probleme mehr geben sollte! Jedenfalls nicht, wenn man es ordentlich durchgelsen hat und auch mal ein bisschen rumgebastelt hat!!!
Ich hatte damals auf jeden Fall sofort typisierte Dateien anwenden können... mithilfe jenes Tutorials von dsdt!!! |
Re: Records
Im Prinzip funktionieren Records doch wie INI-Files. Nur das es jetzt nicht mehr egal ist, ob man es an Anfang oder Ende schriebt!?
Ok danke, ich glaube ich werde es hinbekommen. :dp: |
Re: Records
Es funktioniert doch noch nicht :(
1. Fehlermeldung:
Delphi-Quellcode:
benötigt Ereigenistyp. Ist das dann auch 'string' ?
function LoadFromFile(Source: string);
2. Fehler:
Delphi-Quellcode:
Das Programm stürzt wegen Zeile 9 ab.
procedure SaveToFile(Dest: string);
var f: file of TDatensatz; I: Cardinal; begin try assignFile(f, Dest); reWrite(f); //oder reset(f) for I := low(Tabelle) to high(Tabelle) do write(f, Tabelle[i]); finally closeFile(f); end; end;
Delphi-Quellcode:
So kann man doch nur an die Stelle 0 der Tabelle schreiben!?
LoadFromFile('C:\test.dat');
if high(Tabelle) > 0 then begin Tabelle[0].Vorname := Edit1.Text; //Edit2.Text := Tabelle[0].Nachname; end; SaveToFile('C:\test.dat'); Helft mir bitte :) |
Re: Records
Delphi-Quellcode:
Tabelle[1].
|
Re: Records
ok, da nehm ich halt ne Schleife. Aber das Programm stürzt ja ab. Ich kann es gar nicht ausprobieren :(
|
Re: Records
Zitat:
Wie hast du Tabelle deklariert ? |
Re: Records
Delphi-Quellcode:
Hab es so versucht, wie oben beschrieben!
type TDatensatz = record
vorname: string[25]; nachname: string[25]; tag: integer; monat: integer; jahr: integer; bild: string[100]; end; var Tabelle: Array of TDatensatz; |
Re: Records
Wie groß ist der (dynamsiche) Array?
|
Re: Records
Zitat:
Reicht
Delphi-Quellcode:
?
var Tabelle: Array[1..100] of TDatensatz;
|
Re: Records
Kommt auf die Anzahl der Datensätze an. Bei der dynamsichen Methode kann man mit setLength die Größe ändern.
|
Re: Records
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Jedoch habe ich immer noch einen Fehler, wenn ich schreiben will! *schnipp* [edit=Sharky]Bild als Anhang eingefügt. Mfg, Sharky[/edit] |
Re: Records
|
Re: Records
Zitat:
|
Re: Records
Und in der Tabelle steht auch was drin?
Kannst Du einmal Deinen SourceCode anhängen? Grüße Klaus |
Re: Records
Delphi-Quellcode:
Hier deklariere ich meine Variablen und Typen!
type TDatensatz = record
vorname: string[25]; nachname: string[25]; initialen: string[5]; tag: integer; monat: integer; jahr: integer; position: string[5]; amt: string[5]; verein: string[50]; status: string[10]; bild: string[100]; end; var Form1: TForm1; datei: file of TDatensatz; tabelle: array of TDatensatz; f: file of integer;
Delphi-Quellcode:
Hier die beiden Prozeduren!
{Speicher- und Ladefunktionen}
procedure SaveToFile(Dest: string); var f: file of TDatensatz; I: Cardinal; begin try assignFile(f, Dest); reWrite(f); //oder reset(f) for I := low(Tabelle) to high(Tabelle) do write(f, Tabelle[i]); finally closeFile(f); end; end; procedure LoadFromFile(Source: string); var f: file of TDatensatz; I: Cardinal; begin I := 0; try assignFile(f, Source); reset(f); SetLength(Tabelle, FileSize(f)); while not eof(f) do begin read(f, Tabelle[I]); Inc(I); end; finally closeFile(f); end; end;
Delphi-Quellcode:
Hier will ich mit einem Button Daten speichern!
{Daten in Record speichern}
LoadFromFile('C:\test.dat'); if high(Tabelle) > 0 then begin Tabelle[0].Vorname := Edit1.Text; //Edit2.Text := Tabelle[0].Nachname; end; SaveToFile('C:\test.dat'); Ich habe alles aus diesem Thread. Aber ich verstehe das immer noch nicht so ganz :( |
Re: Records
Hai The Lord,
kannst Du das Bild bitte als Anhang an dein Posting hängen? Nicht jeder hat eine DSL-Leitung und möchte sich um den Thread lesen zu können eine 100 kByte Datei runterladen müssen. Danke. |
Re: Records
Hab schon Ewigkeiten nur noch mit Streams bzw. vorher BlockRead/BlockWrite gearbeitet, aber kann es nicht sein, daß das eigentlich so lauten müsste?
Delphi-Quellcode:
reWrite(f, SizeOf(TDatensatz));
|
Re: Records
Zitat:
Es kann nur mit reset keine Datei erstellt werden. Grüße KLaus |
Re: Records
Ich glaub Du hast den springenden Punkt übersehen: die Größe der Datensätze anzugeben hat null zu tun damit, ob die Dateien existieren. Daß der Parameter für die Datensatzgröße auch für Reset und nicht nur für Rewrite zu verwenden ist, hatte ich jetzt als selbstverständlich angesehen ;)
Oder willst Du damit sagen, daß ein Reset die Größe automatisch errät? Da das aber nicht am Dateiinhalt liegen könnte, verstehe ich auch dann nicht, warum Du auf den Hinweis zwischen Reset und Rewrite hinweist, schließlich müsste Rewrite die dann auch wissen :shock: |
Re: Records
Hallo CCRDude,
nun Deinen springenden Punkt habe ich nicht gesehen. Zitat:
Zitat:
Grüße Klaus |
Re: Records
Ah ok, sorry, hab wie gesagt schon ewig nicht mehr auf diese Weise Dateien angefasst, war daher nur ne entfernte Idee ;)
|
Re: Records
Zitat:
Ich kann nur 24h lang den Beitrag editieren. Tut mir leid! Muss vielleicht ein Moderator das Bild zu einem Link machen! Und gibt es schon eine Lösung für das Problem? :( |
Re: Records
Endlich! Ich habe es jetzt geschafft. Habe einfach alles von vorne gemacht und es funktioniert. Aber trotzdem bedanke ich mich natürlich für eure Bemühungen :)
:dp: |
Re: Records
Hallo ich habe genau so ein problem, nur dass bei mir immer angezeigt wird: "Datezugriff Verweigert"
Ich hab keine Ahnung woran das liegen könnte!!
Delphi-Quellcode:
type woerterbuch = record
de: array[1..5] of string[25]; en: array[1..5] of string[25]; end; vokabellist = record de: array[1..5] of string[25]; en: array[1..5] of string[25]; gewesen : boolean; klasse : word; end; var l : TListItem; datei_name: string; data : woerterbuch; woerter : file of woerterbuch; vlist : file of vokabellist; loades : record de : array[1..5] of string[25]; en : array[1..5] of string[25]; gewesen : boolean; klasse : word; end;
Delphi-Quellcode:
Kann mir vielleicht jemand helfen???
assignFile(woerter,'Datenbank.rec');
for i:=1 to 5 do begin data.de[i]:=loades.de[i]; data.en[i]:=loades.en[i]; write(woerter,data); end; reset(woerter); with listview1.items.add do begin if (sprache1_lbl.Caption='Deutsch') then begin l.Caption:=ltempd; l.SubItems.Add(ltempe); end; if (sprache1_lbl.Caption='Englisch') then begin l.Caption:=ltempe; l.SubItems.Add(ltempd); end; Danke! mfg magsec_87 |
Re: Records
sag mal, wo kommt denn der fehler???
hab meine kristallkugel, leider in der firma gelassen... |
Re: Records
Bei
Delphi-Quellcode:
write(woerter,data);
|
Re: Records
Du solltest erst die Datei öffnen (reset, rewrite) und dann schreiben.
Ich vermute du verwechselst da was: reset - öffnen der Datei closefile - schließen der Datei |
Re: Records
Danke, aber selbst mit reset funzt es leider nicht... :wall:
Ich hab jetzt nochmal ein neus kleineres programm geschrieben. Nur zum füllen der Datenbank (enthält: edit1:**,edit2.**,Listview.**,ein button zum einlesen) edit1..: deutsch edit2..:englich (Wörterbuch Datenbank)
Delphi-Quellcode:
Leider tritt immer noch irgendein Fehler auf! Das Programm erstellt noch nichtmals die datei!? :gruebel:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; ListView1: TListView; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type woerterbuch = record de: array[1..5] of string[25]; en: array[1..5] of string[25]; end; vokabellist = record de: array[1..5] of string[25]; en: array[1..5] of string[25]; gewesen : boolean; klasse : word; end; var Form1 : TForm1; l : TListItem; data : woerterbuch; woerter : file of woerterbuch; vlist : file of vokabellist; loades : record eng,deu : string; de : array[1..5] of string[25]; en : array[1..5] of string[25]; gewesen : boolean; klasse : word; end; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; ltempe,ltempd:string; begin for i:=1 to 5 do begin if (pos(edit1.Text,','))>0 then begin loades.de[i]:=copy(edit1.Text,0,pos(edit1.Text,',')-1); ltempe:=edit1.Text; delete(ltempd,0,pos(edit1.Text,',')+1); edit1.Text:=ltempd; end else loades.de[i]:=copy(edit1.Text,0,length(edit1.Text)); end; for i:=1 to 5 do begin if (pos(edit2.Text,','))>0 then begin loades.en[i]:=copy(edit2.Text,0,pos(edit2.Text,',')-1); ltempe:=edit2.Text; delete(ltempe,0,pos(edit2.Text,',')+1); edit2.Text:=ltempe; end else loades.en[i]:=copy(edit2.Text,0,length(edit2.Text)); end; assignFile(woerter,'Datenbank.rec'); reset(woerter); if FileExists('Datenbank.rec') then ReSet(woerter) else ReWrite(woerter); for i:=1 to 5 do begin data.de[i]:=loades.de[i]; data.en[i]:=loades.en[i]; write(woerter,data); end; closefile(woerter); with listview1.items.add do begin l.Caption:=ltempd; l.SubItems.Add(ltempe); end; end; end. Kann mir bitte jemand helfen!!! :hello: DANKE!!! MFG magsec_87 :arrow: PS: Die einleseform:zB: "Hallo, Hi, Guten Tag" <bis zu fünf Wortteile getrennt durch kommas!! |
Re: Records
Was machst denn du da?
Delphi-Quellcode:
Erst schießen und dann fragen, wen man getroffen hat mögen auch die Rechner nicht :mrgreen:
// Dateivariable initialisieren
assignFile(woerter,'Datenbank.rec'); //Datei öffnen (hier kracht es, wenn die Datei nicht vorhanden ist) reset(woerter); //und jetzt erst fragen, ob die Datei überhaupt existiert if FileExists('Datenbank.rec') then ReSet(woerter) else ReWrite(woerter); |
Re: Records
Ja hast recht, aber auch wenn ich for der abfrage das reset weglasse bleibt der trotzdem hängen!!!
weist du auchdarauf eine lösung?? Kann es vielleicht mit dem speichertyp zusammenliegen??? Ich weis nämlich nicht ob man arrays speichern kann! |
Re: Records
Hi,
bei mir kam hier ein Fehler:
Delphi-Quellcode:
var li : TListItem; ... closefile(woerter); li := ListView1.Items.Add;//so geht es bei mit li.Caption:= ltempd; li.SubItems.Add(ltempe); (*with listview1.items.add do begin l.Caption:=ltempd; l.SubItems.Add(ltempe); end; *) |
Re: Records
Es funktioniert leider immer noch nicht, obwohl ich jetzt keine arrays mehr speichr und eure vorschläge berücksichtigt habe.
Einziger positiver effekt: Keine Fehlermeldung mehr, dafür macht das programm jetzt garnichts mehr.
Delphi-Quellcode:
Wieder die glsichen vorraussetzungen: Listview;zwei edits: eins für deutsch andere englisch; und ein buttton fürs speichern und eintragen
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Label1: TLabel; Label2: TLabel; Button1: TButton; ListView1: TListView; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; type woerterbuch = record de1,de2,de3,de4,de5,de,en1,en2,en3,en4,en5,en:string[25]; end; vokabellist = record de1,de2,de3,de4,de5,de,en1,en2,en3,en4,en5,en:string[25]; gewesen : boolean; klasse : word; end; var Form1 : TForm1; l : TListItem; data : woerterbuch; woerter : file of woerterbuch; vlist : file of vokabellist; loades : record eng,deu : string; de : array[1..5] of string[25]; en : array[1..5] of string[25]; gewesen : boolean; klasse : word; end; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; ltempe,ltempd:string; begin if (edit1.text<>'') or (edit2.text<>'') then begin if (pos(edit1.Text,','))>0 then begin for i:=1 to 5 do begin loades.de[i]:=copy(edit1.Text,0,pos(edit1.Text,',')-1); ltempd:=edit1.Text; delete(ltempd,0,pos(edit1.Text,',')+1); edit1.Text:=ltempd; showmessage('ltempd: '+ltempd); end; if pos(edit1.Text,',')=0 then begin ltempd:=edit1.Text; loades.de[1]:=copy(edit1.Text,0,length(edit1.Text)); loades.de[2]:=''; loades.de[2]:=''; loades.de[3]:=''; loades.de[4]:=''; end; end; if (pos(edit2.Text,','))>0 then begin for i:=1 to 5 do begin loades.en[i]:=copy(edit2.Text,0,pos(edit2.Text,',')-1); ltempe:=edit2.Text; delete(ltempe,0,pos(edit2.Text,',')+1); edit2.Text:=ltempe; end; if pos(edit2.Text,',')=0 then begin ltempe:=edit2.Text; loades.en[1]:=copy(edit2.Text,0,length(edit2.Text)); loades.en[2]:=''; loades.en[2]:=''; loades.en[3]:=''; loades.en[4]:=''; end; end; assignFile(woerter,'Datenbank.rec'); if FileExists('Datenbank.rec') then ReSet(woerter) else ReWrite(woerter); begin data.de:=ltempd; data.de1:=loades.de[1]; data.de2:=loades.de[2]; data.de3:=loades.de[3]; data.de4:=loades.de[4]; data.de5:=loades.de[5]; data.en:=ltempe; data.en1:=loades.en[1]; data.en2:=loades.en[2]; data.en3:=loades.en[3]; data.en4:=loades.en[4]; data.en5:=loades.en[5]; write(woerter,data); end; closefile(woerter); l := ListView1.Items.Add; l.Caption:= ltempd; l.SubItems.Add(ltempe); end; end; end. Langsam verzweifle ich. |
Re: Records
Hallo,
Zitat:
Delphi-Quellcode:
Das hast du gleich an etlichen Stellen zu stehen.
if (pos(',', edit1.Text))>0 then
Zitat:
Zitat:
Delphi-Quellcode:
delete(ltempd, 1, pos(',',edit1.Text));
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz