Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi INI Dateien auslesen (https://www.delphipraxis.net/3206-ini-dateien-auslesen.html)

Pseudemys Nelsoni 28. Feb 2003 16:13


INI Dateien auslesen
 
moinmoin

siehe topic, hab danah auch schon im forum gesucht und alles gelesen kompilieren lässt sich das ganze zwar aber irgendwie funzt der code nicht:

Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
var settings: TIniFile;
begin
  settings := TIniFile.Create('settings.ini');
  settings.ReadString('Nick', 'nickname', edit1.Text);
end;
möchte aus der datei was auslesen und es in einer editbox anzeigen lassen

...btw isses normal das ich bei "uses" das "inifiles" selbst eintragen musste? sonst geht das doch immer von selbst

gruss mario

Daniel B 28. Feb 2003 16:31

Moin silent,

Du musst noch die INI freigeben.
Das geht mit
settings.Free;
oder besser:
FreeAndNil(settings);
Und aussehen sollte es eh ein bisschen anders. //Sicherheitshalber

Delphi-Quellcode:
begin
  Ini := TIniFile.Create('Meine.ini');
  try
    Ini.ReadIrgendwas();
  finally
    FreeAndNil(Ini);
  end;
end;
Grüsse, Daniel :hi:

nailor 28. Feb 2003 16:54

das try braucht man eigentlich nicht. Falls es misslingt, wird ja ein default genommen...

Daniel B 28. Feb 2003 17:00

Zitat:

Zitat von Nailor
das try braucht man eigentlich nicht.

Ich hab ja auch "Sicherheitshalber" geschrieben. Es geht auch ohne.
Dennoch sollte man es verwenden.

Grüsse, Daniel :hi:

sakura 28. Feb 2003 17:09

Zitat:

Zitat von Nailor
das try braucht man eigentlich nicht. Falls es misslingt, wird ja ein default genommen...

Das System kann auch aus ganz anderen Gründen abstürzen. Den try...finally...end sollte man fast immer nutzen, auch wenn es auf den ersten Blick überflüssig erscheint.

...:cat:...

Pseudemys Nelsoni 28. Feb 2003 18:13

huhu, danke für die antworten, funzt aber immer noch nicht.
hab das jetzt so:

Delphi-Quellcode:
procedure TForm3.FormCreate(Sender: TObject);
var settings: TIniFile;
begin
  settings := TIniFile.Create('settings.ini');
  Try
    settings.ReadString('Nick', 'nickname', edit1.Text);
  finally
    FreeAndNil(settings);
  end;
end;
aber das edit feld bleibt beim onactivate und oncreate leer

meine ini sieht so aus:

[nick]
nickname=test
passwort=test

gruss ^^

Daniel B 28. Feb 2003 18:15

:mrgreen:
Du hast da was missverstanden.
Sollte so aussehen:
Delphi-Quellcode:
Edit1.Text := Settings.ReadString('Nick', 'NickName', '');
Du willst ja das was in der ini ist, dem Edit zuweisen!

Grüsse, Daniel :hi:

Christian Seehase 28. Feb 2003 18:52

Moin Mario,

was Du auch noch auf jeden Fall bedenken solltest:

Wenn Du

Delphi-Quellcode:
 TIniFile.Create('Settings.ini');
benutzt, muss sich die Datei beim Create im Windos Verzeichnis befinden, was aber etwas unpraktisch ist (das irgendein anderes Programm den gleichen Namen für seine INI verwendet ist ja nicht ganz unwahrscheinlich.
Besser wäre es immer einen genauen Pfad anzugeben, wo sich die INI befindet z.B.

Delphi-Quellcode:
TIniFile.Create(ExtractFilePath(paramstr(0))+'settings.ini');
für das Programmverzeichnis.

Daniel B 28. Feb 2003 18:57

Moin Christian, reh :mrgreen:
Zitat:

Zitat von Christian Seehase
benutzt, muss sich die Datei beim Create im Windos Verzeichnis befinden, was aber etwas unpraktisch ist (das irgendein anderes Programm den gleichen Namen für seine INI verwendet ist ja nicht ganz unwahrscheinlich.

Zustimm.
Man könnte aber auch noch gleich den Dateinamen einfach übernehmen. Die liegt im gleichen Verzeichniss und hat den gleichen Dateinamen.
Delphi-Quellcode:
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
Grüsse, Daniel :hi:

Pseudemys Nelsoni 28. Feb 2003 18:59

hoi,

jo danke nun klappts, aber kann ichs noch so machen das ich das so angeben kann das die ini da ist wo auch die exe ist, statt "C:\Programme\Borland\Delphi6\bla\settings.ini " ??

Christian Seehase 28. Feb 2003 19:02

Moin Mario,

schau Dir doch mal
  1. den letzten Satz meines Postings und
  2. die Beschreibung von paramstr(0) in der Hilfe

an. ;-)

nailor 28. Feb 2003 23:13

Delphi-Quellcode:
ExtractFilePath(Application.ExeName);
dürfte den Ordner mit der Exe drin sein.

Christian Seehase 28. Feb 2003 23:14

Moin Nailor,

paramstr(0) gibt das gleiche zurück wie Application.Exename, nur hast Du in Konsolenprogrammen den Vorteil, dass Du nicht die Unit Forms einbinden musst.
Ausserdem schreibt es sich kürzer ;-)

Daniel B 28. Feb 2003 23:16

Zitat:

Zitat von Nailor
Delphi-Quellcode:
ExtractFilePath(Application.ExeName);
dürfte den Ordner mit der Exe drin sein.

Das geht auch mit:
Delphi-Quellcode:
ini := TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini'));
Nur das man so auch gleich den Namen dex exe hat und somit nur noch die Erweiterung .ini angeben muss. Die ini hat dann den Namen der exe.

Grüsse, Daniel :hi:

Christian Seehase 28. Feb 2003 23:18

Moin Daniel,

nur wäre es eventuell praktischer der INI einen aussagekräftigen Namen zu geben.
Zum einen ist es dann leichter sie ihrer Funktion zuzuordnen, zum anderen:

Was machst Du, wenn Du mehrere Ini's brauchst?

Daniel B 28. Feb 2003 23:21

Moin Christian,
Zitat:

Zitat von Christian Seehase
Was machst Du, wenn Du mehrere Ini's brauchst?

Guter einwand. ;)
Hast recht, aber bis jetzt bin ich noch mit einer ausgekommen. Es gibt ja auch noch TBigIniFile. Somit kann man da auch noch genug reinpacken. ;)
Aber im prinzip hast Du recht.

Grüsse, Daniel :hi:

Christian Seehase 28. Feb 2003 23:24

Moin Daniel,

es geht mir auch nicht um die 64KB Grenze, sondern um die sinnvolle Verteilung der Daten.

Pseudemys Nelsoni 1. Mär 2003 06:01

hab das nun folgendermaßen:

Delphi-Quellcode:
procedure TForm3.FormActivate(Sender: TObject);
var settings: TIniFile;
begin
  settings := TIniFile.Create(ExtractFilePath(paramstr(0))+'settings.ini');
  Try
    edit1.Text := settings.ReadString('Nick', 'nickname', '');
  finally
    FreeAndNil(settings);
  end;
end;
funzt aber nicht, Inkompatible Typen TiniFIle und String

ist was falsch? (würd mich bei mir nicht wundern :D)

grus mario ;)

Luckie 1. Mär 2003 06:10

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var settings: TIniFile;
begin
  settings := TIniFile.Create(ExtractFilePath(paramstr(0))+'settings.ini');
  Try
    edit1.Text := settings.ReadString('Nick', 'nickname', '');
  finally
    FreeAndNil(settings);
  end;
end;
Läßt sich ohne Fehler kompilieren. Geh erst mal schlafen.

Pseudemys Nelsoni 1. Mär 2003 06:20

ja jetzt bei mir auch hatte 2 zeilen vertauscht, aber das editfeld bleibt leer

btw: hab von 2:30 bis 6 schon geschlafen


gruss mario ;)

Pseudemys Nelsoni 1. Mär 2003 06:25

hab gerade gemerkt das die ini nicht vorhanden war, muss irgendwie gelöscht worden sein, ka hatte pc heut nacht ohne herunterzufahren ausgemacht...

also vielen danke für die hilfe leute :)

gruss mario

Luckie 1. Mär 2003 06:27

Klar bleibt es leer, wenn die Sektion oder Schlüssel nicht existiert wird der default-String genommen und den hast du mit '' angegeben.

Reicht nicht. Legt dich noch mal hin.

Pseudemys Nelsoni 1. Mär 2003 07:42

jo hehe sorry, hab halt noch nicht so nen grossen plan davon :(

btw nochmal was...

Delphi-Quellcode:
procedure TForm3.FormActivate(Sender: TObject);
var settings: TIniFile;
begin
  settings := TIniFile.create(ExtractFilePath(ParamStr(0)) + 'settings.ini');
  Try
    edit1.Text := settings.ReadString('nick', 'nickname', '');
    edit2.Text := settings.ReadString('nick', 'passwort', '');
    if settings.ReadString('server', 'servernr', '') = '1' then
    begin
      listbox1.Selected[1-1] := true;
    end;
    if settings.ReadString('server', 'servernr', '') = '2' then
    begin
      listbox1.Selected[2-1] := true;
    end;
    if settings.ReadString('server', 'servernr', '') = '3' then
    begin
      listbox1.Selected[3-1] := true;
    end;
    if settings.ReadString('server', 'servernr', '') = '4' then
    begin
      listbox1.Selected[4-1] := true;
    end;
    if settings.ReadString('server', 'servernr', '') = '5' then
    begin
      listbox1.Selected[5-1] := true;
    end;
  finally
    settings.Free;
  end;
end;
wie man da sieht sind da ca 5 mal

Delphi-Quellcode:
if settings.ReadString('server', 'servernr', '') = '4' then
    begin
      listbox1.Selected[4-1] := true;
    end;
solche sachen (nur mit anderen werten)

könnte man das nicht irgendwie kürzer machen? also nicht für jeden wert nochmal das ganze schreiben? mit ner prozedur(?) oder so??

gruss mario

btw: schlafen geht nimmer muss noch pc kaufen :(

Christian Seehase 1. Mär 2003 13:27

Moin Mario,

sollte so gehen:

Delphi-Quellcode:
procedure TForm3.FormActivate(Sender: TObject);
var
  settings: TIniFile;
  i      : integer;

begin
  settings := TIniFile.create(ExtractFilePath(ParamStr(0)) + 'settings.ini');
  Try
    edit1.Text := settings.ReadString('nick', 'nickname', '');
    edit2.Text := settings.ReadString('nick', 'passwort', '');
    for i := 0 to 4 do
    begin
      ListBox1.Selected[i] := Settings.ReadString('server','servernr','') = IntToStr(i+1);
    end;
  finally
    settings.Free;
  end;
end;

Pseudemys Nelsoni 1. Mär 2003 14:54

moin christian, danke für den code, das funktioniert bei mir nur nicht :(

also ich hab ne ini datei da steht ca:

[server]
servernr=2

Servernummer kann zwischen 1-5 schwanken deswegen soll beim oncreate meines form3's aus der ini gelesen werden welche zahl da ist also 1,2,3,4 oder 5 und dann dementsprechen z.b wenn da 4 steht soll die 4. Zeile meiner listbox markiert anzeigezeigt werden

hoffe das du mir das sagen kannst :)

gruss mario

Christian Seehase 1. Mär 2003 15:39

Moin Mario,

mir ist zwar im Moment nicht so recht klar, warum das nicht funktioniert (auch wenn's nicht schön ist die Servernummer fünfmal zu lesen, gehen sollte es so), aber ich hätte da noch eine Idee:

Delphi-Quellcode:
var
  settings : TIniFile;
  iServerNr : integer;

begin
  settings := TIniFile.create(ExtractFilePath(ParamStr(0)) + 'settings.ini');
  Try
    edit1.Text := settings.ReadString('nick', 'nickname', '');
    edit2.Text := settings.ReadString('nick', 'passwort', '');
    iServerNr := Settings.ReadInteger('server','servernr',-1);
    if iServerNr <> -1 then
    begin
      ListBox1.Selected[iServerNr-1] := true;
    end;
  finally
    settings.Free;
  end;
end;
Da die ServerNummer ja numerisch ist, kannst Du sie auch gleich als Integer lesen.

Pseudemys Nelsoni 2. Mär 2003 18:23

genau so meinte ich das, danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 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