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 1 von 2  1 2      
Volker Z.

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

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
 
#2

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
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 08:31
Würde das eher mit einem Aufzählungstypen und über die Eigenschaft ItemIndex machen?
Delphi-Quellcode:
unit MyUnit;

interface

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

type
  TLanguage = (lgGerman, lgFrench, lgEnglich, lgSwissGerman);

const
  cLanguage: array [TLanguage] of string =
    ('Deutsch', 'Französisch', 'Englisch', 'Schweizerdeutsch');

type
  TMyForm = class(TForm)
    LanguageComboBox: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure LanguageComboBoxClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure SetLanguageComboBoxItems;
  end;

var
  MyForm: TMyForm;

implementation

{$R *.dfm}

var
  Language: TLanguage;

function LanguageRange(Value: integer): boolean;
var
  A, B: integer;
begin
  A := Integer(Low(TLanguage));
  B := Integer(High(TLanguage));
  Result := (Value >= A) and (Value <= B);
end;

function IntToLanguage(Value: integer): TLanguage;
begin
  if LanguageRange(Value) then
    Result := TLanguage(Value)
  else
    raise Exception.Create('IntToLanguage: Invalid Paramter');
end;

function LanguageToInt(Value: TLanguage): integer;
begin
  Result := Integer(Value);
end;

function IniFileName: string;
var
  Path: string;
begin
  Path := ExtractFilePath(ParamStr(0)) + 'ini\';
  if not DirectoryExists(Path) then
    if not CreateDir(Path) then
      raise Exception.Create(Format('Cannot create folder %s', [Path]));
  Result := Path + 'Einstellungen.ini';
end;

function LoadLanguageFromIniFile: TLanguage;
var
  Ini: TMemIniFile;
begin
  Ini := TMemIniFile.Create(IniFileName);
  try
    Result := IntToLanguage(Ini.ReadInteger('Language', 'Last Language', 0));
  finally
    Ini.Free;
  end;
end;

procedure SaveLanguageToIniFile(Language: TLanguage);
var
  Ini: TMemIniFile;
begin
  Ini := TMemIniFile.Create(IniFileName);
  try
    Ini.WriteInteger('Language', 'Last Language', LanguageToInt(Language));
  finally
    Ini.UpdateFile;
    Ini.Free;
  end;
end;

procedure TMyForm.LanguageComboBoxClick(Sender: TObject);
begin
  if LanguageRange(LanguageComboBox.ItemIndex) then
    Language := IntToLanguage(LanguageComboBox.ItemIndex);
end;

procedure TMyForm.SetLanguageComboBoxItems;
var
  I: TLanguage;
begin
  LanguageComboBox.Items.Clear;
  LanguageComboBox.Style := csDropDownList;
  for I := Low(I) to High(I) do // oder for I := lgGerman to lgSwissGerman do
    LanguageComboBox.Items.Add(cLanguage[I]);
end;

procedure TMyForm.FormCreate(Sender: TObject);
begin
  SetLanguageComboBoxItems;
  Language := LoadLanguageFromIniFile;
  LanguageComboBox.ItemIndex := LanguageToInt(Language);
  ShowMessage(cLanguage[Language]);
end;

procedure TMyForm.FormDestroy(Sender: TObject);
begin
  SaveLanguageToIniFile(Language);
end;

procedure DoSomething;
begin
  if Language = lgEnglich then
    ShowMessage('I like Englich');
end;

procedure DoSomethingElse;
begin
  case Language of
    lgGerman:
    begin

    end;
    lgFrench:
    begin

    end;
    lgEnglich:
    begin

    end;
    lgSwissGerman:
    begin

    end;
  end;
end;

end.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 08:39
@Popov

Hier würden sich Exceptions besser machen, denn nun gibt es auch einen Hinweis, warum der nicht erstellt werden konnte
Delphi-Quellcode:
function GetIniPath : string;
const
  IniSubFolder = 'Ini\';
  IniFileName = 'Einstellungen.ini';
var
  Path: String;
begin
  Path := ExtractFilePath(ParamStr(0));
  Result := Path + IniSubFolder + IniFileName;

  if not ForceDirectories( Path + IniSubFolder ) then
    RaiseLastOSError;
end;

procedure LoadFromIni(ComboBox: TComboBox);
var
  IniFile: TIniFile;
  s: String;
  k: Integer;
begin
  IniFile := TIniFile.Create( GetIniPath );
  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;
  s: String;
begin
  IniFile := TIniFile.Create( GetIniPath );
  try
    IniFile.WriteString(IniLangSection, IniLangList, ComboBox.Items.CommaText);
    IniFile.WriteInteger(IniLangSection, IniCurLang, ComboBox.ItemIndex);
  finally
    IniFile.Free;
  end;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Mär 2014 um 08:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von user0815
user0815

Registriert seit: 5. Okt 2007
331 Beiträge
 
Delphi XE2 Professional
 
#5

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 10:01
Ich würde die INI nicht ins Programmverzeichnis "ExtractFilePath(ParamStr(0))" packen, sondern ein passendes Verzeichnis dafür nehmen Stichwort: .http://www.delphipraxis.net/153680-c...ml#post1041628

http://www.delphipraxis.net/158434-o...ml#post1082613
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 11:41
@Popov

Hier würden sich Exceptions besser machen, denn nun gibt es auch einen Hinweis, warum der nicht erstellt werden konnte
Besser schon, ich weiß nur nicht ob TE RaiseLastOSError verstehen würde. Evtl. hätte man raise Exception.Create('Fehler. Es konnte kein Ini Ordner angelegt werden.'); nehmen können. In dem Fall könnte man auch ein String als Ergebnis liefern und dennoch eine eigene Fehlermeldung verfassen.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 12:13
@Popov

Hier würden sich Exceptions besser machen, denn nun gibt es auch einen Hinweis, warum der nicht erstellt werden konnte
Besser schon, ich weiß nur nicht ob TE RaiseLastOSError verstehen würde. Evtl. hätte man raise Exception.Create('Fehler. Es konnte kein Ini Ordner angelegt werden.'); nehmen können. In dem Fall könnte man auch ein String als Ergebnis liefern und dennoch eine eigene Fehlermeldung verfassen.
Du hast Recht, dass die Fehlermeldung ruhig eindeutiger/informativer sein sollte. Hier also mit der OS-Meldung und dem Verzeichnis:
Delphi-Quellcode:
  if not ForceDirectories( Dir ) then
    RaiseLastOSError( GetLastError, Format(' "%s"', [Dir] ) );
Zitat:
EOSError: Systemfehler. Code: 3.
Das System kann den angegebenen Pfad nicht finden "X:\Test\Peter"
Zitat:
EOSError: Systemfehler. Code: 161.
Der angegebene Pfadname ist ungültig "\\192.168.0.1\Data\Test\Peter"
Und das mit dem Verstehen ist ja auch nicht so schwer, wenn er einen Blick auf Delphi-Referenz durchsuchenRaiseLastOSError wirft
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (14. Mär 2014 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#8

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 15:29
Und das mit dem Verstehen ist ja auch nicht so schwer, wenn er einen Blick auf Delphi-Referenz durchsuchenRaiseLastOSError wirft
Also gegen Raise an sich ist ja nichts zu sagen, auf der anderen Seite ist die Frage seit zwei Seiten - was ist bei Ini ein Defaultwert?

Außerdem, was interessiert den Endnutzer, oder gar den TE der ErrorCode 5. Das ist fast so gut wie die Frage nach dem Sinn des Lebens mit der Antwort 42. Es sollte also immer ein Text da stehen.

Wo wir aber dabei sind, ich kenne die Schreibweise RaiseLastOSError( GetLastError, Format(' "%s"', [Dir] ) ); nicht, ist das neu > D7?
  Mit Zitat antworten Zitat
floppybe

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

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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: INI File Schreiben und auslesen

  Alt 14. Mär 2014, 10:44
@floppybe

Wenn du dem Nachbarn Meier (Ident) im Haus zu deiner Linken (Sektion) einen Apfel gibts (Value)
Delphi-Quellcode:
begin
  Ini.WriteString( 'HausLinks', 'Meier', 'Apfel' );
end;
und dann den Nachbarn Müller (Ident) im Haus zu deiner Rechten (Sektion) fragst, was du ihm gegeben hast
Delphi-Quellcode:
if Ini.ReadString( 'HausRechts', 'Müller', 'normal nix' ) = 'Apfelthen
  ShowMessage( 'Juhu, Apfel essen :-)' )
else
  ShowMessage( 'In die Röhre schauen :-(' );
erwartest du dann den Apfel (Value)?

Nö, du musst schon genau den fragen, dem du den Apfel gegeben hast
Delphi-Quellcode:
if Ini.ReadString( 'HausLinks', 'Meier', 'normal nix' ) = 'Apfelthen
  ShowMessage( 'Juhu, Apfel essen :-)' )
else
  ShowMessage( 'In die Röhre schauen :-(' );
Es ist auch immer hilfreich sich die Dokumentation durchzulesen (anschauen reicht nicht)
Delphi-Referenz durchsuchenTCustumIniFile.WriteString und Delphi-Referenz durchsuchenTCustomIniFile.ReadString
dann siehst du auch, wann bei ReadString der Default-Wert zurückgeliefert wird.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 19:11 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