Entwickler-Ecke

Dateizugriff - Programme aus einer INI-Datei laden


kongreddgrass - Mi 17.09.03 20:24
Titel: Programme aus einer INI-Datei laden
Hallo,

ich will bei mir ein Progg machen, dass festgelegte Programme starten soll.
In der Standartansicht(beim start) stehen Buttons. In einem erweiterten Formular werden die Pfade festgelegt und in einer INI-Datei abgespeichert.
Dafür habe ich solchen Code:

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); //speichern
var
  MyIni: TIniFile;
  i: Integer;
begin
  MyIni := TIniFile.Create('C:\Windows\Profiles\Slidermike\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); //laden
var
  MyIni: TIniFile;
  i: Integer;
begin
  MyIni := TIniFile.Create('C:\Windows\Profiles\Slidermike\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;


Nun habe ich das Problem. Ich will, das in der Standartansicht die Buttons 1...5 aus der Datei den jeweiligen Pfad laden.

Und ein Zweites: Ich will im erweiterten, also wie oben, auch die Namen der Programme abspeichern. Dies weiß ich auch. Nun will ich, dass die Buttons den jeweiligen Namen haben.

Hoffe, jemand hat was auf Lager.

Gruß
Mike

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Delete - Mi 17.09.03 23:27

ich habe leider keine zeit, um dir den code zu schreiben.

hier aber meine Idee:
Beim OnShow Erreignis der Form, generierst du die beschriftungen der Buttons

Delphi-Quelltext
1:
button1.caption := MyIni.readvalue(......);                    


Eine Datei Ausführen kannst du mit dem Befehl ShellExecute :arrow: schau doch mal in der Hilfe nach :!:


Damit du weisst, welche Beschreibung, zu welchem Befehl gehören,
Löse dies doch so:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
[Beschreibung]
1=blubb
2=blabb
3=....

[Shell]
1=c:\command.com
2=sol.exe
3=....


so sollte die Ini Datei nachher mindestens aussehen.... :!:

Ich hoffe, diese Informationen helfen dir weiter!
ansonsten helfe ich dir gerne weiter

Moderiert von user profile iconKlabautermann: Code-Tags hinzugefügt.


kongreddgrass - Do 18.09.03 20:29

Hi

ich hab jetzt ein Problem. Das Programm speichert die Datei nicht ab. Hier der Code

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

interface

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

type
  TForm5 = class(TForm)
    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;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Edit17: TEdit;
    procedure Button3Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form5: TForm5;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm5.Button3Click(Sender: TObject);
begin
  Form5.Close;
  Form2.Show;
end;

procedure TForm5.Button1Click(Sender: TObject);
var
  MyIni: TIniFile;
  i: Integer;
begin
  MyIni := TIniFile.Create(Edit17.Text+'configuration.ini');
  try
    for i := 1 to 17 do //"Zahl" des letzten Edits
      MyIni.WriteString('Programm-Pfad','Pfad' + IntToStr(i),TEdit(FindComponent('Edit' + IntToStr(i))).Text);
    for i := 18 to 36 do
      MyIni.WriteString('Programmname','Name' + IntToStr(i),TEdit(FindComponent('Edit' + IntToStr(i))).Text);
  finally
    MyIni.Free;
  end;
end;

end.

Oder liegt es daran, dass er die Datei nicht überschreiben darf?


Delete - Do 18.09.03 20:45

Theoretisch sollte es so funktionieren.

Meine Vermutung für den Fehler ist, dass du darin etwas vergessen hast:

Delphi-Quelltext
1:
MyIni := TIniFile.Create(Edit17.Text+'configuration.ini');                    


hast du daran gedacht, dass im edit17 am ende noch ein backslash ( "\") eingesetzt werden sollte, ansonsten dann vor dem 'configuration.ini'

jetzt erstellst du am besten eine Abfrage, in der du das edit17.text überprüfst, ob am Ende des Strings auch ein Backslash ist, ansonsten fügst du einen ein... :!:

War das der Fehler? Oder war meine Vermutung falsch :?: :?:


Tana´Ri - Fr 19.09.03 08:23

Tipp: mit FileExists kannst du deine Pfade prüfen ob sie in der Form auch vorhanden sind.


kongreddgrass - Fr 19.09.03 16:51

@DaBass: Jetzt geht es. Danke für die Hilfe
@Tana'ri: Kannst du mir das bitte erklären? Ich weiß nicht, wie ich es genau wie ich es anstellen soll?

Jetzt hab ich ein weiteres Problem. Ich habe nocht ein Laden-Button plaziert, mit diesem Code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm5.Button4Click(Sender: TObject);
var
  MyIni: TIniFile;
  i: Integer;
begin
  MyIni := TIniFile.Create(Edit17.Text+'\configuration.ini');
  try
    i := 1;
    while MyIni.ValueExists('Programmname','Name' + IntToStr(i)) do
    begin
      TEdit(FindComponent('Name' + IntToStr(i))).Text := MyIni.ReadString('Programmname','Name' + IntToStr(i),'kA');
      Inc(i);
    end;

  finally
    MyIni.Free;
  end;
end;

Wie bekomme ich es so, dass das Programm weiß, aus welcher Ort er die Datei laden soll. Vor allem soll es auch beim Programmstart ist, weil sonst wäre es ja umständlich, immer die Pfade hinzuschreiben?

Gruß
Mike


kongreddgrass - Sa 20.09.03 12:45

Nanu, habs ich zu schwer gemacht, oder???
Mike


Delete - So 21.09.03 21:38

Nein, du hast es nicht zu schwer gemacht. Ich war nur nicht da übers Wochenende.
Am besten ist es, wenn du die Konfigurationsdatei im Verzeichnis der Exe-Datei hast. Der Pfad der Exe-Datei erhälst du so:

Delphi-Quelltext
1:
 ProgDir  :=ExtractFilePath(ParamStr(0));                    


danach kannst du die Konfigurationsdatei folgendermassen öffnen:

Delphi-Quelltext
1:
MyIni := TIniFile.Create(ProgDir+'configuration.ini');                    


ACHTUNG: denn backslash vor dem configuration.ini musst du entfernen.

Ich hoffe, das funktioniert so :!::?::?::!:


kongreddgrass - Mo 22.09.03 21:52

Hi,
kannst du mir des in den Code reinschreiben, damit ich's besser lernen kann (+ verstehen kann). BBBBBBBiiiiiiiiiitttttttttttttttttttteeeeeeeeeee...

Gruß
Mike


Delete - Mo 22.09.03 22:25

sorry, habe keine Zeit diir die ganze Source zu erstellen.

Falls du konkrete Fragen hast, so melde dich wider.
Bin nicht der, der da alles macht....

Auserdem findest du vermutlich für alles das du brauchst ein Beispiel in diesem Form. Musst nur die Suche verwenden


Terra23 - Di 23.09.03 18:45

... ich bin etwas zu müde um mich da wieder eizuarbeiten, aber FileExists geht so:


Delphi-Quelltext
1:
2:
3:
4:
Pfad:='C:\';
If FileExists(Pfad+'Schießmichtot.doc')
Then ShowMessage('Schießmichtot.doc existiert..')
Else ShowMessage('Schießmichtot.doc existiert nicht..');


FileExists erwartet einen String als Parameter und gibt True (wenn die Datei existiert) oder False (wenn die Datei nicht existiert) zurück..


kongreddgrass - Di 23.09.03 19:23

@Terra23: Funktioniert dieser Code ab einer Prof-Version? Bei mir geht's nicht. Oder hab ich vergessen das var und dieses irgendwas hinzuschreiben?
@DaBass: Kannst du mir erklären, wo ich dieses ProgDir
und MyIni hinsetzen soll.


kongreddgrass - Di 23.09.03 19:26

Hi,
hab noch eine Idee gehabt, wo man die Datei hinspeichert.
Weil wenn die exe-Datei auf dem Desktop ist, wird man vielleicht nicht wollen, dass die ini-datei auf dem Desktop gespeichert wird.
Nun zu der Frage: Wie kann ich einen Ordner erstellen?
Ich such mal im Forum, summ summ summ , Ahhhhjaaa. Doch nichts, summ summ :D
Ok ich schau mal


Terra23 - Di 23.09.03 19:30

Du musst vorher unter "Var" die Variable Pfad als String definieren:


Delphi-Quelltext
1:
2:
var
 Pfad: String;


Ordner erstellst du so:


Delphi-Quelltext
1:
ForceDirectories('C:\Programme\Mein Programm\Unterordner');                    


Das bewirkt, daß alle Ordner, die nicht vorhanden sind (in diesem Fall "Mein Programm\Unterordner\") erzeugt werden.

Wenn man nicht weiß, wonach man suchen soll, wird's schon schwer, aber ich denke auch mit

Suche in: Delphi-Forum, Delphi-Library ORDNER ERSTELLEN wärst du fündig geworden..


kongreddgrass - Di 23.09.03 19:39

Ich hab geschaut Ordner AND erstellen OR machen.
War wohl nix. Hey, wie geht des mit der Suchfunktion?
Danke für deine Hilfe

Gruß
Mike


Delete - Di 23.09.03 22:01

ProgDir und MyINI.Create

must du dort einfügen, wo du die Konfigurationen ausliest und in die TextFelder speicherst. Wo du das machst ist mir eigentlich egal...

würde es jedoch in das Create Ereigniss der Form setzen.
[/delphi]


kongreddgrass - Do 25.09.03 18:57

Hi,
ich benutze jetzt aus Gründen (bin ja noch nicht Profi) einen anderen Code.
Diesen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
begin
 ForceDirectories('C:\Programme\Progg-Starter\Configuration');
 ForceDirectories('C:\Programme\Progg-Starter\Names');
 ini := TIniFile.Create('C:\Programme\Progg-Starter\Configuration\Configuration_01.ini');
 try
 ini.WriteString('Programm_01', 'Path', 'This is not a path');
 finally
 ini.free;
 end;
 ini := TIniFile.Create('C:\Programme\Progg-Starter\Names\Name_01.ini');
 try
 ini.WriteString('Programmname_01', 'Name', 'Dieses hier solls sein';
 finally
 ini.free;
 end;
end;


Wie kann ich bei dem kennzeicheneten String 'Dieses hier solls sein' realisieren, dass es aus einem Textfel rausliest. Mit PChar habs ich geprobt. Nix.
Könnt ihr das mir lehren??

Gruß
Mike


Delete - Do 25.09.03 19:45


Delphi-Quelltext
1:
ini.WriteString('Programmname_01', 'Name', 'TextFeld1.Text');                    


Wobei du für TextFeld1 den Namen des Textfeldes eingeben musst, das du auslesen möchtest.....


kongreddgrass - Do 25.09.03 19:58

Des funzt net.
habe aber auch schon Edit1.Text porbiert. Geht nicht

Gruß
Mike


Delete - Do 25.09.03 20:33

ou, entschuldige... die '' brauchts dann natürlich nicht...


Delphi-Quelltext
1:
ini.WriteString('Programmname_01', 'Name', Edit.Text);                    


so sollte es eigentlich funktionieren!


kongreddgrass - Do 25.09.03 20:38

Hi,
hab den Fehler selber gefunden.
Nach .Text hätte ne Klammer hingehört.
Danke für die Hilfe, brauch dich aber später noch :wink:

Gruß
Mike


Tino - Fr 26.09.03 09:56


Delphi-Quelltext
1:
ini.WriteString('Programmname_01', 'Name', TextFeld1.Text);                    


Delete - Fr 26.09.03 10:33

Doppel posts.... :wink:

musst doch nicht nochmals den gleichen Post machen den ich schon gemacht habe.. etwa drei posts davor.... auf der vorherigen Seite!!

Wenn das normale User machen würden, so würdest du dich ab denen aufregen.. oder??


kongreddgrass - Fr 26.09.03 19:33

Hi, jetzt habe ich wieder ein Problem.
Und zwar beim Button.
Den 1.Button für den Programm starten soll nämlich einen Wert herauslesen und laden.
Dies soll auch mit ShellExecute gehen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var
ini: TIniFile;
res: String;
begin
ini:=TIniFile.Create('C:\Programme\Progg-Starter\Configuration\Configuration_01.ini');
try
res:=ini.ReadStrin('Programm_01', {hier die Funktion zum auslesen});
ShellExecute(Aplicatoin.Handle, 'open, {hier der Progg-Pfad aus der INI} , nil, nil, SW_SHOW);
finally
ini.free;
end;
end;


wie kann ich es realisieren, dass der Button es aus der INI-rausliest und anschließend öffnet?

Gruß
Mike


Delete - Sa 27.09.03 13:36


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject); 
var 
ini: TIniFile; 
res: String; 
begin 
ini:=TIniFile.Create('C:\Programme\Progg-Starter\Configuration\Configuration_01.ini'); 
try 
  res:=ini.ReadString('Programm_01', {hier die Funktion zum auslesen}); 
  ShellExecute(Aplicatoin.Handle, res , nil, nil, SW_SHOW); 
finally 
ini.free; 
end; 
end;


vermutlich so...


Delete - Sa 27.09.03 13:37

wass ich noch sagen will.....

ich bin der Meinung, das du dich grundsätzlich mal ins Delphi einschaffen solltest... dann müsstest du nicht andauernd Fragen stellen....die eigentlich ganz simpel sind.

Ich hoffe du verstehst was ich meine!!


kongreddgrass - Sa 27.09.03 15:00

Hi,
ich will mir ja die Bücher bestellen.
Aber mein Vater bracuht soooollllllaaaaannnnnnngeeeeee. :evil:
Ich versteh nicht wieso?
Aber könntest du mir das noch erklären

Gruß
Mike


kongreddgrass - Sa 27.09.03 15:01

UUUuuuppps.
Brauchts mir nicht nochmal erklären.
ich habs übersehen, weil ich dachte, der Beitrag wäre von mir,
aber gut....

Gruß
Mike


Delete - Sa 27.09.03 15:02

wollte gerade sagen, das habe ich ja schon gepostet... ;-)


kongreddgrass - Sa 27.09.03 15:07

Hi,
hab rausgefunden.-
Danke für eure Hilfe.

Gruß
Mike


Tino - Mo 29.09.03 09:59

DaBass hat folgendes geschrieben:
musst doch nicht nochmals den gleichen Post machen den ich schon gemacht habe.. etwa drei posts davor.... auf der vorherigen Seite!!

Den habe ich wohl überlesen.
DaBass hat folgendes geschrieben:
Wenn das normale User machen würden, so würdest du dich ab denen aufregen.. oder??

Warum sollte ich mich darüber aufregen? Aber egal!


kongreddgrass - Mi 01.10.03 17:28

Uiii,
mein Proggi ist fertig.
Danke für EURE Hilfe.
Wie heißen eigenltich die mail-adressen von meinen Helfern???
Mein Proggi schick ich dann via mail
Aktuell ist Vers. 1.1
DaBass:
Tino:
Terra23:


kongreddgrass - Mi 01.10.03 17:29

Wenn ich meine eigene Web-Seite habe, könnts ihr dann dort runterladen.


Terra23 - Mi 01.10.03 17:40

Die Mail-Addys findest du immer im Profil, falls vorhanden. Weiterhin gibt's nen Button zum Schicken von Mails.. :-)


Delete - Mi 01.10.03 17:42

unsere mail-adressen findest du in den profilen... ;)


Delete - Mi 01.10.03 17:43

sorry.. war wohl gleichzeitig wie du am schreiben terra23... :oops:


mimi - Mi 01.10.03 18:23

ein kleiner tipp:
man sollte nie mit festen verzeinis angeben hantieren.