Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Daten speichern (https://www.delphipraxis.net/64519-daten-speichern.html)

LukeGee 4. Mär 2006 16:33


Daten speichern
 
Hallo,

wie kann ich Daten, die z.b. in ein Edit-Feld eingegeben werden in einer Datei speichern, die auch wieder geöffnet werden kann um diese Daten wieder in dem oder dene Edit Feldern auszugeben?

(bin noch anfänger, daher bitte 'einfache' beschreibung)

MfG

konda 4. Mär 2006 16:37

Re: Daten speichern
 
Guck dir mal die Tutorials an: Delphi-Source-Tutorials Datenspeicherung

Dj_Base 4. Mär 2006 16:48

Re: Daten speichern
 
Hi!

Am besten machst du das mit den so genannten INI-Dateien.
Das sind Text-Dateien, in denen man komfortabel Daten speichern und wieder auslesen kann.

Um dir diesen Umstand zu nutze machen zu können, muss du die Unit IniFiles einbinden.
Und dann musst folgendes für das Speichern der Daten tun:
Delphi-Quellcode:
var Ini: TIniFile //Variable vom Typ TIniFile.
begin
Ini := TIniFile.Create('data.ini'); //Ini-Datei öffnen bzw. erstellen
//Speichert Edit1.Text in der Kategorie Daten als wert von Edit-Feld
Ini.WriteString('Daten', 'Edit-Feld', Edit1.Text);
Ini.Free; //Und wieder freigeben
end;
Die Ini-datei sieht nun so aus:
Delphi-Quellcode:
[Daten]
Edit-Feld=Hier der Inhalt deines Edit-Feldes ...
Und für das Auslesen:
Delphi-Quellcode:
var Ini: TIniFile //Variable vom Typ TIniFile.
begin
Ini := TIniFile.Create('data.ini'); //Ini-Datei öffnen bzw. erstellen
//Auslesen | Der dritte Parameter ist der Default-Wert, der benutzt wird, falls das Feld nicht existieren würde
Edit1.Text := Ini.ReadString('Daten', 'Edit-Feld', 'Default-Angabe'); //Dem Edit1 die daten zuweisen
Ini.Free; //Wieder freigeben
Das wär's auch schon...
Noch Frageb? :) Sonst meld ich halt einfach!

Grüße,
Dj_Base

LukeGee 4. Mär 2006 17:31

Re: Daten speichern
 
ah, dankeschön.

MfG

LukeGee 4. Mär 2006 21:02

Re: Daten speichern
 
hm, blöde frage: wie mache ich ne unit und wie binde ich sie ein?

konda 4. Mär 2006 21:08

Re: Daten speichern
 
Das ist einfach. In der Unit steht ja
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
Das änderst du jetzt einfach um in
Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, inifiles;
:wink:

LukeGee 4. Mär 2006 21:09

Re: Daten speichern
 
ah, ok. und wohin muss ich den code von dj base hinschreiben? also in die selbe unit und wo genau? in das von dem edit feld oder da beim onclick des button fürs speichern/öffnen??

EDIT: Cool ,ah tgeklappt. danke.

aber: wo ist die datei gespeichert? bzw. die datei muss auf der hd gespeichert werden, so dass sie auch nach nem neustart wieder geöffnet werden kann.

konda 4. Mär 2006 21:14

Re: Daten speichern
 
Zitat:

Zitat von LukeGee
ah, ok. und wohin muss ich den code von dj base hinschreiben? also in die selbe unit und wo genau? in das von dem edit feld oder da beim onclick des button fürs speichern/öffnen??

Du könntest zum Beispiel den Code in die Onclick-Ereignise eines Öffen-, Ladenbuttons schreiben. :cyclops:

LukeGee 4. Mär 2006 21:16

Re: Daten speichern
 
s hat geklappt, aber siehe meine frage @edit oben.

konda 4. Mär 2006 21:19

Re: Daten speichern
 
Im Code von Dj_Base wird die Datei im Ordner gespeichert, in dem die Exe-Datei liegt. Du kannst aber auch einen beliebigen Pfad angeben. Z.B. 'C:\programme\borland\BDS\test.ini' :firejump:

LukeGee 4. Mär 2006 21:30

Re: Daten speichern
 
aha...also einfach nicht nur z.b. daten.ini angeben. sondern z.b. d:/daten/daten.ini, oder?

edit: ja, hat geklappt. vielen dank!

Daniel G 4. Mär 2006 22:46

Re: Daten speichern
 
Zitat:

Zitat von LukeGee
aha...also einfach nicht nur z.b. daten.ini angeben. sondern z.b. d:/daten/daten.ini, oder?

Aber natürlich nur, wenn das Programm nur auf deinem Rechner laufen soll. Eigentlich sollte man Pfadangaben nie hardcoden.

LukeGee 5. Mär 2006 14:27

Re: Daten speichern
 
k,

hab noch ne frage dazu:

wie kann ich in der ini den wert checked einer checkbox speichern?

Daniel G 5. Mär 2006 14:31

Re: Daten speichern
 
Zitat:

Zitat von LukeGee
k,

hab noch ne frage dazu:

wie kann ich in der ini den wert checked einer checkbox speichern?

Delphi-Quellcode:
WriteBool(const Section, Ident: String; Value: Boolean); virtual;
Bei Value kommt der Wert "CheckBox1.checked" hinein.

LukeGee 5. Mär 2006 14:43

Re: Daten speichern
 
aha, danke.

edit: hm, geht aber irgendwie ned?!

inherited 5. Mär 2006 15:33

Re: Daten speichern
 
sonst mach doch einfach
Delphi-Quellcode:
if CheckBox1.Checked then Ini.WriteString('Daten', 'CheckBox', 'true') else Ini.WriteString('Daten', 'CheckBox', 'false');

Daniel G 5. Mär 2006 15:36

Re: Daten speichern
 
Zitat:

Zitat von inherited
sonst mach doch einfach
Delphi-Quellcode:
if CheckBox1.Checked then Ini.WriteString('Daten', 'CheckBox', 'true') else Ini.WriteString('Daten', 'CheckBox', 'false');

Was allerdings deutlich umständlicher als ein einfaches WriteBool ist, meinst du nicht auch? :zwinker:

LukeGee 5. Mär 2006 16:28

Re: Daten speichern
 
aber des writebool geht bei mir irgendwie ned. ich mach was falsch, aber was? naja, ich werds mal mit der if claus versuchen.

konda 5. Mär 2006 16:30

Re: Daten speichern
 
Zitat:

Zitat von LukeGee
aber des writebool geht bei mir irgendwie ned. ich mach was falsch, aber was? naja, ich werds mal mit der if claus versuchen.

Schreib mal deinen Code! :coder:

LukeGee 5. Mär 2006 16:34

Re: Daten speichern
 
hier:

Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Ini.WriteBool(const Section, Ident: String; Value: CheckBox1.Checked); virtual;
Ini.Free;
desweiteren geht das mit der if auch ned, denn irgendwie braucht das teil über 200mb arbeitspseicher.

konda 5. Mär 2006 16:50

Re: Daten speichern
 
Du kannst nicht einfach die Funktion abschreiben. Du musst schon Werte einsetzen. Hier der richtige Code:
Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Ini.WriteBool('Hier beliebigen Namen einer Sektion angeben', 'Hier einen beliebigen Namen für den Eintrag angeben', checkbox1.checked);
Ini.Free;

LukeGee 5. Mär 2006 16:52

Re: Daten speichern
 
aha, na das muss man mir sagen, ich bin schließlich noch anfänger ;)

edit: naja, beim compilieren kommt jetzt kein fehler, aber gehn tuts trotzdem nicht :?

inherited 5. Mär 2006 17:34

Re: Daten speichern
 
Poste mal deinen gesamten code bitte

LukeGee 5. Mär 2006 17:46

Re: Daten speichern
 
hier:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, ComCtrls, IniFiles, Buttons, ImgList, ToolWin,
  ExtCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label17: TLabel;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Label21: TLabel;
    StatusBar1: TStatusBar;
    XPManifest1: TXPManifest;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Edit5: TEdit;
    Edit6: TEdit;
    Edit7: TEdit;
    Edit8: TEdit;
    Edit9: TEdit;
    Edit10: TEdit;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    Label22: TLabel;
    Edit19: TEdit;
    ToolBar1: TToolBar;
    ImageList1: TImageList;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    ToolButton5: TToolButton;
    Label23: TLabel;
    CheckBox1: TCheckBox;
    CheckBox2: TCheckBox;
    CheckBox3: TCheckBox;
    CheckBox4: TCheckBox;
    procedure FormCreate(Sender: TObject);
    procedure CheckBox4Click(Sender: TObject);
    procedure CheckBox3Click(Sender: TObject);
    procedure CheckBox2Click(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure ToolButton5Click(Sender: TObject);
    procedure ToolButton4Click(Sender: TObject);
    procedure ToolButton3Click(Sender: TObject);
    procedure ToolButton2Click(Sender: TObject);
    procedure ToolButton1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var Ini:TIniFile;
  Form1: TForm1;

implementation

uses ABOUT;

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit1-Feld', Edit1.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit2-Feld', Edit2.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit3-Feld', Edit3.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit4-Feld', Edit4.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit5-Feld', Edit5.Text);
Ini.Free;



Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit6-Feld', Edit6.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit7-Feld', Edit7.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit8-Feld', Edit8.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit9-Feld', Edit9.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit10-Feld', Edit10.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit11-Feld', Edit11.Text);
Ini.Free;



Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit12-Feld', Edit12.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit13-Feld', Edit13.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit14-Feld', Edit14.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit15-Feld', Edit15.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit16-Feld', Edit16.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit17-Feld', Edit17.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit18-Feld', Edit18.Text);
Ini.Free;



Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit19-Feld', Edit19.Text);
Ini.Free;
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
Ini := TIniFile.Create('data.ini');
Edit1.Text := Ini.ReadString('Daten', 'Edit1-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit2.Text := Ini.ReadString('Daten', 'Edit2-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit3.Text := Ini.ReadString('Daten', 'Edit3-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit4.Text := Ini.ReadString('Daten', 'Edit4-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit5.Text := Ini.ReadString('Daten', 'Edit5-Feld', 'Default-Angabe');
Ini.Free;



Ini := TIniFile.Create('data.ini');
Edit6.Text := Ini.ReadString('Daten', 'Edit6-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit7.Text := Ini.ReadString('Daten', 'Edit7-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit8.Text := Ini.ReadString('Daten', 'Edit8-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit9.Text := Ini.ReadString('Daten', 'Edit9-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit10.Text := Ini.ReadString('Daten', 'Edit10-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit11.Text := Ini.ReadString('Daten', 'Edit11-Feld', 'Default-Angabe');



Ini := TIniFile.Create('data.ini');
Edit12.Text := Ini.ReadString('Daten', 'Edit12-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit13.Text := Ini.ReadString('Daten', 'Edit13-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit14.Text := Ini.ReadString('Daten', 'Edit14-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit15.Text := Ini.ReadString('Daten', 'Edit15-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit16.Text := Ini.ReadString('Daten', 'Edit16-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit17.Text := Ini.ReadString('Daten', 'Edit17-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit18.Text := Ini.ReadString('Daten', 'Edit18-Feld', 'Default-Angabe');



Ini := TIniFile.Create('data.ini');
Edit19.Text := Ini.ReadString('Daten', 'Edit19-Feld', 'Default-Angabe');
end;

procedure TForm1.ToolButton3Click(Sender: TObject);
begin
Edit1.Text:='';
Edit2.Text:='';
Edit3.Text:='';
Edit4.Text:='';
Edit5.Text:='';
Edit6.Text:='';
Edit7.Text:='';
Edit8.Text:='';
Edit9.Text:='';
Edit10.Text:='';
Edit11.Text:='';
Edit12.Text:='';
Edit13.Text:='';
Edit14.Text:='';
Edit15.Text:='';
Edit16.Text:='';
Edit17.Text:='';
Edit18.Text:='';
Edit19.Text:='';
end;

procedure TForm1.ToolButton4Click(Sender: TObject);
begin
AboutBox.ShowModal;
end;

procedure TForm1.ToolButton5Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if (CheckBox1.Checked=true) then Edit1.Enabled:=true;
if (CheckBox1.Checked=false) then Edit1.Enabled:=false;
end;

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if (CheckBox2.Checked=true) then Edit5.Enabled:=true;
if (CheckBox2.Checked=false) then Edit5.Enabled:=false;
end;

procedure TForm1.CheckBox3Click(Sender: TObject);
begin
if (CheckBox3.Checked=true) then Edit6.Enabled:=true;
if (CheckBox3.Checked=false) then Edit6.Enabled:=false;

if (CheckBox3.Checked=true) then Edit7.Enabled:=true;
if (CheckBox3.Checked=false) then Edit7.Enabled:=false;

if (CheckBox3.Checked=true) then Edit8.Enabled:=true;
if (CheckBox3.Checked=false) then Edit8.Enabled:=false;

if (CheckBox3.Checked=true) then Edit9.Enabled:=true;
if (CheckBox3.Checked=false) then Edit9.Enabled:=false;

if (CheckBox3.Checked=true) then Edit10.Enabled:=true;
if (CheckBox3.Checked=false) then Edit10.Enabled:=false;

if (CheckBox3.Checked=true) then Edit11.Enabled:=true;
if (CheckBox3.Checked=false) then Edit11.Enabled:=false;
end;

procedure TForm1.CheckBox4Click(Sender: TObject);
begin
if (CheckBox4.Checked=true) then Edit12.Enabled:=true;
if (CheckBox4.Checked=false) then Edit12.Enabled:=false;

if (CheckBox4.Checked=true) then Edit13.Enabled:=true;
if (CheckBox4.Checked=false) then Edit13.Enabled:=false;

if (CheckBox4.Checked=true) then Edit14.Enabled:=true;
if (CheckBox4.Checked=false) then Edit14.Enabled:=false;

if (CheckBox4.Checked=true) then Edit15.Enabled:=true;
if (CheckBox4.Checked=false) then Edit15.Enabled:=false;

if (CheckBox4.Checked=true) then Edit16.Enabled:=true;
if (CheckBox4.Checked=false) then Edit16.Enabled:=false;

if (CheckBox4.Checked=true) then Edit17.Enabled:=true;
if (CheckBox4.Checked=false) then Edit17.Enabled:=false;

if (CheckBox4.Checked=true) then Edit18.Enabled:=true;
if (CheckBox4.Checked=false) then Edit18.Enabled:=false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

end;

end.

konda 5. Mär 2006 17:51

Re: Daten speichern
 
Und wo genau leigt jetzt der Fehler? :gruebel:

LukeGee 5. Mär 2006 17:54

Re: Daten speichern
 
oh, in dem quelltext ist das mit dem checked wert der checkboxes ned drin, aber den quelltext von denen hab ich gemacht, wie gesagt wurde. es wird auch compiliert, aber wenn ich z.b. die checkbox anklicke und es speichere, neustarte und wieder öffne is das teil nicht wieder angeklickt, so wies gespeichert wurde.

konda 5. Mär 2006 18:00

Re: Daten speichern
 
Zitat:

Zitat von LukeGee
oh, in dem quelltext ist das mit dem checked wert der checkboxes ned drin, aber den quelltext von denen hab ich gemacht, wie gesagt wurde. es wird auch compiliert, aber wenn ich z.b. die checkbox anklicke und es speichere, neustarte und wieder öffne is das teil nicht wieder angeklickt, so wies gespeichert wurde.

Ja klar ist die Checkbox nicht angeklickt. Du speicherst den Wert ja auch nicht ab.

marabu 5. Mär 2006 18:05

Re: Daten speichern
 
Hallo Lukas,

schau dir mal die Änderungen an, die ich an deinem Code gemacht habe:

Delphi-Quellcode:
unit Unit1;

type
  TForm1 = class(TForm)
    // ...
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    // ...
  private
    ini: TMemIniFile;
  end;

var
  Form1: TForm1;

implementation

uses
  ABOUT;

{$R *.dfm}

procedure TForm1.ToolButton1Click(Sender: TObject);
begin
  Ini.WriteString('Daten', Edit1.Name, Edit1.Text);
  Ini.WriteString('Daten', Edit2.Name, Edit2.Text);
  // ...
end;

procedure TForm1.ToolButton2Click(Sender: TObject);
begin
  Edit1.Text := Ini.ReadString('Daten', Edit1.Name, 'Default-Angabe');
  // ...
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  Edit1.Enabled := CheckBox1.Checked;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Ini := TMemIniFile.Create(ExtractFilePath(ParamStr(0)) + 'data.ini');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Ini.UpdateFile;
end;

end.
Freundliche Grüße vom marabu

inherited 5. Mär 2006 18:52

Re: Daten speichern
 
Was wr damit sagen will: du musst die datei nich immer wieder neu öffnen und freigeben, es reicht wenn du das einmal tust

ichbins 5. Mär 2006 20:45

Re: Daten speichern
 
mal ne Auflistung der Fehler / Verbesserungswürdigen Stellen in deinem Code:

1. Einrückung

du solltest deinen Quelltext immer einrücken (mit jedem begin etc. eine stufe weiter einrücken)

wenn du mal 10000-Zeilen Codes mit 8facher Verschachtelung schreibst ist das nahezu überlebensnotwendig.
Delphi-Quellcode:
procedure xyz;
var
  a,b,i:integer;
  s:string;
beign
  try begin
    for i:=0 to 10 do begin
      showmessage('i='+inttostr(i));
    end;
  end excpet
    showmessage('fehler');
  end;
end;

2. Schreiben der INI-Dateien

Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit1-Feld', Edit1.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit2-Feld', Edit2.Text);
Ini.Free;
du öffnest die Datei, schreibst, schliesst die Datei, öffnest sie wieder, schreibst,...

fährst du deinen Comuter hoch damit du ein Programm ausführen kannst, fährst ihn wieder herunter, fährst ihn aber gleich wieder hoch, und führst das nächste Programm aus?

besser:
Delphi-Quellcode:
ini:=tinifile.create('data.ini');
Ini.WriteString('Daten', 'Edit1-Feld', Edit1.Text);
Ini.WriteString('Daten', 'Edit2-Feld', Edit2.Text);
Ini.Free;
3. Lesen der INI-Dateien

du öffnest die Datei, liest einen Wert, vergisst aber, die Datei wieder zu schliessen, öffnest sie dann aber - obwohl sie schon geöffnet ist - gleich wieder...

am schluss schliesst du die Datei überhaupt nicht mehr - wieder eine Fehlerquelle.

Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Edit1.Text := Ini.ReadString('Daten', 'Edit1-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit2.Text := Ini.ReadString('Daten', 'Edit2-Feld', 'Default-Angabe');

//...
besser am Anfang einmal öffnen, alles lesen, und dann wieder schliessen:

Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Edit1.Text := Ini.ReadString('Daten', 'Edit1-Feld', 'Default-Angabe');
Edit2.Text := Ini.ReadString('Daten', 'Edit2-Feld', 'Default-Angabe');
//...
ini.free;
außerdem ist es ungeschickt, 'Default-Angabe' als Edittext zu setzen, falls der echte Wert nicht gelesen werden kann, wie z.B. beim ersten Programmstart. Verwende den Text, der dem User in diesem Fall angezeigt werden soll, anstatt 'Default-Angabe', wie z.B. einen leeren String: ''

4. Zuweisung der Boolean (Ja-Nein-Werte)

du machst gerade folgendes:

Falls der wert der Checkbox.checked wahr ist, dann setze den Wert des Edit.Enabled auf wahr.
Falls der wert der Checkbox.checked falsch ist, dann setze den Wert des Edit.Enabled auf falsch.

klingt das nicht etwas umständlich?

Delphi-Quellcode:
if (CheckBox1.Checked=true) then Edit1.Enabled:=true;
if (CheckBox1.Checked=false) then Edit1.Enabled:=false;
einfacher wäre doch das:

Falls der wert der Checkbox.checked wahr ist, dann setze den Wert des Edit.Enabled auf wahr,
ansonsten setze den Wert des Edit.enabled auf falsch.

Delphi-Quellcode:
if CheckBox1.Checked=true then
  Edit1.Enabled:=true
else
  Edit1.Enabled:=false;
In einer If-Abfrage ist es allerdings absolut unnötig, ein =true abzufragen, denn das macht die If-Abfrage selbst. Sie überprüft, ob der Wert der gegebenen Variable true ist, also z.B. der Wert der Operation 'a'='a' ist true, während 'a'='b' false ist.

Delphi-Quellcode:
if CheckBox1.Checked then
  Edit1.Enabled:=true
else
  Edit1.Enabled:=false;
Aber wieso machst dus überhaupt so umständlich und sagst nicht gleich: "Gib dem edit.enabled denselben wert wie dem checkbox.checked"?

Delphi-Quellcode:
edit1.enabled:=checkbox1.checked;

pacman1986 5. Mär 2006 21:15

Re: Daten speichern
 
Delphi-Quellcode:
procedure TForm1.ToolButton1Click(Sender: TObject);
var i:integer;
begin
   Ini := TIniFile.Create('data.ini');
    for i := 1 to 19 do begin
     Ini.WriteString('Daten', 'Edit1'+inttostr(i)+'-Feld', TEdit(FindComponent('Edit'+inttostr(i))).text);
    end;
   Ini.Free;
end;
Wäre deutsöich kürzer für den ersten teil

und

Delphi-Quellcode:
procedure TForm1.ToolButton2Click(Sender: TObject);
var i:integer;
begin
   Ini := TIniFile.Create('data.ini');
    for i := 1 to 19 do begin
     TEdit(FindComponent('Edit'+inttostr(i))).text=Ini.ReadString('Daten', 'Edit1'+inttostr(i)+'-Feld', 'Default-Wert');
    end;
   Ini.Free;
end;
für den 2 ten Teil

PS: Code net überprüft müsste aber funzen

LukeGee 6. Mär 2006 12:22

Re: Daten speichern
 
Zitat:

Zitat von ichbins
mal ne Auflistung der Fehler / Verbesserungswürdigen Stellen in deinem Code:

1. Einrückung

du solltest deinen Quelltext immer einrücken (mit jedem begin etc. eine stufe weiter einrücken)

wenn du mal 10000-Zeilen Codes mit 8facher Verschachtelung schreibst ist das nahezu überlebensnotwendig.
Delphi-Quellcode:
procedure xyz;
var
  a,b,i:integer;
  s:string;
beign
  try begin
    for i:=0 to 10 do begin
      showmessage('i='+inttostr(i));
    end;
  end excpet
    showmessage('fehler');
  end;
end;

2. Schreiben der INI-Dateien

Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit1-Feld', Edit1.Text);
Ini.Free;

Ini := TIniFile.Create('data.ini');
Ini.WriteString('Daten', 'Edit2-Feld', Edit2.Text);
Ini.Free;
du öffnest die Datei, schreibst, schliesst die Datei, öffnest sie wieder, schreibst,...

fährst du deinen Comuter hoch damit du ein Programm ausführen kannst, fährst ihn wieder herunter, fährst ihn aber gleich wieder hoch, und führst das nächste Programm aus?

besser:
Delphi-Quellcode:
ini:=tinifile.create('data.ini');
Ini.WriteString('Daten', 'Edit1-Feld', Edit1.Text);
Ini.WriteString('Daten', 'Edit2-Feld', Edit2.Text);
Ini.Free;
3. Lesen der INI-Dateien

du öffnest die Datei, liest einen Wert, vergisst aber, die Datei wieder zu schliessen, öffnest sie dann aber - obwohl sie schon geöffnet ist - gleich wieder...

am schluss schliesst du die Datei überhaupt nicht mehr - wieder eine Fehlerquelle.

Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Edit1.Text := Ini.ReadString('Daten', 'Edit1-Feld', 'Default-Angabe');

Ini := TIniFile.Create('data.ini');
Edit2.Text := Ini.ReadString('Daten', 'Edit2-Feld', 'Default-Angabe');

//...
besser am Anfang einmal öffnen, alles lesen, und dann wieder schliessen:

Delphi-Quellcode:
Ini := TIniFile.Create('data.ini');
Edit1.Text := Ini.ReadString('Daten', 'Edit1-Feld', 'Default-Angabe');
Edit2.Text := Ini.ReadString('Daten', 'Edit2-Feld', 'Default-Angabe');
//...
ini.free;
außerdem ist es ungeschickt, 'Default-Angabe' als Edittext zu setzen, falls der echte Wert nicht gelesen werden kann, wie z.B. beim ersten Programmstart. Verwende den Text, der dem User in diesem Fall angezeigt werden soll, anstatt 'Default-Angabe', wie z.B. einen leeren String: ''

4. Zuweisung der Boolean (Ja-Nein-Werte)

du machst gerade folgendes:

Falls der wert der Checkbox.checked wahr ist, dann setze den Wert des Edit.Enabled auf wahr.
Falls der wert der Checkbox.checked falsch ist, dann setze den Wert des Edit.Enabled auf falsch.

klingt das nicht etwas umständlich?

Delphi-Quellcode:
if (CheckBox1.Checked=true) then Edit1.Enabled:=true;
if (CheckBox1.Checked=false) then Edit1.Enabled:=false;
einfacher wäre doch das:

Falls der wert der Checkbox.checked wahr ist, dann setze den Wert des Edit.Enabled auf wahr,
ansonsten setze den Wert des Edit.enabled auf falsch.

Delphi-Quellcode:
if CheckBox1.Checked=true then
  Edit1.Enabled:=true
else
  Edit1.Enabled:=false;
In einer If-Abfrage ist es allerdings absolut unnötig, ein =true abzufragen, denn das macht die If-Abfrage selbst. Sie überprüft, ob der Wert der gegebenen Variable true ist, also z.B. der Wert der Operation 'a'='a' ist true, während 'a'='b' false ist.

Delphi-Quellcode:
if CheckBox1.Checked then
  Edit1.Enabled:=true
else
  Edit1.Enabled:=false;
Aber wieso machst dus überhaupt so umständlich und sagst nicht gleich: "Gib dem edit.enabled denselben wert wie dem checkbox.checked"?

Delphi-Quellcode:
edit1.enabled:=checkbox1.checked;

Vielen Dank für die Korrektur. Geht ja wirklich viel einfacher :)

inherited 6. Mär 2006 16:00

Re: Daten speichern
 
Bei der gelegenheit könnte man für sowas eigentlich ne eigene unit schreiben

Marduk 11. Jan 2007 13:07

Re: Daten speichern
 
Zitat:

Zitat von Dj_Base
Um dir diesen Umstand zu nutze machen zu können, muss du die Unit IniFiles einbinden.
Und dann musst folgendes für das Speichern der Daten tun:
Delphi-Quellcode:
var Ini: TIniFile //Variable vom Typ TIniFile.
begin
Ini := TIniFile.Create('data.ini'); //Ini-Datei öffnen bzw. erstellen
//Speichert Edit1.Text in der Kategorie Daten als wert von Edit-Feld
Ini.WriteString('Daten', 'Edit-Feld', Edit1.Text);
Ini.Free; //Und wieder freigeben
end;
Die Ini-datei sieht nun so aus:
Delphi-Quellcode:
[Daten]
Edit-Feld=Hier der Inhalt deines Edit-Feldes ...

hab ich mir mal so geklaut und sieht demantsprechend so aus:

Delphi-Quellcode:
procedure TForm1.bt1onclick(Sender: TObject);
var
ini:TIniFile;
begin
    ini:= TIniFile.Create('data.ini');
    ini.writestring('Daten','Zeit',edit1.text);
    ini.free;
end;
das Prog lässt sich auch ohne Probleme ausführen, erzeugt aber keine Datei im Ordner mit der Projekt.exe. Erstelle ich manuell eine data.ini im Ordner mit der exe, so verändert sich selbige nicht.

inherited 11. Jan 2007 13:17

Re: Daten speichern
 
Probiere mal folgende änderung aus:
Delphi-Quellcode:
    ini:= TIniFile.Create(ExtractFilePath(ParamStr(0))+'data.ini');

Marduk 11. Jan 2007 15:27

Re: Daten speichern
 
Danke, das war's! :-D

raiguen 11. Jan 2007 16:58

Re: Daten speichern
 
Moin :)
Nochmal ne kurze Erklärung zu Ini-Dateien:
Wenn das hier
Delphi-Quellcode:
ini:= TIniFile.Create('data.ini');
gemacht wird, dann wird die IniDatei im Windows-Ordner abgelegt bzw erstellt :wink:
wobei es völlig egal ist, ob du sie nun data.ini oder data.txt oder data.bla nennst...
Bemüh mal die Suchfunktion deines Rechners und schau dir mal an, wo deine 'vermisste' data.ini gelandet ist...


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz