AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Exception beim Createn eines IniFiles
Thema durchsuchen
Ansicht
Themen-Optionen

Exception beim Createn eines IniFiles

Ein Thema von fortuneNext · begonnen am 22. Aug 2008 · letzter Beitrag vom 24. Aug 2008
Antwort Antwort
Seite 2 von 3     12 3      
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#11

Re: Exception beim Createn eines IniFiles

  Alt 22. Aug 2008, 23:35
Also irgendwie ist dein Code grotesk, nicht?

Delphi-Quellcode:
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 + '.inithen
    begin
      UsedLanguageFile := LanguageFiles[x];
      UsedLanguageFilePath := UsedLanguageFile.FileName;
    end;
    LanguageFiles[x].Free;
  end;
end;
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.

(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:
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;
Ich hoffe, dass ich deinen Code nicht verplant habe.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
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
grenzgaenger
(Gast)

n/a Beiträge
 
#13

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 11:31
was machst denn hier:
Delphi-Quellcode:
    repeat
      if (SR.Attr <> faDirectory) then
      begin
        inc(x);
        SetLength(FNAGBasicControl.LanguageFiles, x + 1); //An dieser S
dachte
Delphi-Quellcode:
type
   TFNAGBasicControl = class(TObject)
ist bei dir ein objekt und kein array...

das kansnt du so nicht initialisieren oder gar die grösse verändern...
  Mit Zitat antworten Zitat
fortuneNext

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

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 11:33
FNAGBasicControl.LanguageFiles ist aber doch ein Array? :-/

Siehe auch hier:
Delphi-Quellcode:
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;
Oder seh ich das falsch?
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
grenzgaenger
(Gast)

n/a Beiträge
 
#15

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 12:23
so, hier mal 'n bischen code

Delphi-Quellcode:
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.
der sollte eigentlich deinen bisherigen code abdecken...

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
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#16

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 12:28
ersetz das mal ...

Delphi-Quellcode:
        inc(x);
        SetLength(FNAGBasicControl.LanguageFiles, x + 1); //An dieser Stelle gibt es merkwürdiger weise eine AccessViolation mit Abbruch
gegen das...

Delphi-Quellcode:
        inc(x);
        SetLength(LanguageFiles, x + 1); //An dieser Stelle gibt es merkwürdiger weise eine AccessViolation mit Abbruch
du greifst hier auf eine instanz zu, welche ausserhalb deines zugriffsbereiches ist...
  Mit Zitat antworten Zitat
fortuneNext

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

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 13:39
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?
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
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#18

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 13:48
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;
Hast du FNAGBasicControl mit

FNAGBasicControl := TFNAGBasicControl.Create(); initialisiert?

Und wieso listest du weiterhin alle Language-Files auf anstelle direkt eine zu laden? Hat das einen bestimmten Grund?

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat
fortuneNext

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

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 13:56
Jau das hat einen Grund:
Zitat:
//hier könnte dann die Liste der Files benutzt werden, z.B. in eine Liste zum auswählen
Ich hab bischen überlegt und mir gedacht, dass ich diese Liste später noch für Funktionen, die ich zusätzlich hinzufüge, brauchen werde. Wenn ich die Liste also parat habe, kann sie super in eine Auswähl-liste gepackt werden. Ich werd das wohl jetzt noch so ummodulieren, dass ich statt einem DynArray der Files eine StringList der Namen habe...

Und das Create... naja. Allerdings wenn ich das einfüge, bekomme ich plötzlich einen Fehler an der Stelle
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
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
blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#20

Re: Exception beim Createn eines IniFiles

  Alt 23. Aug 2008, 14:11
Zitat von fortuneNext:
Darf Eintrag 0 irgendwie nie geleert werden?
Natürlich darf er das. Eintrag 0 enthält ein Objekt TIniFile. Wenn du dieses freigibst, hat Eintrag 0 keinen Inhalt.

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
Daniel Marschall
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz