![]() |
Delphi-Version: 5
Ini Datei wird nicht erstellt...
Hallo,
versuche gerade probeweise eine Ini - Datei zu erstellen, aber die Datei wird nicht erstellt, sie ist nirgends zu finden:
Delphi-Quellcode:
Ist da noch ein Fehler drin, den ich nicht sehe?
uses
,... IniFiles; //... public { Public-Deklarationen } procedure erzeugeIni(IniName:string); end; .... procedure TForm1.erzeugeIni(IniName:string); var ini:TIniFile; begin ini := TIniFile.Create(IniName); // INI-Datei erstellen (falls nicht vorhanden) und initialisieren try ini.WriteString('Sektion1', 'Eigenschaft1', 'Dein String'); // String in Sektion1 unter Eigenschaft1 abspeichern ini.WriteInteger('Sektion2', 'Eigenschaft1', 1234); // Integerwert in Sektion2 unter Eigenschaft1 abspeichern ini.WriteBool('Sektion2', 'Eigenschaft2', True); // Wert vom Typ Boolean abspeichern finally ini.Free; // Variable ini wieder freigeben end; end; ..... procedure TForm1.Button1Click(Sender: TObject); begin erzeugeIni('MyKredinif'); end; |
AW: Ini Datei wird nicht erstellt...
Keine relativen Pfadangabe verwenden, Du weißt nie mit Sicherheit, was aktuell das Arbeitsverzeichnis ist.
|
AW: Ini Datei wird nicht erstellt...
Zitat:
aber auch über die Suchen Funktion läßt sich nirgends auf der Festplatte die Ini finden. |
AW: Ini Datei wird nicht erstellt...
Wonach hast Du denn gesucht? Eine "MyKredinif" ohne Endung müsste sich eigentlich finden lassen.
|
AW: Ini Datei wird nicht erstellt...
![]() Wobei INIs nicht "nur" im Arbeitsverzeichnis landen, wenn man keine Pfad angibt ... siehe Remarks |
AW: Ini Datei wird nicht erstellt...
Zitat:
Delphi-Quellcode:
procedure TForm1.erzeugeIni(IniName:string);
var ini:TIniFile; begin ini := TIniFile.Create(IniName+'.ini'); //<- geändert // INI-Datei erstellen (falls nicht vorhanden) und initialisieren try |
AW: Ini Datei wird nicht erstellt...
Dann gib doch einen absoluten Pfad an.
|
AW: Ini Datei wird nicht erstellt...
Zitat:
Delphi-Quellcode:
Ich glaube ich bin heut völlig daneben
procedure TForm1.erzeugeIni(IniName:string);
var ini:TIniFile; begin ini := TIniFile.Create(extractfilepath(paramstr(0))+IniName+'.ini'); //<- geändert // INI-Datei erstellen (falls nicht vorhanden) und initialisieren try |
AW: Ini Datei wird nicht erstellt...
Ok:
Delphi-Quellcode:
damit geht es, danke euch.:oops:
ini := TIniFile.Create(extractfilepath(paramstr(0))+IniName+'.ini');
|
AW: Ini Datei wird nicht erstellt...
@Codix32
Früher landeten Inis ohne Pfadangabe im Windows-Verzeichnis. Der ist aber heute schreibgeschützt, womit es eigentlich eine Fehlermeldung geben müsste (vorausgesetzt das ich nicht abgeschaltet). Gibt es keine Meldung, sollte irgendwo eine Datei erstellt worden sein. |
AW: Ini Datei wird nicht erstellt...
Zitat:
|
AW: Ini Datei wird nicht erstellt...
Zitat:
|
AW: Ini Datei wird nicht erstellt...
Eine Umleitung für "schrottige" Programme, welche vom UAC (glaub ich) eingerichtet wird, wenn es erkennt/denkt, daß das Programm schrott inkompatibel ist.
Such mal nach dem Verzeichis irgendwo in den Benutzer-Verzeichnissen. [edit] ![]() ![]() |
AW: Ini Datei wird nicht erstellt...
Zitat:
C:\Users\baumina\AppData\Local\VirtualStore\Progra m Files\Embarcadero\RAD Studio\8.0 |
AW: Ini Datei wird nicht erstellt...
Ok, aber jetzt habe ich schon wieder ein Problem mit dem Lesen der IniFile:
Delphi-Quellcode:
Die Labels zeigen nichts an, obwohl die Mykreditinif.ini korrekt erstellt im aktuellen Verzeichnis liegt. Hiiiiilfe
procedure TForm1.leseIni(IniName:string);
var ini:TIniFile; filename: String; begin filename := extractfilepath(paramstr(0))+IniName + '.ini'; Label5.Caption:=filename; //zeigt den Pfad und Dateinamen einwandfrei an ini := TIniFile.Create(filename); // INI-Datei erstellen (falls nicht vorhanden) und initialisieren try Form1.Caption:=ini.ReadString('Sektion1', 'Name', Name); //globale Variablen Gesamtkreditsum:=ini.ReadString('Sektion2', 'Gesamtkreditsumme',Gesamtkreditsum); Ratenhöhe:=ini.ReadString('Sektion2', 'Ratenhoehe', Ratenhöhe); Ratenanzhl:=ini.ReadString('Sektion2', 'Ratenanzahl', Ratenanzhl); Restsum:=ini.ReadString('Sektion3', 'Restsumme', Restsum); Sonderrat:=ini.ReadString('Sektion3', 'Sonderrate', Sonderrat); // finally ini.Free; // Variable ini wieder freigeben end; end; ....... procedure TForm1.Button2Click(Sender: TObject); begin leseIni('MyKreditInif'); Gesamtkreditsumme.Caption:= 'Gesamtkreditsumme '+ gesamtkreditsum; Ratenhoehe.Caption:='Ratenhoehe '+ Ratenhöhe; Ratenanzahl.Caption:='Ratenanzahl '+Ratenanzhl; Restsumme.Caption:='Restsumme '+Restsum; Sonderrate.Caption:='Sonderrate '+Sonderrat; end; |
AW: Ini Datei wird nicht erstellt...
Zitat:
Gruß K-H P.S. Du mußt nicht so laut um Hilfe rufen. |
AW: Ini Datei wird nicht erstellt...
Warum wird die INI nicht im richtigen Pfad angelegt?
In dem auch schreib und generelle Zugriffsrechte vorhanden sind? Das ist sicherlich nicht Paramstr(0). Siehe CSIDL_APPDATA Zitat:
gruss |
AW: Ini Datei wird nicht erstellt...
Die Ini Datei liegt im selben Ordner wie die dpr, pas, ectra.
[QUOTE]Ja, die Inifile ist vorhanden die Werte sind korrekt drin, die Variablen enthalten nichts, es wird also nichts eingelesen. Sie enthält die mit WriteInteger geschriebenen Werte: Zitat:
|
AW: Ini Datei wird nicht erstellt...
Zitat:
Das hier geht:
Delphi-Quellcode:
Die Ini Datei wird angelegt, mit den Werten, aber das Auslesen geht nicht:
procedure TForm1.erzeugeIni(IniName:string);
var ini:TIniFile; begin ini := TIniFile.Create(extractfilepath(paramstr(0))+IniName + '.ini'); // INI-Datei erstellen (falls nicht vorhanden) und initialisieren try ini.WriteString('Sektion1', 'Name', form2.Edit1.text); // String in Sektion1 unter Eigenschaft1 abspeichern ini.WriteString('Sektion2', 'Gesamtkreditsumme', Gesamtkreditsum); ini.WriteString('Sektion2', 'Ratenhoehe', Ratenhöhe); ini.WriteString('Sektion2', 'Ratenanzahl', Ratenanzhl); ini.WriteString('Sektion3', 'Restsumme', Restsum); ini.WriteString('Sektion3', 'Sonderrate', Sonderrat); finally ini.Free; // Variable ini wieder freigeben end; end;
Delphi-Quellcode:
und was nun bedeutet 'CSIDL_APPDATA'
procedure TForm1.leseIni(IniName:string);
var ini:TIniFile; filename: String; begin filename := extractfilepath(paramstr(0))+IniName + '.ini'; Label5.Caption:=filename; ini := TIniFile.Create(filename); // INI-Datei erstellen (falls nicht vorhanden) und initialisieren try Form1.Caption:=ini.ReadString('Sektion1', 'Name',''); Gesamtkreditsum:=ini.ReadString('Sektion2', 'Gesamtkreditsumme',''); Ratenhöhe:=ini.ReadString('Sektion2', 'Ratenhoehe', ''); Ratenanzhl:=ini.ReadString('Sektion2', 'Ratenanzahl', ''); Restsum:=ini.ReadString('Sektion3', 'Restsumme', ''); Sonderrat:=ini.ReadString('Sektion3', 'Sonderrate',''); // finally ini.Free; // Variable ini wieder freigeben end; end; |
AW: Ini Datei wird nicht erstellt...
UAC eingeschaltet?
Mach mal aus und teste noch mal dann verstehst du vielleicht was ich meine ;) gruss |
AW: Ini Datei wird nicht erstellt...
Zitat:
|
AW: Ini Datei wird nicht erstellt...
Zitat:
|
AW: Ini Datei wird nicht erstellt...
Zitat:
Na Ok.. ![]() Dateien mit schreib und lese zugriffe sollten in einem Ordner abgelegt werden Wo die Zugriffsrechte auch vorhanden sind. Zitat:
gruss |
AW: Ini Datei wird nicht erstellt...
Hier habe ich zu den Schreibrechten auf den eigenen Ordner mal einen kleinen Artikel geschrieben:
![]() |
AW: Ini Datei wird nicht erstellt...
Zitat:
die UAC habe ich ganz runtergefahren. Da gibt's nichts zu bestätigen. Dann:
Delphi-Quellcode:
Da wird dann der komplette Pfad angezeigt:
filename := extractfilepath(paramstr(0))+IniName + '.ini';
Label5.Caption:= filename; c:\users\XXXX\Dokuments\Borland Studio-Projekte\My_proggis\Raten-mit-IniFile\MyKreditInif.ini Die Funktion 'GetSpecialFolder' habe ich mal so getestet:
Delphi-Quellcode:
Da kriege ich den Pfad: C:\users\XXXX\Favorites
MessageDlg (GetSpecialFolder (CSIDL_APPDATA), mtInformation, [mbOK], 0);
Und in der LeseIni:
Delphi-Quellcode:
kriege ich den Pfad: C:\Users\XXXX\AppData\Roaming\MyKreditInif.ini
procedure TForm1.leseIni(IniName:string);
var ini:TIniFile; filename: String; begin filename:=GetSpecialFolder(CSIDL_APPDATA)+'\'+Ininame+ '.ini'; Label5.Caption:=filename; ini := TIniFile.Create(filename); ... Aber die Variablen bleiben leer, es wird nichts eingelesen. Also was mache ich da noch falsch? |
AW: Ini Datei wird nicht erstellt...
Ist zwar schon uralt und ich nutze inzwischen neuere Versionen, aber hier meine alten
![]() |
AW: Ini Datei wird nicht erstellt...
Weil du (angeblich) nach Favorites schreibst und von Data\Roaming\ liest?
Verwende eventl. $001A (= CSIDL_APPDATA) satt der unterschiedlichen CSIDL Konstanten? BTW, es gibt auch TIniFile.ReadFloat und in der SysUtils StrToFloat, StrToFloatDef, TryStrToFloat ect. |
AW: Ini Datei wird nicht erstellt...
Zitat:
Zitat:
Ist der Übergebene Dateiname bei erzeugeIni(IniName:string); und leseIni(IniName:string); identisch (Tipfehler?) Wenn das Programm später mal unter C:\Programme... installiert werden soll, musst du natürlich unbedingt den Speicherort der Ini nach CSIDL_APPDATA legen. |
AW: Ini Datei wird nicht erstellt...
Zitat:
Nur das war niemanden vorher bekannt. Zitat:
Aber sorry wenn man es macht dann direkt richtig von Anfang an. Denn er wird mit Sicherheit seine Programme nicht immer im "Borland Studio-Projekte" Pfad ablegen. Dein Ratschlag ist also nicht zu empfehlen! gruss |
AW: Ini Datei wird nicht erstellt...
Das Problem ist mit drei kleinen Änderungen für immer lösbar:
Delphi-Quellcode:
Delphi bietet für Ini auf Registry Umsteiger eine einfache Lösung. Einzig die Unit und Klasse wechseln, der Rest kann bleiben. Das Ergebnis landet in der Registry unter HKCU\Software\MyKredinif\...
uses
Registry; //<<<<<< IniFiles gegen Registry tauschen procedure TForm1.erzeugeIni(IniName:string); var ini: TRegIniFile; //<<<<<< TIniFile gegen TRegIniFile tauschen begin ini := TRegIniFile.Create('Software\' + IniName); //<<<<<< TIniFile gegen TRegIniFile tauschen // INI-Datei erstellen (falls nicht vorhanden) und initialisieren try ini.WriteString('Sektion1', 'Eigenschaft1', 'Dein String'); // String in Sektion1 unter Eigenschaft1 abspeichern ini.WriteInteger('Sektion2', 'Eigenschaft1', 1234); // Integerwert in Sektion2 unter Eigenschaft1 abspeichern ini.WriteBool('Sektion2', 'Eigenschaft2', True); // Wert vom Typ Boolean abspeichern finally ini.Free; // Variable ini wieder freigeben end; end; procedure TForm1.Button1Click(Sender: TObject); begin erzeugeIni('MyKredinif'); end; |
AW: Ini Datei wird nicht erstellt...
Zitat:
Man hat doch deutlich gesehen, dass der TE Probleme hat, eine Ini zu schreiben und wieder daraus zu lesen. Dann kam der Hinweis auf auf CSIDL_APPDATA und UAC und er hat sich in den Verzeichnissen verzettelt mit Favorites und Data\Roaming, obwohl die Schreibrechte ja nicht das Problem sind. Deshalb jetzt mein Vorschlag, erstmal das Lesen/ Schreiben der ini in den Griff zu bekommen und dann die funktionierende Ini nach CSIDL_APPDATA zu verschieben. Ein Schritt nach dem anderen. Ich löse ungern zwei Probleme gleichzeitig. Das die Ini letztendlich nicht ins Programmverzeichnis gehört, ist unstrittig, das habe ich ja auch geschrieben. |
AW: Ini Datei wird nicht erstellt...
Und TRegIniFile kann auch nicht der Königsweg sein: zum Einen hatten wir vor Jahren mal einen Thread, der sich mit dieser Klasse auseinandersetzte und zu keinem wirklich positiven Ergebnis kam und zum Anderen hat man bei mobilen Anwendungen (die man z.B. auf dem USB-Stick mitnimmt) das Problem, dass man auf einem Rechner die Registry beschreibt und auf einem anderen die gespeicherten Einstellungen nicht zur Verfügung hat.
|
AW: Ini Datei wird nicht erstellt...
Ich nutze die TRegIniFile schon seit Jahren, in zig Programmen um meine Einstellungen zu speichern, ohne je ein Problem damit gehabt zu haben.
Natürlich ist die Registry mit der TRegIniFile nur eingeschränkt nutzbar, bzw. nur der HKCU Teil. Auch ist die TRegIniFile der einfache Weg schnell von der Ini-Datei auf Reg zu wechseln. Das ist eben der Vorteil der TRegIniFile. Will man mehr, muss man die TRegistry nehmen. Sie ist mächtiger, dafür aber auch komplexer. Will man es einfach wie mit der Ini haben, reicht die TRegIniFile. |
AW: Ini Datei wird nicht erstellt...
Zitat:
a) die Programmdaten sind benutzerspezifisch (Benutzer\xxxx\AppData) b) die Programmdaten sid rechnerspezifisch (Benutzer\default\Appdata) c) die Programmdaten sind unabhängig (Netzlaufwerk) d) Programm(daten)Verzeichnis auf einem Stick (Wobei je nach Konfiguration die Verzeichnisnamen abweichen können.) Irgendetwas klemmt immer, da gibt es keinen Königsweg, es sei denn, Du bastelst Dir etwas eigenes z.B. c:\MeinProgramm\benutzer1\Meine.INI Da könnte es allerdings Ärger mit dem Admin geben. Gruß K-H |
AW: Ini Datei wird nicht erstellt...
Für a) und b) gibt es ja vorgesehene Verzeichnisse (CSIDL_APPDATA bzw. CSIDL_COMMON_APPDATA). Und man kann ja auch eine Option anbieten, ob "normal" installiert oder mobil genutzt werden soll, was sich dann auf den Speicherort auswirkt. c) dürfte eher nicht dem Regelfall entsprechen und dann hat man ja ggf. noch eine Datenbank, wo man auch Einstellungen hinterlegen könnte. Mir ging es auch mehr um die Behauptung, dass ein Wechsel von TIniFile zu TRegIniFile alle Probleme der Welt lösen soll.
|
AW: Ini Datei wird nicht erstellt...
Die Probleme der Welt sicherlich nicht, aber die Probleme aus dem Beitrag #1.
Wie gesagt, wenn es nur drum geht Einstellungen zu speichern, dann mache ich mir keinen Stress mit der TRegistry. Sorry, aber wenn ich mir manchmal hier Beispiele angucke und wie einige hier, nur um in der HKCU etwas zu speichern mit OpenKey und CloseKey usw. hantieren, dann frage ich mich wozu? Ich meine, wenn ich ein String brauche, kann ich einen String nehmen. Ich kann mir aber auch eine Klasse dafür erstellen. Komplizierter geht immer. Und das Andere? Ich hab meinen Königsweg gefunden. Solange es nur um Einstellungen geht, geht alles bei mir über eine von drei Units. Je nachdem welche ich nehme, landen die Daten da wo ich will. |
AW: Ini Datei wird nicht erstellt...
Zitat:
|
AW: Ini Datei wird nicht erstellt...
Vielleicht sollte man sich auch mal um die TForm1.leseIni kümmern, die kann ja wohl kaum so bleiben?
Schlage folgendes vor:
Delphi-Quellcode:
TKreditRahmen = record
private FKreditSummme: double; FRatenAnzahl: double; FRatenAnzahlung: double; FRestSummme: double; FSonderRate: double; public property KreditSummme: double read FKreditSummme write FKreditSummme; property RatenAnzahl: double read FRatenAnzahl write FRatenAnzahl; property RatenAnzahlung: double read FRatenAnzahlung write FRatenAnzahlung; property RestSummme: double read FRestSummme write FRestSummme; property SonderRate: double read FSonderRate write FSonderRate; procedure LoadFromIniFile(const FileName, Section: string); procedure SaveToIniFile(const FileName, Section: string); procedure Clear; end; |
AW: Ini Datei wird nicht erstellt...
Zitat:
![]() Die sind allerdings mittlerweile veraltet, mit heutigen Delphiversionen ließe sich das viel schöner umsetzen. Ich werde aber kaum in absehbarer Zeit daran etwas ändern können. Die Idee dahinter passt aber nach wie vor: Einfach an allen Stellen suchen, aber dem Benutzer die Wahl lassen, wenn er das möchte. |
AW: Ini Datei wird nicht erstellt...
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 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