![]() |
Re: Exception beim Createn eines IniFiles
Also irgendwie ist dein Code grotesk, nicht?
Delphi-Quellcode:
Wenn ich das richtig verstehe, listest du alle Files, lädst diese in einen dyn. Array und dann gehst du diesen Array ab und suchst nach Sprachdatei "Deutsch.ini", diese lädst du dann in UsedLanguageFile und den Rest gibst du frei.
procedure TBasicControl.OpenFile(LanguageName: string);
var SR: TSearchRec; x: integer; begin x := 0; if FindFirst(ExtractFilePath(ParamStr(0)) + 'Language\*.ini', faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin x := x + 1; SetLength(LanguageFiles, x + 1); LanguageFiles[x] := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Language\' + sr.Name); end; until FindNext(SR) <> 0; FindClose(SR); end; x := 0; for x := 1 to high(LanguageFiles) do begin if ExtractFileName(LanguageFiles[x].FileName) = LanguageName + '.ini' then begin UsedLanguageFile := LanguageFiles[x]; UsedLanguageFilePath := UsedLanguageFile.FileName; end; LanguageFiles[x].Free; end; end; (Was übrigens trotzdem fehlt, ist, dass du den LanguageFiles-Array wieder auf Größe 0 herunterfährst.) Aber wieso lädst du nicht sofort die Datei LanguageName + '.ini' in dein UsedLanguageFile? Wieso der Umstand mit der Auflistung der Sprachen?
Delphi-Quellcode:
Ich hoffe, dass ich deinen Code nicht verplant habe.
function TBasicControl.OpenFile(LanguageName: string): boolean;
begin if FileExists(ExtractFilePath(ParamStr(0)) + 'Language\' + LanguageName + '.ini') then begin UsedLanguageFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Language\' + LanguageName + '.ini'); UsedLanguageFilePath := UsedLanguageFile.FileName; result := true; end else begin showmessage('Language file "'+LanguageName + '.ini" not found!'); result := false; // Programm soll in diesem Fall beendet werden! end; end; Gruß blackdrake |
Re: Exception beim Createn eines IniFiles
Okay danke, das ist mir echt eine Hilfe :-)
Ich habe meinen Quelltext über die Nacht und gerade noch einmal überarbeitet und etwas neu strukturiert.
Delphi-Quellcode:
Aufgerufen wird das so (in einer anderen Unit):
unit mFNAGBase;
interface uses IniFiles, SysUtils, Classes, Dialogs; type TFNAGBasicControl = class(TObject) private {} public UsedLanguageFilePath: String; //Damit das File problemlos wieder geöffnet werden kann LanguageFiles: Array of TIniFile; //Ist jetzt in TFNAGBasicControl procedure ReadAllIn; procedure OpenFile(LanguageName: string); procedure FreeUsed; procedure FreeUnused; function ReadEntry(Entry:string):string; end; var FNAGBasicControl: TFNAGBas #icControl; implementation procedure TFNAGBasicControl.ReadAllIn; var SR: TSearchRec; x: integer; begin x := 0; if FindFirst(ExtractFilePath(ParamStr(0)) + 'Language\*.ini', faAnyFile, SR) = 0 then begin repeat if (SR.Attr <> faDirectory) then begin inc(x); SetLength(FNAGBasicControl.LanguageFiles, x + 1); //An dieser Stelle gibt es merkwürdiger weise eine AccessViolation mit Abbruch FNAGBasicControl.LanguageFiles[x] := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Language\' + sr.Name); end; until FindNext(SR) <> 0; FindClose(SR); end; end; procedure TFNAGBasicControl.OpenFile(LanguageName: string); var x: integer; begin x := 0; for x := 1 to high(FNAGBasicControl.LanguageFiles) do begin if ExtractFileName(FNAGBasicControl.LanguageFiles[x].FileName) = LanguageName + '.ini' then begin FNAGBasicControl.LanguageFiles[0] := LanguageFiles[x]; FNAGBasicControl.UsedLanguageFilePath := FNAGBasicControl.LanguageFiles[0].FileName; end; end; end; procedure TFNAGBasicControl.FreeUsed; begin FNAGBasicControl.LanguageFiles[0].Free; end; procedure TFNAGBasicControl.FreeUnused; var x: integer; begin x := 0; for x := 1 to high(FNAGBasicControl.LanguageFiles) do FNAGBasicControl.LanguageFiles[x].Free; SetLength(FNAGBasicControl.LanguageFiles, 1); end; function TFNAGBasicControl.ReadEntry(Entry:string):String; begin If FNAGBasicControl.LanguageFiles[0] <> nil then Result := FNAGBasicControl.LanguageFiles[0].ReadString('words', Entry, 'missing') // hier gab es bisher immer eine Accessviolation Else if FNAGBasicControl.LanguageFiles[0] = nil then ShowMessage('No Languagefile opened.'); end; end.
Delphi-Quellcode:
Ich hoffe das ist jetzt alles ein wenig performanter und logischer gedacht. Habe UsedLanguageFile unter LanguageFiles[0] eingefügt und sie alle statt Global als Teil der BasiCControl eingefügt.
procedure TfTest.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin FNAGBasicControl.ReadAllIn; //hier könnte dann die Liste der Files benutzt werden, z.B. in eine Liste zum auswählen FNAGBasicControl.OpenFile('test'); fTest.Caption := FNAGBasicControl.ReadEntry('fTestCaption'); //diese funktion hat bisher ja die exception ausgelöst FNAGBasicControl.FreeUnused; //hier nach wäre dann noch eine weitere interaktion mit der used möglich FNAGBasicControl.FreeUsed; end; Außerdem habe ich wieder ReadAllIn von OpenFile und einzelner Free-Prozeduren getrennt, damit man zwischendurch besser damit interagieren kann. Aber wieso kommt denn plötzlich eine neue Exception? Ich habe ja eigentlich nichts verändert... Die OpenFile function werde ich später auch noch nach deinem Vorschlag verbessern. Nur möchte ich zuerst, dass ich mal keine Exception kriege bevor ich eine neue Baustelle aufmache ;-) Danke für die Hilfe! mfg fortuneNext |
Re: Exception beim Createn eines IniFiles
was machst denn hier:
Delphi-Quellcode:
dachte
repeat
if (SR.Attr <> faDirectory) then begin inc(x); SetLength(FNAGBasicControl.LanguageFiles, x + 1); //An dieser S
Delphi-Quellcode:
ist bei dir ein objekt und kein array...
type
TFNAGBasicControl = class(TObject) das kansnt du so nicht initialisieren oder gar die grösse verändern... |
Re: Exception beim Createn eines IniFiles
FNAGBasicControl.LanguageFiles ist aber doch ein Array? :-/
Siehe auch hier:
Delphi-Quellcode:
Oder seh ich das falsch?
TFNAGBasicControl = class(TObject)
private {} public UsedLanguageFilePath: String; LanguageFiles: Array of TIniFile; //HIER procedure ReadAllIn; procedure OpenFile(LanguageName: string); procedure FreeUsed; procedure FreeUnused; function ReadEntry(Entry:string):string; end; |
Re: Exception beim Createn eines IniFiles
so, hier mal 'n bischen code
Delphi-Quellcode:
der sollte eigentlich deinen bisherigen code abdecken...
PROGRAM Project1;
{$APPTYPE CONSOLE} USES SysUtils, Classes, inifiles; TYPE TFiles = CLASS(TStringList) strict private fDirName: string; public PROCEDURE LoadFiles; PROCEDURE LoadIni(aIdx: integer); END; { TFiles } PROCEDURE TFiles.LoadFiles; VAR sr: tsearchRec; BEGIN fDirName := ExtractName(ParamStr(0)); Clear; IF FindFirst(fDirName + '*.ini', faAnyFile, sr) = 0 THEN BEGIN REPEAT Add(sr.Name); UNTIL FindNext(sr) <> 0; FindClose(sr); END; END; PROCEDURE TFiles.LoadIni(aIdx: integer); VAR aIni: tinifile; BEGIN IF aIdx <= Count THEN BEGIN aIni := TIniFile.Create(fDirName + Strings[aIdx]); TRY Clear; //hier die daten laden FINALLY aIni.Free; END; END; END; VAR fTFiles: TFiles; BEGIN fTFiles := TFiles.Create; TRY fTFiles.loadFiles; //hier selktieren und laden fTFiles.LoadIni(fTFiles.IndexOf('test') {aIndex}); FINALLY fTFiles.Free; END; readln; END. mit loadfiles lädst du die liste der *.inis in deine klasse, über indexof wählst du die datei aus und in loadini, lädst du dann deine daten aus der ini... jetzt brauchst du dann nur noch auf die einzelnen einträge zugreifen, und schon hast du alle deine daten... <HTH> GG |
Re: Exception beim Createn eines IniFiles
ersetz das mal ...
Delphi-Quellcode:
gegen das...
inc(x);
SetLength(FNAGBasicControl.LanguageFiles, x + 1); //An dieser Stelle gibt es merkwürdiger weise eine AccessViolation mit Abbruch
Delphi-Quellcode:
du greifst hier auf eine instanz zu, welche ausserhalb deines zugriffsbereiches ist...
inc(x);
SetLength(LanguageFiles, x + 1); //An dieser Stelle gibt es merkwürdiger weise eine AccessViolation mit Abbruch |
Re: Exception beim Createn eines IniFiles
Hi,
danke für den längeren Code :-) Ich werd ihn zwar nicht komplett kopieren (schon weil es eine Konsolenanwendung ist), aber einige Ideen und Prinzipien werden sicher in mein Projekt mit einfließen :-] Das Weglassen von FNAGControlUnit. hilft übrigens leider nicht. Wieso sollte das denn außerhalb meines Zugriffsbereichs liegen? Klappt bei den ganzen anderen procedures doch auch? |
Re: Exception beim Createn eines IniFiles
Delphi-Quellcode:
Hast du FNAGBasicControl mit
procedure TfTest.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin FNAGBasicControl.ReadAllIn; //hier könnte dann die Liste der Files benutzt werden, z.B. in eine Liste zum auswählen FNAGBasicControl.OpenFile('test'); fTest.Caption := FNAGBasicControl.ReadEntry('fTestCaption'); //diese funktion hat bisher ja die exception ausgelöst FNAGBasicControl.FreeUnused; //hier nach wäre dann noch eine weitere interaktion mit der used möglich FNAGBasicControl.FreeUsed; end;
Delphi-Quellcode:
initialisiert?
FNAGBasicControl := TFNAGBasicControl.Create();
Und wieso listest du weiterhin alle Language-Files auf anstelle direkt eine zu laden? Hat das einen bestimmten Grund? Gruß blackdrake |
Re: Exception beim Createn eines IniFiles
Jau das hat einen Grund:
Zitat:
Und das Create... naja. Allerdings wenn ich das einfüge, bekomme ich plötzlich einen Fehler an der Stelle
Delphi-Quellcode:
FNAGBasicControl.LanguageFiles[0].Free;
> Wenn ich es in Delphi teste, eine normale AccessViolation. > Wenn ich mit F7 die Zeilen durchgehe, öffnet sich an der Stelle das CPU-Thread-Debugger Fenster. > Wenn ich die .exe starte, "Problembericht senden" bla bla. :-O Darf Eintrag 0 irgendwie nie geleert werden? mfg |
Re: Exception beim Createn eines IniFiles
Zitat:
Wenn du dann aber an irgend einer Stelle im Programm auf Element 0 zugreifst (z.B. weil du etwas mit der "TIniFile" machen willst), kommt es zur AV, da das TIniFile ja bereits freigegeben ist. Bitte kontrolliere deinen Code sehr genau: - Du darfst niemals auf ein Objekt zugreifen, das nicht initialisiert (Create) wurde! - Du darfst niemals auf ein Objekt zugreifen, das bereits freigegeben (und nicht wieder erstellt) wurde! - Du darfst nicht auf ein Array-Element zugreifen, das nicht existiert (durch SetLength) Gruß blackdrake |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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