Entwickler-Ecke

Dateizugriff - Etwas aus ner geschriebenen Datei auslesen ?


Delete - Fr 11.11.05 18:45
Titel: Etwas aus ner geschriebenen Datei auslesen ?
Hi Leute,
Ich hab seit ein paar Wochen angefangen in Delphi zu programmieren.
Ich hab jetzt ein kleines Programm geschrieben mit dem ich Texdateien, die 2 Eingaben aus 2 Edit Feldern speichern, erstellen, löschen und bearbeiten kann. Die Textfiles die im Ordner der exe Datei enthalten sind werden über eine Listbox angezeigt. Über die Listbox wird auch
der Dateiname ausgelesen. Das neu erstellen und das löschen klaptt schon ganz gut, aber ich weis nicht wie ich die Dateien zum bearbeiten einlesen soll.

Könnt ihr mir bitte helfen ?
Das Programm hab ich mit Delphi 2005 erstellt.
Das Programm hab ich an den Post angehängt.

Hier noch der Quelltext

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
unit Eintrag;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ListBox1: TListBox;
    name: TEdit;
    alter: TEdit;
    speichern: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure speichernClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  searchResult:TSearchRec;
  name,alter,bearbeiten,filename:shortstring;
  data:textfile;
  listboxindex:integer;


implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
if FindFirst('*.txt', faAnyFile, searchResult) = 0 then
repeat
listbox1.items.add(searchResult.Name);
until FindNext(searchResult) <> 0;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
alter.Visible := true;
name.Visible := true;
speichern.Visible := true;
end;

procedure TForm1.speichernClick(Sender: TObject);
begin
filename:=name.Text+'.txt';
AssignFile(data,filename);
rewrite(data);
writeln(data,name.text,',',alter.text);
Closefile(data);

listbox1.Clear;
if FindFirst('*.txt', faAnyFile, searchResult) = 0 then
repeat
listbox1.items.add(searchResult.Name);
until FindNext(searchResult) <> 0;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
listboxindex:=listbox1.ItemIndex;
edit1.Text:=floattostr(listboxindex);
Edit2.Text:=ListBox1.Items.Strings[ListBox1.ItemIndex];

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
alter.Visible := true;
name.Visible := true;
speichern.Visible := true;

?????????????????????????????????????????????
was muss hier hin um die Datei auszulesen ?
end;

procedure TForm1.Button3Click(Sender: TObject);
var
pfad:shortstring;
begin
pfad:=extractfilepath(application.exename);
deletefile(edit2.text);

listbox1.Clear;
if FindFirst('*.txt', faAnyFile, searchResult) = 0 then
repeat
listbox1.items.add(searchResult.Name);
until FindNext(searchResult) <> 0;
end;

end.


Moderiert von user profile iconGausi: Quote- durch Delphi-Tags ersetzt


Narses - Fr 11.11.05 19:08

Moin!

Zunächstmal: Du gehst etwas sehr umständlich an das Problem ran, da du für jeden Datensatz eine Datei erstellst. Es wäre sehr viel einfacher, wenn du alle Datensätze in eine Datei speichern würdest. Mach dich mal über INI-Dateien schlau, das sollte dir helfen.

Jetzt zu deinem Programm und den Problemen:
1. Du hast einen krassen Fehler drin: du verwendest FindFirst() ohne anschließend ein FindClose() zu machen! :shock: So gehts richtig:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.FormCreate(Sender: TObject);
begin
  if FindFirst('*.txt', faAnyFile, searchResult) = 0 then
    repeat
      listbox1.items.add(searchResult.Name);
    until FindNext(searchResult) <> 0;
  FindClose(searchResult);
end;

2. Du solltest deinen Code einrücken, damit kann man wesentlich besser den Überblick behalten!
3. Du speicherst die Daten in den Dateien in einer Zeile mit Komma. Besser wäre es, wenn du die beiden Werte in je einer eigenen Zeile speichern würdest:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
filename := name.Text +'.txt';
AssignFile(data,filename);
ReWrite(data);
WriteLn(data,name.text);
WriteLn(data,alter.text);

CloseFile(data);

Dann kannst du so die Daten wieder auslesen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
filename := name.Text +'.txt';
AssignFile(data,filename);
ReSet(data);
ReadLn(data,name.text);
ReadLn(data,alter.text);

CloseFile(data);

cu
Narses


Muffin - Sa 12.11.05 20:14

In dem Fall würde ich zu typisierten Daten raten.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
type datensatz = record
       name: shortstring;
       adresse: shortstring;
     end;

var datei: file of datensatz;


Lesen und Schreiben funktioniert sehr einfach:


Delphi-Quelltext
1:
2:
3:
read(datei, datensatz);
edit1.text := datensatz.name;
edit2.text := datensatz.adresse;



Delphi-Quelltext
1:
2:
3:
datensatz.name := edit1.text;
datensatz.name := edit2.text;
write(datei,datensatz);


Genaueres findest du hier: http://www.dsdt.info/tutorials/typdateien/


Delete - Mo 14.11.05 19:31

Danke für die tollen Tips ;-)
Werde das nacher gleich mal ausprobieren.