Entwickler-Ecke

Dateizugriff - in eine kleine Datei speichern


FredAffe - Do 27.06.02 13:39
Titel: in eine kleine Datei speichern
Hilo alle!

Ich versuche gerade, Delphi klar zu machen, dass es einen Wert (z.B. edit1.text) in eine Datei speichert, und wenn diese nicht da ist, sie zuerst erstellt. Wie kann ich ihm das beibringen? Wie kann ich die datei und den string-wert dann wieder laden?


Klabautermann - Do 27.06.02 14:21

Hallo,

Hier mal als beispiel, für genaue erklärungen einfach mal in die Online-Hilfe gucken ;).


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:
procedure WirteToFile(aFileName, aText : STRING);
  VAR
    f : TextFile;
BEGIN
  AssignFile(f, aFileName);
  IF FileExists(aFileName) THEN
    Append(f)
  ELSE
    Rewrite(f);
  WriteLn(f, aText);
  CloseFile(f);
END; // Wirte To File

function ReadFromFile(aFileName : STRING) : STRING;
  VAR
    f : TextFile;
    ActLine : STRING;
BEGIN
  RESULT := '';
  IF FileExists(aFileName) THEN BEGIN
    AssignFile(f);
    Reset(f);
    While NOT EOF(f) DO BEGIN
      ReadLn(f, ActLine);
      IF Result <> '' THEN
        Result := Result + #13#10;
      Result := Result + ActLine;
    END; // Bis zum Dateiende
    CloseFile(f);
  END; // Datei Existiert
END; // ReadFromFile


Die erste Procedure schreibt einen Sting in die angegebene Datei. Ist diese vorhanden wird der Text an den bestehenden angehängt. Exestiert sie nicht wird sie angelegt. Der übergebene FileName muss den kompletten Pfad und den Dateinen enthalten.

Die zwiete Funktion Liest alle Zeilen aus einer Datei und liefed diese als String zurück. Sind mehr als eine Zeile enthalten werden Zeilenumbrüche in den Ergebnisstring eingefügt.

Das ganze habe ich eben hier im Browser getippt also musst du unter Umständen den einen oder anderen Tippfehler korrigieren.

Verbesungsvorschlag: Die sicherheit dieser Methoden kann durch weiter Fehlerabfänge erhöht werden siehe hierzu IORESULT und TRY EXCEPT.

Gruß
Klabautermann


FredAffe - Do 27.06.02 16:41

Danke erstmal, funktioniert schon recht gut.
Nur möchte ich jetzt nicht, dass er die Strings hintendranhängt, sondern ersetzt, so dass immer nur ein wert drinstehen kann.


Klabautermann - Do 27.06.02 18:18

Hi,

dann ersetze

Quelltext
1:
2:
3:
4:
IF FileExists(aFileName) THEN
  Append(f)
 ELSE
  Rewrite(f);


durch


Quelltext
1:
Rewrite(f);                    


Kleiner Tip. Wenn du solche Beispiele bekommst solltest du versuchen sie zu verstehen. Wenn du dir in der Online Hilfe mal die Befehle welche in den Beispielen vorkommen angeschaut hättest währest du leicht drauf gekommen. Schneller als hier zu Posten ist das auf jeden Fall ;).

Verstehe mich nicht falsch du darfst und sollst hier Posten und ich erkläre dir auch gerne was ich dir geschickt habe und wie du es abwandeln kannst, aber der Lernerfolg für dich ist größer wenn du dir das ganze erarbeitest.

Also nochmal, das ist nicht böse gemeint.

Gruß
Klabautermann


Steffer - Fr 28.06.02 13:33

Oder kürzer:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
var LB : TStringList;
begin
LB:= TStringList.Create;
LB.Add(Edit1.Text);
LB.SaveToFile(DeinFile);
LB.Free;
end;


var LB : TStringList;
begin
LB:= TStringList.Create;
LB.LoadFromFile(DeinFile);
Edit.Text:= LB.Text;
LB.Free;
end;


Code-Tags hinzugefügt. Tino


Klabautermann - Fr 28.06.02 14:41

Hi Steffer,

das ist zwar kürzer aber Recourcenfressender. Auch wenn tStringList zu einen meiner Lieblingsobjekte zählt halte ich es immer für übertrieben soetwas für kleinigkeiten zu bemüben.
Aber immernoch besser als tListBox ;) (was ich also alternativantwort zu meiner erwartet habe).

Gruß
Klabautermann


Steffer - Sa 29.06.02 16:08

@Klabautermann

Was frist den dabei Ressourcen?
Solange man immer wieder schön .Free; berücksichtigt, werden da keine Ressourcen verbraten. :wink:


Klabautermann - Sa 29.06.02 16:51

Hi,

ich meine das erstellen des Objektes selber. Das ist sicherlich (intern) um ein vielfaches Aufwendiger als ein einfaches Assign-File.
Aber klar, du gibst den Speicher wieder frei dennoch wird dein Prozessor mehr Arbeit haben um das Object zu erzeugen, die Datei zu laden (wozu intern wieder ein Filestream erzeugt werden muss) und das ganze wieder freizugeben.

Wie gesagt für mich habe ich entschieden den Klassischen weg zu verwenden solange ich nur einfache ansprüche habe, was in diesem Fall gegeben ist.

Gruß
Klabautermann