![]() |
Inifile Problem
N'Abend alle zusammen,
ich hab nen Problem mit meiner Prozedure, ich will mit ihr die Werte und Schlüssel einer bestimmten Sektion auslesen, leider scheint das nicht so ganz zu funktionieren, da er bei der Ausgabe des Arrays nichts angibt und beim zählen der Strings "0" ausgibt... Ich hoffe echt ihr könnt mir helfen, sitz schon ne Weile an dem Problem und bin zu blöd den Fehler zu finden ^^'
Code:
MfG Maximum
unit ULoad2;
interface uses SysUtils,StdCtrls, ExtCtrls,FileCtrl, Classes, Graphics, Controls, Forms,IniFiles, Dialogs; type tladen= array[1..365] of Integer; tladend= array[1..365] of TDate; function GetApplicationDirectory: string; function loadfileb(n:string; i:TDate):tladen; var helpb:tladen; helpd:tladend; h: integer; implementation function GetApplicationDirectory: string; begin GetApplicationDirectory := ExtractFilePath(ParamStr(0)); end; function loadfileb(n:string; i:TDate):tladen; var Ini: TIniFile; dir, help, d,B,K,U:string; sl,helpf : TStringList; j,zaehler,l: integer; begin dir:=GetApplicationDirectory+n; sl:=TStringlist.Create; helpf:=TStringlist.Create; try Ini:=TIniFile.Create(dir+n+'.ini'); //Datei in Stringliste laden ini.ReadSectionValues('BMI', sl); j:= sl.Count; Ini.ReadSectionValues('BMI', helpf); h:=helpf.Count; finally Ini.Free; sl.Free; end; end; end. |
AW: Inifile Problem
Zitat:
Zitat:
Noch ein paar andere Dinge:
MfG Dalai |
AW: Inifile Problem
j und h werden auch nicht benutzt. Warum die Zuweisung, wenn du sie doch nicht benutzt?
Der Compiler sollte dir ein paar Warnungen um die Ohren hauen. |
AW: Inifile Problem
Vielen Dank für die schnellen Antworten und dafür das ihr euch die Zeit nehmt mir zu helfen :)
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Inifile Problem
Du füllst deine Arrays nirgends, deswegen sind diese leer. Du füllst nur 2 Stringlisten und diese müssten Inhalt haben, allerdings nur innerhalb der Funktion loadfileb, da diese Variablen dort lokal sind.
|
AW: Inifile Problem
Zitat:
Gruß K-H |
AW: Inifile Problem
Außerdem steht in j und h genau das Selbe drin.
Nur weil es sinnlos mit unterschiedlichen TStringList ausgelesen wurde, so bleibt der Wert gleich, da es die selbe Quelle ist. Auch die beiden anderen globalen Variablen kann man als falsch platziert betrachten, da sie ebenfalls nirgendwo benutzt werden. Und warum das Alles überhaupt böse globale Variablen sind ... darüber könnte man auch noch streiten. |
AW: Inifile Problem
Zitat:
Zitat:
Zitat:
MfG Dalai |
AW: Inifile Problem
Hallo allerseits^^
ich hab die Unit jetzt überarbeitet(die globalen Variablen sind jedoch noch vorhanden, möchte erstmal das alles funktioniert^^'), aktuelles Ergebnis sieht so aus, das er die Arrays mit Daten bestückt, die Länge ist nun wie erwünscht "365", jedoch sind alle Werte = 0 also default.
Delphi-Quellcode:
unit ULoad2;
interface uses SysUtils,StdCtrls, ExtCtrls,FileCtrl, Classes, Graphics, Controls, Forms,IniFiles, Dialogs; type tladen= array[1..365] of Integer; tladend= array[1..365] of TDate; function GetApplicationDirectory: string; procedure loadfileb(n:string); var helpb:tladen; helpd:tladend; j: integer; implementation function GetApplicationDirectory: string; begin GetApplicationDirectory := ExtractFilePath(ParamStr(0)); end; procedure loadfileb(n:string); var Ini: TIniFile; dir:string; sl: TStringList; l: integer; begin dir:=GetApplicationDirectory+n; sl:=TStringlist.Create; Ini:=TIniFile.Create(dir+'\'+n+'.ini'); //Datei in Stringliste laden try ini.ReadSectionValues('BMI', sl); for l := 0 to sl.Count-1 do helpd[l] := StrToDate(sl.Names[l]); for l := 0 to sl.Count-1 do helpb[l] := Integer(sl.Objects[l]); j:= Length(helpb); finally Ini.Free; sl.Free; end; end; end. Zitat:
|
AW: Inifile Problem
Zitat:
|
AW: Inifile Problem
Zitat:
Zum Problem, guck dir mal den Part an:
Delphi-Quellcode:
Du füllst in 2 Schleifen jeweils "helpd[l]:=". Damit überschreibst du beim 2x das, was du beim 1x reingeschrieben hast, ist das gewollt?
ini.ReadSectionValues('BMI', sl);
for l := 0 to sl.Count-1 do helpd[l] := StrToDate(sl.Names[l]); for l := 0 to sl.Count-1 do helpb[l] := Integer(sl.Objects[l]); Davon ab scheint mir das "helpb[l] := Integer(sl.Objects[l]);" auch falsch, denn was soll in den Objekten drin sein, eigentlich doch nix, daher vllt. die 0 überall drin. Du meintest wahrsch. sowas: helpb[l] := Integer(sl.values[helpb[l]]); |
AW: Inifile Problem
Zitat:
Zitat:
"helpd[l]:=" "helpb[l]:=" |
AW: Inifile Problem
Ich kann mir kaum vorstellen, dass in
Delphi-Quellcode:
irgendwas Sinnvolles drinsteht. Kann es sein, dass du
sl.Objects
Delphi-Quellcode:
suchst?
sl.Values
Und noch eine Sache:
Delphi-Quellcode:
liefert den Pfad inkl. abschließendem Pfadtrenner (bei Windows Backslash), d.h. du brauchst beim Zusammenbauen deines Dateinamens keinen Backslash einzufügen. Sinnvoller wäre die Verwendung der Funktion
ExtractFilePath
Delphi-Quellcode:
(bzw. IncludeTrailingBackslash bei Delphi 5 und älter).
IncludeTrailingPathDelimiter
MfG Dalai |
AW: Inifile Problem
Warum gibt GetApplicationDirectory den Path und nicht das Directory zurück?
Dir = ohne abschließendes \ Path = mit Und für aktuellere Delphis: ![]() |
AW: Inifile Problem
Zitat:
Davon ab steht aber der Rest meines Posts noch, dass wahrscheinlich sl.Values statt sl.Objects verwendet werden sollte. |
AW: Inifile Problem
Zitat:
Also ich sehe kein: p :-D:lol::spin2::coder2: |
AW: Inifile Problem
Zitat:
|
AW: Inifile Problem
p b d
ist doch egal, Hauptsache lesbar! Gruß K-H |
AW: Inifile Problem
Hallo Leute,
Erstmal ein großes Danke an alle die sich mit meinem Problem beschäftigen und versuchen mir zu helfen! Ich hab mir eure Antworten angekuckt und Vorschläge ausprobiert(Backslash bleibt vorerst, da ich wie schon gesagt erstmal erreichen will, dass es funktioniert). Folgendes kam dabei raus:
Delphi-Quellcode:
So nachdem ich nun test in einem Editfeld ausgebe bleibt dieses jedoch leer, verändert sich jedoch(Defaulttext:'Edit1'; nach Ausführung des Befehls:''; )
unit ULoad2;
interface uses SysUtils,StdCtrls, ExtCtrls,FileCtrl, Classes, Graphics, Controls, Forms,IniFiles, Dialogs; type tladenbmi= array[1..365] of String; tladendate= array[1..365] of TDate; function GetApplicationDirectory: string; procedure loadfileb(n:string); var helpbmi:tladenbmi; helpdate:tladendate; test: string; implementation function GetApplicationDirectory: string; begin GetApplicationDirectory := ExtractFilePath(ParamStr(0)); end; procedure loadfileb(n:string); var Ini: TIniFile; dir:string; sl : TStringList; l:integer; begin dir:=GetApplicationDirectory+n; sl:=TStringlist.Create; Ini:=TIniFile.Create(dir+'\'+n+'.ini'); //Datei in Stringliste laden try ini.ReadSectionValues('BMI', sl); for l := 0 to sl.Count-1 do begin helpdate[l]:=StrToDate(sl.Names[l]); helpbmi[l]:=sl.Values[DateToStr(helpdate[l])]; end; test:= helpbmi[1]; finally Ini.Free; sl.Free; end; end; end. Ich weiß schonwieder echt nicht weiter. Ist mir echt peinlich, wie blöd ich mich anstell... PS: Sorry das ich so unregelmäßig antworte, hab zur Zeit nicht viel Zeit. |
AW: Inifile Problem
Ich habe die Unit jetzt mal ein wenig umgeschrieben, auch wenn die Struktur der Daten immer noch nicht optimal ist ... aber das ist ja auch ein anderes Thema.
Delphi-Quellcode:
unit ULoad2;
interface uses SysUtils, Classes, IniFiles; type // ## INFO ## // // Zusammengehörende Informationen fassen wir auch zusammen // tladen = array [1 .. 365] of Integer; // tladend = array [1 .. 365] of TDate; TTagesWert = record Datum: TDate; Wert: Integer; end; TJahresWerte = array of TTagesWert; // ## INFO ## // // Statt irgendwelcher Magic Values, die überall im Code auftauchen // benutzen wir Konstanten const PATH_SEPARATOR = '\'; DATA_DIRECTORY_NAME = 'Data'; BMIFILE_EXTENSION = '.ini'; BMIFILE_BMI_SECTIONNAME = 'BMI'; function GetApplicationDirectory: string; // ## INFO ## // // DRY - **D**on't **R**epeat **Y**ourself // // Niemals an irgendwelchen Stellen den gleichen Code mit der gleichen Bedeutung // doppelt schreiben. Diese Teile werden ausgelagert und bekommen sprechende // Namen. function GetDataDirectory: string; function GetDataFileName( const AName: string ): string; // procedure loadfileb( n: string ); function LoadBmiFileData( const AName: string ): TJahresWerte; procedure SaveBmiFileData( const AName: string; AData: TJahresWerte ); // ## INFO ## // // Globale Variablen müssen nicht sein und sind mehr BÖSE als nützlich // var // helpb: tladen; // helpd: tladend; // j: Integer; implementation function GetApplicationDirectory: string; begin // ## INFO ## // // Wenn wir das Verzeichnis möchten, dann müssen wir uns auch das Verzeichnis // holen und nicht den Pfad // GetApplicationDirectory := ExtractFilePath( ParamStr( 0 ) ); GetApplicationDirectory := ExtractFileDir( ParamStr( 0 ) ); end; function GetDataDirectory: string; begin GetDataDirectory := GetApplicationDirectory + PATH_SEPARATOR + DATA_DIRECTORY_NAME; end; function GetDataFileName( const AName: string ): string; begin GetDataFileName := GetDataDirectory + PATH_SEPARATOR + AName + BMIFILE_EXTENSION; end; // procedure loadfileb( n: string ); // var // Ini: TIniFile; // dir: string; // sl: TStringList; // l: Integer; // begin // dir := GetApplicationDirectory + n; // sl := TStringList.Create; // Ini := TIniFile.Create( dir + '\' + n + '.ini' ); // Datei in Stringliste laden // try // Ini.ReadSectionValues( 'BMI', sl ); // for l := 0 to sl.Count - 1 do // helpd[l] := StrToDate( sl.Names[l] ); // for l := 0 to sl.Count - 1 do // helpb[l] := Integer( sl.Objects[l] ); // j := Length( helpb ); // finally // Ini.Free; // sl.Free; // end; // end; function LoadBmiFileData( const AName: string ): TJahresWerte; var LBmiFileName: string; LBmiFile: TIniFile; LSectionNames: TStringList; LIdx: Integer; begin LSectionNames := nil; LBmiFile := nil; try LBmiFileName := GetDataFileName( AName ); LBmiFile := TIniFile.Create( LBmiFileName ); LBmiFile.ReadSection( {Section} BMIFILE_BMI_SECTIONNAME, {Strings} LSectionNames ); SetLength( Result, LSectionNames.Count ); for LIdx := 0 to LSectionNames.Count - 1 do begin Result[LIdx].Datum := StrToDate( LSectionNames[LIdx] ); Result[LIdx].Wert := LBmiFile.ReadInteger( {Section} BMIFILE_BMI_SECTIONNAME, {Ident} LSectionNames[LIdx], {Default} 0 ); end; finally LSectionNames.Free; LBmiFile.Free; end; end; procedure SaveBmiFileData( const AName: string; AData: TJahresWerte ); var LBmiFileName: string; LBmiFile: TIniFile; LIdx: Integer; begin LBmiFile := nil; try LBmiFileName := GetDataFileName( AName ); LBmiFile := TIniFile.Create( LBmiFileName ); LBmiFile.EraseSection( BMIFILE_BMI_SECTIONNAME ); for LIdx := Low( AData ) to High( AData ) do begin LBmiFile.WriteInteger( {Section} BMIFILE_BMI_SECTIONNAME, {Ident} DateToStr( AData[LIdx].Datum ), {Value} AData[LIdx].Wert ); end; finally LBmiFile.Free; end; end; end. |
AW: Inifile Problem
Ich vermute nach wie vor hier den zumindest ersten Fehler, zumal der TE bisher nicht weiter darauf einging, abgesehen von der richtigen Änderung zu "-Dir" statt "-Path" in diesem Fall:
Delphi-Quellcode:
Mal in Prosa. GetApplicationDirectory() liefert vermutlich etwas dieser Art zurück:
dir:=GetApplicationDirectory+n;
Ini:=TIniFile.Create(dir+'\'+n+'.ini'); C:\Projekte\MeinProgramm Jetzt wird "n" dazu gepackt. Angenommen n = 'Hallo': C:\Projekte\MeinProgrammHallo Dann wird ein '\' und nochmals "n" sowie '.ini' drangehängt: C:\Projekte\MeinProgrammHallo\Hallo.ini SOLL DAS "HALLO" WIRKLICH AN DAS VERZEICHNIS GEPACKT WERDEN, TE!? Weil es wirkt auf mich so, als wäre das eine sehr seltsame Struktur. |
AW: Inifile Problem
@Medium
Du nimmst falsch an, denn in dem Quelltext vom TE steht
Delphi-Quellcode:
Also wird dort etwas in der Art zurückgeliefert
function GetApplicationDirectory: string;
begin GetApplicationDirectory := ExtractFilePath(ParamStr(0)); end;
Code:
Jetzt wird dort der Name angehängt
C:\Foo\Blup\App\
Delphi-Quellcode:
und wir erhalten
dir:=GetApplicationDirectory + n;
Ini:=TIniFile.Create( dir + '\' + n + '.ini' );
Code:
n => 'bmifoo'
dir => 'C:\Foo\Blup\App\bmifoo' inifile => 'C:\Foo\Blup\App\bmifoo\bmifoo.ini' |
AW: Inifile Problem
Zitat:
Zitat:
|
AW: Inifile Problem
Huaaaaaa, ich habe da doch echt ExtractFileDir() gelesen in seinem aktuellsten Schnipsel. Gut, dass gleich Wochenende ist. :stupid:
Nichtsdestotrotz bin ich nach wie vor skeptisch. Vor allem, weil TIniFile.Create() keine Exception auslöst, wenn man einen nicht existenten Pfad angibt. Vielleicht wäre es zum Testen vorläufig besser, wenn man den kompletten absoluten Pfad zu der INI als String am Stück im Code nimmt. Einfach um wirklich gaaaaanz sicher zu sein, dass da auch wirklich etwas gelesen werden kann. (Bisher haben wir ja nichtmal eine Bestätigung, dass die Schleifen überhaupt durchlaufen. Oder ob sl.Count beim Durchsteppen wirklich >0 ist. Ich glaube irgendwie noch nicht so recht, dass da überhaupt eine INI mit Inhalt geöffnet wird. |
AW: Inifile Problem
Zitat:
Schau dir mal an was für eine API verwendet wird ... die öffnet für jeden einzelnen Value-Zugriff die INI, liest sie neu ein, ändert den Wert und speichert alles. ![]() Wenn nichts im Contructor gemacht wird, außer sich den Dateinamen in einer Variable zu merken ... wo soll denn da ie Exception/Fehlerprüfung her kommen? :zwinker: ![]() |
AW: Inifile Problem
Es wäre halt so unglaublich simpel, dies als Fehlerquelle ein für alle Male auszuschließen. Keine Minute Arbeit. Ich habe daher keine Lust mehr darüber zu streiten. Wenn der TE Bock hat, macht er's, wenn nicht dann nicht. Mir langsam pupsegal.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 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 by Thomas Breitkreuz