AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

INI File Schreiben und auslesen

Ein Thema von floppybe · begonnen am 13. Mär 2014 · letzter Beitrag vom 24. Mär 2014
Antwort Antwort
Seite 2 von 2     12   
Popov
(Gast)

n/a Beiträge
 
#1

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 16:31
..., mit dem Unterschied, dass man nun keine Ini mitschleppten muss.
Zumindestens mir fällt es wesentlich einfacher mit "richtigen" Dateien umzugehen als in den Tiefen der Registry etwas zu überprüfen.
Und dann verbleibt der Schrott von allen möglichen Programmen auch noch da...
Man kann also durchaus geteilter Meinung über den Vorteil von INI-Dateien sein.
Du bist Programmierer, da sollte man die Registry positiv sehen. Die Aversion die einige hier (nicht nur du) gegen Einsatz von Registry haben, ist ja schon etwas beängstigend. Außerdem schreibt man nichts in die Tiefen der Registry, sondern nur in HKEY_CURRENT_USER, und da in den Zweig SOFTWARE (zumindest wenn man TRegIniFile mit dem Pfad nutzt). Das ist der Bereich für die Software, der ist extra dazu gedacht, dass man da seine Einstellungen speichert.

Natürlich hat die Ini seinen Vorteil, der Nachteil ist aber, dass man sie nicht überall speichern kann. Die Alternative mit dem Anwendungsdaten-Ordner ist ok, das Problem ist, dass man sich vorher immer erst verrenken muss um den Ordner zu finden. Selbst wenn man den Ordner nicht mit der Spezial-Ordner-Funktion sucht und die Umgebungsvariablen nutzt, es muss immer erst nachgeguckt werden wie der Code so ist.
Delphi-Quellcode:
var
  Str: array [0..1023] of Char;
  Len: Integer;
begin
  Len := ExpandEnvironmentStrings(PChar('%APPDATA%'), Str, 1024);
Kürzer geht es nicht, in der Regel ist der Code komplizierter, aber heute ist so ein schöner Tag, deshalb habe ich es einfach gehalten. Die dritte Alternative ist einfach die TIniFile gegen die TRegIniFile tauschen, und schon sind alle Probleme vergessen
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#2

AW: INI File Schreiben und auslesen

  Alt 13. Mär 2014, 23:53
Crosspost Delphitreff
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#3

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 01:00
Hallo,

ich gebe Deinen Code jetzt mal in gekürzter Fassung wieder:
Delphi-Quellcode:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
const
  Sektion='language';
  Eintrag='last language';
var
  ini: TIniFile;
begin
  ini := TIniFile.Create(filename);
  try
    ini.WriteString(Sektion,Eintrag,ComboBox1.Text);
  finally
    Ini.Free;
  end;
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var
  ini: TIniFile;
begin
  ini := TIniFile.Create(filename);
  try
    ComboBox1.Text := Ini.ReadString('Sektion', 'Eintrag', 'Wert');
  finally
    ini.Free;
  end
end;
Aua!

Dein FormClose schreibt:
Code:
[language]
last language=das was in ComboBox1.Text steht
Dein FormCreate ließt (bzw. möchte lesen):
Code:
[Sektion]
Eintrag=
Da vermutlich weder der Abschnitt Sektion, noch der Schlüssel Eintrag existiert bzw. dem Schlüssel Eintrag kein Wert zugewiesen ist, steht am Ende der string 'Wert' in ComboBox1.Text drin - und das ist dann schon richtig so.

Versuche es mal so (das mit dem filename musst Du halt noch ergänzen):
Delphi-Quellcode:
const
  Sektion = 'language';
  Eintrag = 'last language';

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  ini: TIniFile;
begin
  ini := TIniFile.Create(filename);
  try
    ini.WriteString (Sektion, Eintrag, ComboBox1.Text);
  finally
    Ini.Free
  end;

procedure TForm1.FormCreate(Sender: TObject);
var
  ini: TIniFile;
begin
  ini := TIniFile.Create(filename);
  try
    ComboBox1.Text := Ini.ReadString (Sektion, Eintrag, 'Default');
  finally
    ini.Free
  end
end;
[EDIT]
Scheinbar ändert sich filename in Deiner Anforderung nicht; deshalb wäre es sinnvoll, dass Du Dir diese Geschichte nur einmal (FormCreate) zusammenschraubst und anschließend nur noch darauf zugreifst. Also:
Delphi-Quellcode:
type
  TForm1 = class (TForm)
  private
    FIniFileName : string;
  end;

procedure TForm1.CloseForm (Sender : TObject);
begin
  ini := TIniFile.Create (FIniFileName);

  // Rest wie gehabt
end;

procedure TForm1.CreateForm (Sender : TObject);
begin
  FIniFileName := ExtractFilePath (ParamStr (0)) + 'ini\einstellungen.ini';
  
  // Rest wie gehabt
end;
[/EDIT]

Gruß
Volker Zeller

Geändert von Volker Z. (14. Mär 2014 um 02:00 Uhr)
  Mit Zitat antworten Zitat
floppybe

Registriert seit: 24. Dez 2008
Ort: Belp
65 Beiträge
 
Delphi XE5 Architect
 
#4

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 02:02
Hallo Volker Z.,

ein Dankeschön dass Du Dir Zeit nimmst für mein Problem.
In der INI Steht nun:

[language]
last language=Französisch

Ich verstehe nun das nicht, wie der Eintrag "Französisch"
wieder in die Combobox zurück kommt.

Ich habe nun also genau den Wert den ich brauche.
Nur das mit dem Auslesen verstehe ich nicht.

Herzlichen Dank allen die da mir das ganze näher Bringen.

Chris


Hallo,

ich gebe Deinen Code jetzt mal in gekürzter Fassung wieder:

Dein FormCreate ließt (bzw. möchte lesen):
Code:
[Sektion]
Eintrag=
Da vermutlich weder der Abschnitt Sektion, noch der Schlüssel Eintrag existiert bzw. dem Schlüssel Eintrag kein Wert zugewiesen ist, steht am Ende der string 'Wert' in ComboBox1.Text drin - und das ist dann schon richtig so.



Gruß
Christian Schär
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#5

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 02:58
Hallo,

nochmal: Beim Schreiben der Daten in die INI nutzt Du die Konstante Sektion='language'; ; Du legst also im Abschnitt 'language' den Schlüssel 'last language' an und hinterlegst dort einen bestimmten Wert ('Französisch'). Soweit passt alles.

Beim Lesen aus der INI greifst Du aber auf den Abschnitt 'Sektion' zu - und eben nicht auf 'language'. Oder: Du liest etwas, was gar nicht 'da' ist.

Ein ComboBox1.Text := Ini.ReadString ('language', 'last language', 'Default'); würde funktionieren, ein ComboBox1.Text := Ini.ReadString ('Sektion', 'Eintrag', 'Wert'); wird es nicht tun.

Deshalb: Nimm die Konstanten aus FormClose und FormCreate raus, definiere Dir die Dinger "global" und greife beim Lesen/Schreiben auf diese Konstanten zu.

Groschen nun gefallen?

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 07:48
Klein wenig übertrieben der Code, aber es soll ja ein Beispiel sein:
Delphi-Quellcode:
uses
  IniFiles;

const
  LangList = 'Deutsch, Englisch, Französisch, Spanisch'; //Mit Komma getrennte Liste
  IniLangSection = 'Sprachen';
  IniLangList = 'ListeSprachen';
  IniCurLang = 'AktuelleSprache';

function GetIniPath(var IniPath: String): Boolean;
const
  IniSubFolder = 'Ini\';
  IniFileName = 'Einstellungen.ini';
var
  Path: String;
begin
  Path := ExtractFilePath(ParamStr(0));
  IniPath := Path + IniSubFolder + IniFileName;

  Result := ForceDirectories(Path + IniSubFolder);
  if not Result then
    MessageDlg('Fehler. Es konnte kein Ini Ordner angelegt werden.', mtError, [mbOK], 0);
end;

procedure LoadFromIni(ComboBox: TComboBox);
var
  IniFile: TIniFile;
  IniPath: String;
  s: String;
  k: Integer;
begin
  if not GetIniPath(IniPath) then Exit;

  IniFile := TIniFile.Create(IniPath);
  try
    s := IniFile.ReadString(IniLangSection, IniLangList, LangList);
    ComboBox.Items.CommaText := s;
    k := IniFile.ReadInteger(IniLangSection, IniCurLang, 0);
    if (k > -1) and (k < ComboBox.Items.Count) then
      ComboBox.ItemIndex := k;
  finally
    IniFile.Free;
  end;
end;

procedure SaveToIni(ComboBox: TComboBox);
var
  IniFile: TIniFile;
  IniPath: String;
  s: String;
begin
  if not GetIniPath(IniPath) then Exit;

  IniFile := TIniFile.Create(IniPath);
  try
    IniFile.WriteString(IniLangSection, IniLangList, ComboBox.Items.CommaText);
    IniFile.WriteInteger(IniLangSection, IniCurLang, ComboBox.ItemIndex);
  finally
    IniFile.Free;
  end;
end;

procedure AddLanguage(ComboBox: TComboBox; Name: String);
begin
  ComboBox.Items.Add(Name);
end;

procedure TForm1.ButtonLoadClick(Sender: TObject);
begin
  LoadFromIni(ComboBox1);
end;

procedure TForm1.ButtonSaveClick(Sender: TObject);
begin
  SaveToIni(ComboBox1);
end;

procedure TForm1.ButtonAddClick(Sender: TObject);
var
  s: String;
begin
  s := InputBox('Sprache', 'Neue Sprache hinzufügen', '');
  if Trim(s) <> 'then
    AddLanguage(ComboBox1, s);
end;

Geändert von Popov (14. Mär 2014 um 07:53 Uhr)
  Mit Zitat antworten Zitat
floppybe

Registriert seit: 24. Dez 2008
Ort: Belp
65 Beiträge
 
Delphi XE5 Architect
 
#7

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 10:33
Hallo Volker Z.,

leider übersteigt das ganze mein Verständnis, nein, ich habs nicht so ganz verstanden.
Dass ich es lieber Global mache verstehe ich noch, aber wesshalb dann statt "Eintrag"
direkt "language" setzen verstehe ich noch nicht so ganz.

Und wesshalb übernimmt er mir den Wert nicht aus der INI ? In der INI Stehts ja.
Ich habe nochmals gelesen im TUT, Edit1.Text:=Ini.ReadString('Section', 'Schlüssel1', 'kein Wert'); "Kein Wert" ist ja ein direkter Eintrag und nicht der Wert aus der INI oder verstehe ich das Falsch ?
Was muss ich dann einfügen bei "Wert" resp. "kein Wert" dass es klappt ? Muss ich doch noch eine Const. für "Wert" hinterlegen ?

Aber ich habe leider völligen Bahnhof.
Sorry für meine lange Leitung.

Chris

Hallo,

nochmal: Beim Schreiben der Daten in die INI nutzt Du die Konstante Sektion='language'; ; Du legst also im Abschnitt 'language' den Schlüssel 'last language' an und hinterlegst dort einen bestimmten Wert ('Französisch'). Soweit passt alles.

Beim Lesen aus der INI greifst Du aber auf den Abschnitt 'Sektion' zu - und eben nicht auf 'language'. Oder: Du liest etwas, was gar nicht 'da' ist.

Ein ComboBox1.Text := Ini.ReadString ('language', 'last language', 'Default'); würde funktionieren, ein ComboBox1.Text := Ini.ReadString ('Sektion', 'Eintrag', 'Wert'); wird es nicht tun.

Deshalb: Nimm die Konstanten aus FormClose und FormCreate raus, definiere Dir die Dinger "global" und greife beim Lesen/Schreiben auf diese Konstanten zu.

Groschen nun gefallen?

Gruß
Christian Schär
  Mit Zitat antworten Zitat
floppybe

Registriert seit: 24. Dez 2008
Ort: Belp
65 Beiträge
 
Delphi XE5 Architect
 
#8

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 01:51
Hallo Perlsau,

Das hast Du aber Gut erkannt, ich habe es ja schon geschrieben.
Darf man etwas anständige Antworten erwarten wenn man nicht mehr weiter weis ?

Gruss

Chris
Christian Schär
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 Uhr.
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