Einzelnen Beitrag anzeigen

fortuneNext

Registriert seit: 11. Aug 2007
Ort: Neuss
133 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 11:21
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:
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 + '.inithen
    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.
Aufgerufen wird das so (in einer anderen Unit):
Delphi-Quellcode:
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;
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.
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
Tim
"Hilfe & Support konnte nicht geöffnet werden. Bitte öffnen sie Hilfe & Support, um das Problem zu beheben."
"No Keyboard found. Press F1 to continue."
  Mit Zitat antworten Zitat