Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi IniFile wird nicht erstellt (https://www.delphipraxis.net/126930-inifile-wird-nicht-erstellt.html)

implementation 5. Jan 2009 09:23


IniFile wird nicht erstellt
 
Mein Programm (bzw. die Initialization einer Unit) soll eine IniFile Config.ini anlegen und aus ihr den Wert der Farbe Workspace auslesen.
Doch es passiert nichts (nicht einmal die Datei wird erstellt).
Könnt ihr mir helfen?

Delphi-Quellcode:
unit Windesk.ConfigReadWrite;

interface

implementation

uses IniFiles, Windesk.Colors;

var INI : TIniFile; Vari: Variant;

initialization
  INI := TIniFile.Create('Config.ini');
  WorkSpace := INI.ReadInteger('Colors','Workspace',PaintGreen);
finalization
  INI.WriteInteger('Colors','Workspace',Workspace);
  INI.Free;
end.
Workspace ist eine Variable aus einer anderen Unit, PaintGreen eine Konstante.

DeddyH 5. Jan 2009 09:26

Re: Problem mit IniFile
 
Versuch es mal mit absoluten Pfaden.

implementation 5. Jan 2009 10:28

Re: Problem mit IniFile
 
Geht auch nicht besser.
Delphi-Quellcode:
unit Windesk.ConfigReadWrite;

interface

implementation

uses IniFiles, Windesk.Colors, SysUtils,Forms;

var INI : TIniFile; Vari: Variant;

initialization
  INI := TIniFile.Create(ExtractFileDir(Application.Exename)+'\Config.ini');
  Workspace := INI.ReadInteger('Colors','Workspace',PaintGreen);
finalization
  INI.WriteInteger('Colors','Workspace',Workspace);
  INI.Free;
end.

DeddyH 5. Jan 2009 10:33

Re: Problem mit IniFile
 
Und so?
Delphi-Quellcode:
INI := TIniFile.Create(IncludeTrailingPathDelimiter(ExtractFilePath(Application.Exename))+'Config.ini');
Wobei eine Speicherung im Programmverzeichnis grundsätzlich keine gute Idee ist. Spätestens ab Vista hast Du schlicht keine Berechtigung dazu.

Matze 5. Jan 2009 10:34

Re: Problem mit IniFile
 
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
INI := TIniFile.Create(IncludeTrailingPathDelimiter(ExtractFilePath(Application.Exename))+'Config.ini');

Delphi-Referenz durchsuchenExtractFilePath hängt bereits einen abschließenden Backslash an den Pfad. Der Aufruf von Delphi-Referenz durchsuchenIncludeTrailingPathDelimiter ist daher überflüssig.

Grüße

DeddyH 5. Jan 2009 10:37

Re: Problem mit IniFile
 
Zitat:

Zitat von Delphi 5-Hilfe
Der resultierende String enthält die Zeichen von FileName bis einschließlich des Doppelpunkts oder des umgekehrten Schrägstrichs, mit dem die Pfadinformationen vom Dateinamen und seinere Erweiterung abgetrennt wird.

Sicher ist sicher ;)

Matze 5. Jan 2009 10:38

Re: Problem mit IniFile
 
In der Uralt-Hilfe ok, aber in der neueren habe ich das nicht so schwammig formuliert in Erinnerung. ;)

Aber gut, der Aufruf schadet nicht, das ist richtig.

Edit: Ich kann mich natürlich auch irren, habe Delphi noch nicht installiert. *duck*

implementation 5. Jan 2009 10:42

Re: Problem mit IniFile
 
Geht immer noch nicht.
Delphi-Quellcode:
unit Windesk.ConfigReadWrite;

interface

implementation

uses IniFiles, Windesk.Colors, SysUtils,Forms;

var INI : TIniFile; Vari: Variant;

initialization
  INI := TIniFile.Create(ExtractFileDir(Application.Exename)+'Config.ini');
  Workspace := INI.ReadInteger('Colors','Workspace',PaintGreen);
finalization
  INI.WriteInteger('Colors','Workspace',Workspace);
  INI.Free;
end.

DeddyH 5. Jan 2009 10:45

Re: Problem mit IniFile
 
Bist Du mal durchgesteppt?

implementation 5. Jan 2009 10:47

Re: Problem mit IniFile
 
Nein
Hab ich noch nie gemacht
Ich versuchs mal

-------------------

das hat mich irgendwie nicht weiter gebracht

Matze 5. Jan 2009 10:48

Re: Problem mit IniFile
 
Angenommen du hast Schreibrechte. Stimmt denn der Pfad, wenn du ihn dir einmal ausgeben lässt?

Ich würde die Datei übrigens nur so lange öffnen wie du sie brauchst und Ressourcenschutzblöcke verwenden:

Delphi-Quellcode:
// auslesen:
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
try
  Workspace := Ini.ReadInteger('Colors', 'Workspace', PaintGreen);
finally
  FreeAndNil(Ini);
end;

// schreiben:
Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
try
  Workspace := Ini.WriteInteger('Colors', 'Workspace', Workspace);
finally
  FreeAndNil(Ini);
end;
Was wird denn ausgegeben, wenn du nach dem Ini-Versuch das hier ausgeben lässt:

Delphi-Quellcode:
ShowMessage(SysErrorMessage(GetLastError));
Grüße, Matze

implementation 5. Jan 2009 10:53

Re: Problem mit IniFile
 
Der Pfad stimmt.
Und es gibt auch keinen Fehler.

Matze 5. Jan 2009 10:55

Re: Problem mit IniFile
 
Hm, dann müsste aber eigentlich alles gehen, wenn nicht einmal Delphi-Referenz durchsuchenGetLastError einen Fehler zurückgibt.

Wird der Code sicher auch aufgerufen?
Sonst teste es doch mal im OnCreate, falls es das bei dir geben sollte.

Luckie 5. Jan 2009 10:58

Re: Problem mit IniFile
 
Zitat:

Zitat von implementation
Der Pfad stimmt.
Und es gibt auch keinen Fehler.

Das heißt, sie wird nicht angelegt? Damit deine Ini-Datei geschrieben wird, müssen zwei Dinge passieren: Erstens muss etwas hineingeschrieben werden und zweites muss sie geschlossen werden. Tust du beides? Desweiteren sollte natürlcih der Pfad stimmen und man sollte dort auch Schreibrechte haben. Was die Rechte angeht, was für ein Betriebssystem wird genutzt? Wenn du in das Programmverzeichnis unter C.\Programme schreibst, kann dir Vista den Pfad auch ungewollt umbiegen in einen Pfad in deinem Benutzerprofil.

SirThornberry 5. Jan 2009 11:56

Re: Problem mit IniFile
 
Könntest du bitte dem Beitrag einen aussagekräftigeren Titel geben? Bei IniFiles kann es recht viele Probleme geben. Ein aussagekräftigerer Titel hat den Vorteil das andere mit gleichem Problem diesen Beitrag später über die Suche schneller finden und somit auch die eventuelle Lösung. Zudem hat es für dich den Vorteil das anhand eines aussagekräftigen Titels die Leute sofort wissen ob sie eventuell helfen können und entsprechend das Thema anschauen :)

implementation 5. Jan 2009 12:35

Re: Problem mit IniFile
 
@Matze: Es wird jetzt eine Meldung ausgegeben, wenn der Code ausgeführt wird.
Und sie erscheint. Der Code wird also aufgerufen.

@Luckie: 1. Was meinst du mit schließen. Es wird FreeAndNil aufgerufen.
Ansonsten nichts.
2. Ich arbeite unter Windows XP, und das Programm ist unter D:

Luckie 5. Jan 2009 12:38

Re: Problem mit IniFile
 
Zitat:

Zitat von implementation
@Luckie: 1. Was meinst du mit schließen. Es wird FreeAndNil aufgerufen.
Ansonsten nichts.

Das meinte ich mit schliessen. Kannst du denn ein memo mit SaveToFile dort speichern?

implementation 5. Jan 2009 13:00

Re: IniFile wird nicht erstellt
 
Ja

Luckie 5. Jan 2009 13:14

Re: IniFile wird nicht erstellt
 
Dann sehe ich keinen Grund, warum das mit einer Ini-Datei nicht funktionieren sollte. Zeig noch mal deine aktuellen Code zum Schreiben und Lesen.

implementation 5. Jan 2009 13:19

Re: IniFile wird nicht erstellt
 
Delphi-Quellcode:
initialization
  Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
  ShowMessage(ExtractFilePath(Application.Exename) + 'Config.ini');
  try
    Workspace := Ini.ReadInteger('Colors', 'Workspace', PaintGreen);
  finally
    FreeAndNil(Ini);
  end;
finalization
  Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
  try
    Ini.WriteInteger('Colors', 'Workspace', Workspace);
  finally
    FreeAndNil(Ini);
  end;
end.

Luckie 5. Jan 2009 13:22

Re: IniFile wird nicht erstellt
 
Und es wird keine Datei erstellt? Und wenn du das in einem ButtonClick Ereignis ausführst?

implementation 5. Jan 2009 13:42

Re: IniFile wird nicht erstellt
 
Geht immer noch nicht.
Ich hab das OnClick-Event von TGraphicControl benutzt

Luckie 5. Jan 2009 13:59

Re: IniFile wird nicht erstellt
 
Delphi-Quellcode:
Ini.WriteInteger('Colors', 'Workspace', Workspace);
Überprüf mal im Debugger den Wert von Workspace.

taaktaak 5. Jan 2009 14:14

Re: IniFile wird nicht erstellt
 
Moin, Moin.
Da das Ganze so seltsam ist, habe ich es mal nachgestellt - das funktioniert bei mir einwandfrei!?

Luckie 5. Jan 2009 14:17

Re: IniFile wird nicht erstellt
 
Gib ihm mal deinen Code zum Testen. Dass der Wert von Workspace ungültig ist und deswegen nichts geschrieben wird, ist auch meine letzte Hoffnung.

taaktaak 5. Jan 2009 15:27

Re: IniFile wird nicht erstellt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry, hatte gerade keine Zeit.
Anbei das Testprogramm...

DeddyH 5. Jan 2009 15:30

Re: IniFile wird nicht erstellt
 
Haltepunkte hast Du schon probiert, d.h. die entsprechenden Stellen werden auch tatsächlich angesprungen?

nahpets 5. Jan 2009 15:52

Re: IniFile wird nicht erstellt
 
Hallo,

was wird denn hier ausgegeben?
Delphi-Quellcode:
 
  initialization
  Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
  ShowMessage(ExtractFilePath(Application.Exename) + 'Config.ini');
  try
    try
      Workspace := Ini.ReadInteger('Colors', 'Workspace', PaintGreen);
      ShowMessage('Workspace ist: ' + IntToStr(Workspace));
    except
      on e : Exception do begin
        ShowMessage('Es ist ein Fehler beim Lesen aufgetreten: ' + e.Message);
      end;
    end;
  finally
    FreeAndNil(Ini);
  end;
finalization
  Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
  try
    Try
      Ini.WriteInteger('Colors', 'Workspace', Workspace);
      ShowMessage('Workspace ist: ' + IntToStr(Workspace));
    except
      on e : Exception do begin
        ShowMessage('Es ist ein Fehler beim Schreiben aufgetreten: ' + e.Message);
      end;
    end;
  finally
    FreeAndNil(Ini);
  end;
end.

implementation 6. Jan 2009 08:50

Re: IniFile wird nicht erstellt
 
@Luckie: Der Wert von Workspace (Variable von TColor) soll dem Plan nach im ersten Teil gesetzt werden. Wenn das nicht funktioniert - dann müsste der Wert entweder 0 (Standardwert) oder PaintGreen (angegeben) sein.

@taaktaak: Bei dir funktioniert er? Bei mir nicht. Es scheint also nicht am Code zu liegen.

@DeddyH: Ja, es wird alles angesprungen.

@nahpets: Der sagt mir Workspace sei 0. In ReadInteger scheint also gar nichts zu passieren. Ansonsten wäre es ja zumindest der Wert von PaintGreen.
Eine Exception wird nicht ausgelöst.

Delphi-Quellcode:
var Workspace : TColor;      // in Unit Windesk.Colors
const PaintGreen = $00ddffdd;

nahpets 6. Jan 2009 09:03

Re: IniFile wird nicht erstellt
 
Hallo,
Zitat:

Zitat von implementation
@nahpets: Der sagt mir Workspace sei 0. In ReadInteger scheint also gar nichts zu passieren. Ansonsten wäre es ja zumindest der Wert von PaintGreen.
Eine Exception wird nicht ausgelöst.

Dann liegt die Vermutung nahe, dass die INI-Datei irgendwo erstellt wird/wurde, aber nicht an der vermuteten Stelle.
Weise dem ReadInteger mal einen festen Vorgabewert zu und schau dann, ob immernoch die 0 geliefert wird. Wenn ja, muss die aus irgendeiner INI gelesen werden, dann hilft Dir (vermutlich) nur, mal die Festplatte nach 'ner Config.ini zu durchsuchen.

Delphi-Quellcode:
initialization
  Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
  ShowMessage(ExtractFilePath(Application.Exename) + 'Config.ini');
  try
    try
      Workspace := Ini.ReadInteger('Colors', 'Workspace', 4711); // <- festen Vorgabewert zuweisen
      ShowMessage('Workspace ist: ' + IntToStr(Workspace)); // wenn 0, muss es irgendwo die INI-Datei geben!!!
      // und jetzt noch mal 'nen Test mit einem Wert, den es höchstwahrscheinlich nicht gibt:
      Workspace := Ini.ReadInteger('IstDochEgalWasHierSteht', 'HauptsacheGibtEsNicht', 4812);
      ShowMessage('Workspace ist: ' + IntToStr(Workspace)); // Hier sollte jetzt aber als Ergebnis 4812 kommen!!!
    except
      on e : Exception do begin
        ShowMessage('Es ist ein Fehler beim Lesen aufgetreten: ' + e.Message);
      end;
    end;
  finally
    FreeAndNil(Ini);
  end;
finalization
  Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
  try
    Try
      Ini.WriteInteger('Colors', 'Workspace', Workspace);
      ShowMessage('Workspace ist: ' + IntToStr(Workspace));
    except
      on e : Exception do begin
        ShowMessage('Es ist ein Fehler beim Schreiben aufgetreten: ' + e.Message);
      end;
    end;
  finally
    FreeAndNil(Ini);
  end;
end.

implementation 6. Jan 2009 10:43

Re: IniFile wird nicht erstellt
 
Wie erwartet kam beim ersten 0, beim zweiten 4812 raus.
Aber der Pfad stimmt.
Was ist dann das Problem?

nahpets 6. Jan 2009 11:09

Re: IniFile wird nicht erstellt
 
Hallo,
Zitat:

Zitat von implementation
Wie erwartet kam beim ersten 0, beim zweiten 4812 raus.
Aber der Pfad stimmt.
Was ist dann das Problem?

schau mal auf der gesamten Festplatte nach, ob es die Datei Config.ini nicht doch irgendwo gibt.

Wenn Du keine findest, dann ändere mal den Namen der INI-Datei auf c:\temp\meine.ini und schau nach, ob diese Datei dann erstellt bzw. gelesen wird.

implementation 6. Jan 2009 11:17

Re: IniFile wird nicht erstellt
 
Also ich weiß nicht warum, aber von einer Minute auf die andere funktioniert es.
Jetzt ist in dem Ordner auch eine Config.ini
Au0erdem ist in dem übergeordneten Ordner eine WindeskConfig.ini
Es siehtso aus, als fehle da nur der Backslash (Windesk\Config.ini)
In der WindeskConfig.ini steht der Wert von PaintGreen.
In der Config.ini steht 4812.
Ich bin verwirrt.

DeddyH 6. Jan 2009 11:18

Re: IniFile wird nicht erstellt
 
Zitat:

Zitat von implementation
Ich bin verwirrt.

Und ich erst :lol:

mkinzler 6. Jan 2009 11:23

Re: IniFile wird nicht erstellt
 
ExtractFilePath sollte eigentlich den Backslash liefern. Zur Sicherheit könnte man das überprüfen und ggf. den Backslash manuell einfügen

nahpets 6. Jan 2009 11:24

Re: IniFile wird nicht erstellt
 
Hallo,

das heißt, dass hier mal irgendwas schiefgegangen ist:

Delphi-Quellcode:
 Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + 'Config.ini');
Delphi-Quellcode:
 Ini := TIniFile.Create(ExtractFilePath(Application.Exename) + '\Config.ini');

fkerber 6. Jan 2009 11:30

Re: IniFile wird nicht erstellt
 
Hi!

Wäre es dann nicht besser IncludeTrailingPathDelimeter zu nutzen, anstatt einfach nen \ zu schreiben?


Ciao, Frederic

Uwe Raabe 6. Jan 2009 11:30

Re: IniFile wird nicht erstellt
 
Sagt dir "WinDesk" denn irgendetwas? Hast du vielleicht irgendwas gleichnamiges auf deinem Rechner laufen z.B. als Desktop-Widget oder so? Es scheint nämlich so zu sein, daß Application.ExeName nicht immer den gleichen Wert zurückliefert, wenn es im initialization oder finalization Teil aufgerufen wird.

Die Muhkuh 6. Jan 2009 11:32

Re: IniFile wird nicht erstellt
 
Zitat:

Zitat von fkerber
Hi!

Wäre es dann nicht besser IncludeTrailingPathDelimeter zu nutzen, anstatt einfach nen \ zu schreiben?


Ciao, Frederic

Jupp, ich bevorzuge auch diese Art hier:

Delphi-Quellcode:
Ini := TIniFile.Create(IncludeTrailingPathDelimiter(ExtractFilePath(Application.Exename)) + 'Config.ini');
Da das so lange ist, packt man es gleich in eine Funktion:

Delphi-Quellcode:
function ExePath: string
begin
  Result := IncludeTrailingPathDelimiter(ExtractFilePath(Application.Exename));
end;

// Aufruf

Ini := TIniFile.Create(ExePath + 'Config.ini');

nahpets 6. Jan 2009 11:33

Re: IniFile wird nicht erstellt
 
Zitat:

Zitat von fkerber
Hi!

Wäre es dann nicht besser IncludeTrailingPathDelimeter zu nutzen, anstatt einfach nen \ zu schreiben?


Ciao, Frederic

eigentlich ja, bin hier nur davon ausgegangen, dass der \ gefehlt hat (warum auch immer), hier könnten natürlich jetzt zwei \ stehen, was aber unter Windows unschädlich (wenn auch unelegant) ist.
Den IncludeTrailingPathDelimeter hatten wir ja schon oben im Thread und der hat das Problem auch nicht gelöst, irgendwie befremdlich.


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