Entwickler-Ecke

Dateizugriff - INI- Datei lesen und schreiben


chris_davidi - Mo 25.08.03 10:42
Titel: INI- Datei lesen und schreiben
Hallo.

Ich weiß, wir hatten es schon oft, aber ich suche es in vereinfachter Form und dies könnte man dann hier in die FAQ stellen. Wäre gut. :D

Meine Frage.

Ich habe 5 Edit- Felder und ein Button "Speichern". Wie kann ich erreichern, dass das was in die Felder eingetragen wurde in dieser Form in der test.ini gespeichert wird?

Edit1 = "Wert"
Edit2 = "Wert 3"
Edit3... usw.

Das zweite wäre, wie kann ich diese Felder abhohlen, wenn die Form mit den Feldern lädt (also z. B. Form1.OnCreate).

Hoffe mir kann jemand helfen und das man dies dann unter FAQs setzt, kenne nämlich viele, welche genau das selbe vorhaben und nicht draufkommen.

Grüße & lieben Dank.
Chris


DeCodeGuru - Mo 25.08.03 11:08

Guck dir mal folgenden Code an (ist nur ein Testcode, den man noch mit Sicherheitsabfragen etc. ausstatten müsste):

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:
procedure TForm1.Button1Click(Sender: TObject);
var
  MyIni: TIniFile;
  i: Integer;
begin
  MyIni := TIniFile.Create('C:\Dokumente und Einstellungen\Jakob\Desktop\Test.ini');
  try
    for i := 1 to 5 do //"Zahl" des letzten Edits
      MyIni.WriteString('Section_1','Edit' + IntToStr(i),TEdit(FindComponent('Edit' + IntToStr(i))).Text);
  finally
    MyIni.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MyIni: TIniFile;
  i: Integer;
begin
  MyIni := TIniFile.Create('C:\Dokumente und Einstellungen\Jakob\Desktop\Test.ini');
  try
    i := 1;
    while MyIni.ValueExists('Section_1','Edit' + IntToStr(i)) do
    begin
      TEdit(FindComponent('Edit' + IntToStr(i))).Text := MyIni.ReadString('Section_1','Edit' + IntToStr(i),'kA');
      Inc(i);
    end;

  finally
    MyIni.Free;
  end;
end;


Funktioniert bei mir einwandfrei. Ich habe 2 Buttons und 5 Edits verwendet. Achja, die Edits müssen aber den "Standardnamen" haben.


chris_davidi - Mo 25.08.03 11:17

Danke. :) Der Code sieht schonmal sehr gut aus, leider komme ich nicht weiter. Habe es eingebaut, aber es kommt, dass "MyIni: TIniFile;" ein undefinierter Bezeichner ist. Aber es ist doch bei


Quelltext
1:
2:
3:
var 
  MyIni: TIniFile;
  i: Integer;


definiert, oder verstehe ich da etwas falsch?


derDoc - Mo 25.08.03 11:20

Binde doch mal die Unit IniFiles mit ein.


Delphi-Quelltext
1:
2:
uses
  ..., IniFiles;


chris_davidi - Mo 25.08.03 11:25

Ok danke, klappt. Nun wird aber dann noch ValueExists als undefinierter Bezeichner ausgegeben. Wie heißt die Unit dafür? Im allgemeinen, wo bekomme ich Informationen über die Untis her?


derDoc - Mo 25.08.03 11:32

Am einfachsten bekommst du die Units, indem du den undefinierten Bezeichner markierst und dann F1 drückst.

Bei meinem Delphi 6 Pro ist ValueExists auch in der Unit IniFiles definiert. Bei Delphi 3 scheint das aber anders zu sein.


chris_davidi - Mo 25.08.03 11:35

Kann man die Unit von Delphi 6 einfach in Delphi 3 einbinden? Dann wäre doch das Problem gelöst, oder?


derDoc - Mo 25.08.03 11:53

Ich glaube das geht nicht. Die Unit benötigt auch aus anderen Units Teile und somit wäre das nur schwer möglich.


chris_davidi - Mo 25.08.03 12:03

Ok. Schade. :( Hast du sonst einen Tipp, wie ich das Problem lösen kann?


derDoc - Mo 25.08.03 12:08

Schau mal in deiner Hilfe nach, in welcher Unit TCustomIniFile definiert ist. ValueExists ist eine Methode von dieser Klasse.


chris_davidi - Mo 25.08.03 12:14

In meiner Hilfe gibt es TCustomIniFile gar nicht. Bringt mich also leider auch nicht weiter... *seuftz*


DeCodeGuru - Mo 25.08.03 12:34

Zitat:
Ich glaube das geht nicht. Die Unit benötigt auch aus anderen Units Teile und somit wäre das nur schwer möglich.


Welche Teile denn, die es unter Delphi 3 nicht gibt?

@chris: Leite doch TIniFile ab und füge eine entsprechende Funktion hinzu.

Achja, ich weiss ja nicht, wie es rechtlich aussieht, aber ich glaube kaum, dass du eine Unit aus D6Pro einfach so verwenden darfst. :?


chris_davidi - Mo 25.08.03 12:35

Öhm... Ableiten? Davon habe ich leiter keine Ahnung, des müsste mir jemand genau erklären, des wär lieb.


DeCodeGuru - Mo 25.08.03 12:45

ok, schau dir das mal an (unterhalb der Form-Deklaration einfügen).


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:
type
  TMyIniFile = class(TIniFile)
  public
    function ValueExists(const Section, Ident: string): Boolean;
  end;


var
  Form1: TForm1;

implementation

{$R *.DFM}

function TMyIniFile.ValueExists(const Section, Ident: String): Boolean;
var
  S: TStrings;
begin
  S := TStringList.Create;
  try
    ReadSection(Section, S);
    Result := S.IndexOf(Ident) > -1;
  finally
    S.Free;
  end;
end;


Achja, weiss nicht genau, ob das funtzt, da ich das nur in den Codeeditor getippt habe aber nicht getestet habe.

Vorraussetzung dafür ist aber, dass deine TIniFile die Methode ReadSection kennt. :?

Ansonsten musste du halt weitercoden. :)


chris_davidi - Mo 25.08.03 13:18

Danke. :)

Habe ich nun gemacht. Nun wird folgende Zeile makiert und es kommt "Funktion erwartet Ergebnistyp".


Quelltext
1:
function TMyIniFile.ValueExists(const Section, Ident: String): Boolean;                    


Mit selber Coden komme ich leider nicht weiter, weil ich momentan noch am lernen bin. Wenn ich des eben auch irgendwann mal verstehe. :D