Entwickler-Ecke

Sonstiges (Delphi) - Edit aus Form2 Auslesen


Chakvour - Fr 13.11.09 01:57
Titel: Edit aus Form2 Auslesen
Hallo,

ich habe zum testen erstmal ine Edit box erstellt die den namen "Edit1: TEdit;" hat.
So in der EditBox wird das angezeigt was in der INI steht. Das funktioniert alles wunderbar.

Doch nun wollte ich das was dort in der EditBox steht weil es ja aus der INI kommt in der Form1 in einem Label auslesen.
Sprich bei


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.FormCreate(Sender: TObject);
begin
label1.caption := form2.edit1.text;
end;


problem ist nur das nun in dem label "Edit1" steht und nicht das was da stehen soll.
Oder muss ich in der Form1 auch wieder aus der ini was herrauslesen? Das muss doch auch anders gehen.
Denn mit dme INI Auslesen auch in der Form1 funktioniert doch ich möchte das kürzer machen.


Niko S. - Fr 13.11.09 07:31

hast du hinter implementation auch uses Unit2; geschrieben, damit das Programm weiß, dass du Unit2 verwendest? ^^
Und wenn das nicht so klappt wie du willst, packe doch alle wichtigen Variablen in der Hauptform als "public" ein
und setzte sie dann von anderen forms aus wenn nötig.
Also

Delphi-Quelltext
1:
Form1.Var1 := 'DiesDas';                    

Dann haste auch immer zugriff drauf, musst nur immer die Unit1 in die uses Klausel eintragen!


jaenicke - Fr 13.11.09 07:35

Und die beste Lösung: Einfach das Auslesen der INI komplett von der Oberfläche trennen und von beiden Formularen drauf zugreifen.


Chakvour - Fr 13.11.09 16:52

Ok bevor ich Fragen poste habe ich es jetzt erstmal getestet eine Variable in Form2 erstellt und konnte sie in Form1 auslesen.
Habs simple gemacht.

Form2

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var
test1: string;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
test1 := 'Test';
end;


Diese Variable habe ich dann in Form1 auslesen können.
Am besten ist doch die Idee mit der getrennten INI sodass sie überall auslesbar ist. Wie erstelle ich denn sowas?
Ich habe bisher nur 2 Sachen. Das schreiben mit einem Button. Das sehe so aus. Und ist in Form2 enthalten.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm2.Button1Click(Sender: TObject);
begin
  with TIniFile.Create(ExtractFilePath(ParamStr(0)) +  'settings.ini'do
   try
    WriteString('settings''beschreibung', Edit1.Text);
   finally
    Free;
    form2.close;
  end;
end;


Das Auslesen habe ich so geregelt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm2.FormShow(Sender: TObject);
begin
   with TIniFile.Create(ExtractFilePath(ParamStr(0)) +  'settings.ini'do
  try
    Edit1.Text := ReadString('settings''beschreibung''');
  finally
    free;
  end;
end;


Nur irgendwie möchte er es nicht in Form1 auslesen. Ich könnte auch halt das in Formshow reinmachen. Aber das ist so lala.


Niko S. - Fr 13.11.09 18:48

Hm ich hätte jetzt eine neue Klasse erstellt ...
Diese Klasse hätte ich in eine extra Unit eingebunden und dort auch gleich die Klasse als Variable Definiert.
Dann hätte ich einfach am Anfang des Projektes diese Variable gefüllt mit der Klasse und überall wo ich sie brauche eingebunden, so würde ich von überall drauf zugreifen können.
Beispiel:

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:
unit ConfigClass;

interface

uses IniFiles;

type
  TConfig = class
    private
      FBeschreibung: String;
      Ini: TIniFile;
    public
      procedure Setbeschreibung(Text: String);
      property Beschreibung: String read FBeschreibung write SetBeschreibung;
    published
      constructor Create(ConfigFile: String);
      destructor Destroy; override;
  end;

var
  Config: TConfig;

implementation

constructor TConfig.Create(ConfigFile: String);
begin
  inherited Create;

  Ini := TIniFile.Create(ConfigFile);
  Beschreibung := Ini.ReadString('Settings','Beschreibung','');
end;

destructor TConfig.Destroy;
begin
  Ini.Free;

  inherited;
end;

procedure TConfig.SetBeschreibung(Text: String);
begin
  FBeschreibung := Text;
  Ini.WriteString('Settings','Beschreibung',Text);
end;

end.

Das hier wäre die ConfigClass.pas

Und um das ganze einzubinden kannst du das entweder im Projektkopf machen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  ConfigClass in '..\ConfigClass.pas';

{$R *.res}

begin
  Config := TConfig.Create('.\config.ini');
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Oder in der MainForm der Anwendung

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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Config := TConfig.Create('.\config.ini');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Config.Destroy;
end;


end.


ACHTUNG:
Ich habe hier im Beispiel einen relativen Pfad benutzt.
Das ist nicht Ratsam!
Besser wäre:

Delphi-Quelltext
1:
ExtractFilePath(Application.ExeName)+'config.ini'                    


Chakvour - So 15.11.09 19:18

Hm irgendwas funktioniert nicht so ganz.
ConfigClass.pas habe ich erstellt und ist auch im Project drinnen und auch klausel gesetzt.

Also die INI wird erstellt und auch mit einem hinhalt gefüllt.

Wollte nur mit einem Button klick das in ein label schreiben aber das programm stürzt dann ab wenn ich den button drücke.
anscheind weil die datei nicht gefunden werden kann.


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button5Click(Sender: TObject);
begin
 label1.caption := ini.ReadString('Settings''Beschreibung''');

end;



es funktioniert nur so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button5Click(Sender: TObject);
begin
   with TIniFile.Create(ExtractFilePath(ParamStr(0)) +  'config.ini'do
  try
    label1.caption := ReadString('settings''beschreibung''');
  finally
    free;
  end;
end;


Chakvour - So 15.11.09 19:24

user profile iconChakvour hat folgendes geschrieben Zum zitierten Posting springen:
Hm irgendwas funktioniert nicht so ganz.
ConfigClass.pas habe ich erstellt und ist auch im Project drinnen und auch klausel gesetzt.

Also die INI wird erstellt und auch mit einem hinhalt gefüllt.

Wollte nur mit einem Button klick das in ein label schreiben aber das programm stürzt dann ab wenn ich den button drücke.
anscheind weil die datei nicht gefunden werden kann.


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button5Click(Sender: TObject);
begin
 label1.caption := ini.ReadString('Settings''Beschreibung''');

end;



es funktioniert nur so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button5Click(Sender: TObject);
begin
   with TIniFile.Create(ExtractFilePath(ParamStr(0)) +  'config.ini'do
  try
    label1.caption := ReadString('settings''beschreibung''');
  finally
    free;
  end;
end;


Aber in der ConfigClass.pas steht ja das hier


Delphi-Quelltext
1:
Beschreibung := Ini.ReadString('Settings','Beschreibung','');                    


aso sollte das ja so aussehen


Delphi-Quelltext
1:
label1.caption := Beschreibung                    


Aber Beschreibung ist dann nicht deklariert
ConfigClass steht in den Uses


Chakvour - So 15.11.09 19:25

user profile iconChakvour hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconChakvour hat folgendes geschrieben Zum zitierten Posting springen:
Hm irgendwas funktioniert nicht so ganz.
ConfigClass.pas habe ich erstellt und ist auch im Project drinnen und auch klausel gesetzt.

Also die INI wird erstellt und auch mit einem hinhalt gefüllt.

Wollte nur mit einem Button klick das in ein label schreiben aber das programm stürzt dann ab wenn ich den button drücke.
anscheind weil die datei nicht gefunden werden kann.


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button5Click(Sender: TObject);
begin
 label1.caption := ini.ReadString('Settings''Beschreibung''');

end;



es funktioniert nur so


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button5Click(Sender: TObject);
begin
   with TIniFile.Create(ExtractFilePath(ParamStr(0)) +  'config.ini'do
  try
    label1.caption := ReadString('settings''beschreibung''');
  finally
    free;
  end;
end;


Aber in der ConfigClass.pas steht ja das hier


Delphi-Quelltext
1:
Beschreibung := Ini.ReadString('Settings','Beschreibung','');                    


aso sollte das ja so aussehen


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button5Click(Sender: TObject);
begin
label1.caption := Beschreibung
end;


Aber Beschreibung ist dann nicht deklariert
ConfigClass steht in den Uses


Niko S. - So 15.11.09 19:25

Ich habe extra ein beispiel gewählt, wo du "Beschreibung" als property hast.
Also reicht ein:

Delphi-Quelltext
1:
Label1.Caption := config.beschreibung;                    

vollkommen aus!


Chakvour - So 15.11.09 19:42

ok danke dir habs nicht ganz gesehen. das mit dem globalen sachen hatte ich noch nicht gemacht aber danke dir trotzdem.
und sorry wegen der posts hatte immer auf quote gedrückt anstatt edit :)


jaenicke - So 15.11.09 19:54

Wenn es tatsächlich um Einstellungen geht, kannst du auch meine SJ Config Utils verwenden. Diese automatisieren die Verwaltung der Einstellungen komplett.
http://www.delphi-forum.de/viewtopic.php?t=92348
Mit dem beiliegenden Tool kannst du diese auch automatisch deinem Projekt hinzufügen und musst hinterher nur noch von dem zweiten Formular darauf genauso zugreifen.