Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Problem mit speichern und laden von .ini einträgen (https://www.delphipraxis.net/157011-problem-mit-speichern-und-laden-von-ini-eintraegen.html)

Newcomer91 24. Dez 2010 10:50

Problem mit speichern und laden von .ini einträgen
 
Guten Morgen,

ich beschäftige mich seit kurzem mit ini dateien. Um ein bisschen verständnis zu bekommen schaute ich mir das tutorial bei Delphi treff an.

Nun wollte ich eine Anwendung schreiben welche auf einem form eine Combobox und ein Editfeld enthält.Ganz einfach eigentlich. nun gebe ich ins Editfeld etwas ein und es soll in der ini datei gespeichert werden. Es geht um Benutzer. Wenn Diese einträge dann gespeichert worden sind soll man sie in der Combobox auswählen können.

1. Problem: Ich kann nur einen Eintrag speichern.
Delphi-Quellcode:
var
  ini: TIniFile;
begin
  ini:= TIniFile.create(ExtractFilePath(ParamStr(0))+ 'Settings.ini');

  if edtWriter.Text <> '' then
    begin
      ComboBox1.Items.Add(edtWriter.Text);
      ini.WriteString('Verfasser','Name',edtWriter.Text);
      ini.free;
    end;
end;]
2. Problem: Es wird nicht in die Combobox geladen..
Delphi-Quellcode:
  ini: TIniFile;
begin
  ini:= TIniFile.create('Settings.ini');
  try
    Combobox1.ItemIndex := ComboBox1.Items.IndexOf(Ini.ReadString('Verfasser', 'Name', ''));
  finally
    ini.free;
  end;
end;
Was ist der dritte Parameter? würd am liebsten einfach ALL reinschreiben.. : /

Vielen dank im voraus,

New

himitsu 24. Dez 2010 10:55

AW: Problem mit speichern und laden von .ini einträgen
 
Wo lädst du denn was in die ComboBox?
[add] oder sind die Texte in der ComboBox fest?
Wenn ja, dann zerlege doch mal die verschachtelten Befehle und schau nach (Debuggen), was die einzelen Befehle machen/zurückliefern und vergleich das mit dem, was du erwartest, das sie machen sollten.

Du sagst nur Lade den einen Namen ( ReadString ),
suche diesen in der ComboBox ( IndexOf )
und zeige diesen an, falls er gefunden wurde ( ItemIndex:= ).

PS: In der OH steht drin, was der dritte Parameter macht > Delphi-Referenz durchsuchenTIniFile.ReadString

PSS: Wenn edtWriter.Text leer ist, dann gibst du, beim Schreiben, die INI nicht mehr frei.

Newcomer91 24. Dez 2010 11:06

AW: Problem mit speichern und laden von .ini einträgen
 
zu PS: hab mich da durchgelesen, aber das kann doch nicht sein dass man jeden Comboboxeintrag angeben muss im quelltext, also dass man nicht einfach alles laden kann, unbestimmte menge sondern vorab sagen muss wie z.B. hier
Delphi-Quellcode:
    Top    := SettingsFile.ReadInteger(Name, 'Top', Top );
    Left   := SettingsFile.ReadInteger(Name, 'Left', Left );
    Width  := SettingsFile.ReadInteger(Name, 'Width', Width );
    Height := SettingsFile.ReadInteger(Name, 'Height', Height );
    Caption := SettingsFile.ReadString (Name, 'Caption', Caption);
Das man jedes Item angeben muss.

zu PPS: also muss ich der ini an einer anderen stelle zusätzlich die möglichkeit geben free zu werden?

Danke für die schnelle antwort

DelphiBandit 24. Dez 2010 11:13

AW: Problem mit speichern und laden von .ini einträgen
 
Hast Du richtig verstanden - man muß immer den genauen Namen mit angeben. Das bekommst Du mit einer Zeile ReadString in einer Ini also so nicht hin. Ich baue mir für solche Fälle immer einen Count in die Sektion mit ein und der enthält die Anzahl die ich lesen muss. Sieht dann in der Ini z.B. so aus
Code:
[Abschnitt]
Count=3
Wert1=abc
Wert2=def
Wert3=ghi
Man muss dazu dann den Count auswerten und sich in einer Schleife die Werte holen
Delphi-Quellcode:
ReadString('Abschnitt', 'Wert'+IntToStr(i), '');

Und noch zu dem Free - er kommt bei Dir nicht in jedem Fall dorthin, obwohl Du die ini jedesmal am Anfang erzeugst. Besser wäre es so:
Delphi-Quellcode:
  ini:= TIniFile.create(ExtractFilePath(ParamStr(0))+ 'Settings.ini');
  try
    if edtWriter.Text <> '' then
    begin
      ComboBox1.Items.Add(edtWriter.Text);
      ini.WriteString('Verfasser','Name',edtWriter.Text);
    end;
  finally
    ini.free;
  end;

Newcomer91 24. Dez 2010 11:20

AW: Problem mit speichern und laden von .ini einträgen
 
Danke ich verstehe ;)

Werds gleich mal alles ausprobieren.

Sir Rufo 24. Dez 2010 12:21

AW: Problem mit speichern und laden von .ini einträgen
 
Nun ja ganz so schlimm ist es ja nun auch nicht.

Schließlich gibt TIniFile ja auch noch die Methode
Delphi-Quellcode:
ReadSection
und
Delphi-Quellcode:
ReadSectionValues
her.

Damit kann man schon die Inhalte einer ComboBox füllen.

Code:
[Verfasser]
Peter=1
Walter=1
Hans=1
Delphi-Quellcode:
ini.ReadSection( 'Verfasser', ComboBox1.Items );
In der ComboBox sind jetzt folgende Einträge
Code:
Peter
Walter
Hans

Matze 24. Dez 2010 12:40

AW: Problem mit speichern und laden von .ini einträgen
 
Verwende generell absolute Pfade. Beim Speichern machst du das, beim Laden nicht. Du weißt daher nicht, in welchem Verzeichnis die Datei gesucht wird (im Arbeitsverzeichnis, was aber nicht dem Programmverzeichnis entsprechen muss).
Also immer absolute Pfade angeben.

Dass man im Programmverzeichnis nicht unbedingt Schreibrechte hat, ist dir hoffentlich klar (für portable Programme auf USB-Sticks ist das Verzeichnis jedoch sinnvoll). Daher möchte ich diese immer wiederkehrende Belehrung, wo man (nicht) speichern soll, nicht erneut starten. ;)

himitsu 24. Dez 2010 12:45

AW: Problem mit speichern und laden von .ini einträgen
 
INI-Dateien ohne Prad, werden im Windows-Verzeichnis gesucht.
(oder entsprechend in der Virtualisierung des UAC)

Matze 24. Dez 2010 12:51

AW: Problem mit speichern und laden von .ini einträgen
 
Zitat:

Zitat von himitsu (Beitrag 1070327)
INI-Dateien ohne Prad, werden im Windows-Verzeichnis gesucht.
(oder entsprechend in der Virtualisierung des UAC)

Sicher? Bis XP wurde es im Arbeitsverzeichnis gesucht, was das Programmverzeichnis sein kann (und oft ist) oder auch ein ganz anderes. Wurde das mit Vista/Win7 geändert?
Meiner Meinung nach ist es Quatsch, wenn sich relative Pfade auf das Windowsverzeichnis beziehen ...

himitsu 24. Dez 2010 12:55

AW: Problem mit speichern und laden von .ini einträgen
 
MSDN-Library durchsuchenWritePrivateProfileString
Zitat:

If the lpFileName parameter does not contain a full path and file name for the file, WritePrivateProfileString searches the Windows directory for the file. If the file does not exist, this function creates the file in the Windows directory.
Man wollte damals wohl auch schon einen zentralen Ort für solche Einstellungen haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:06 Uhr.
Seite 1 von 2  1 2      

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