![]() |
AW: Ungültige Zeigeroperation
Na dann
Delphi-Quellcode:
Frame.Parent := Application.MainForm;
|
AW: Ungültige Zeigeroperation
Nee, hierbei gibt es weiterhin eine Exception.
|
AW: Ungültige Zeigeroperation
Kannst Du für uns ein Mini-Beispielprojekt machen?
lg W |
AW: Ungültige Zeigeroperation
Zitat:
Wenn das fehl schlägt, ist Dein Frame vorher zerstört worden. O.Free (O ist ein Objekt) gibt nur den Speicherbereich frei, so dass dieser wieder neu vergeben werden kann. O (als Zeiger) zeigt aber immer noch auf den bisherigen Speicherbereich (bis O auf nil gesetzt wird). Wurde der Speicher neu vergeben (z.B. für Stringvariablen) und wird auf O wieder zugegriffen, dann gibt es i.d.R. eine Exception. |
AW: Ungültige Zeigeroperation
Aber würde in dem Fall nicht eher eine AV kommen statt Invalid Pointer?
|
AW: Ungültige Zeigeroperation
Ich habe den Fehler gefunden, aber noch nicht die Lösung. Es liegt an meinem mehrdimensionalem Array.
Bei fmMain.OnCreate rufe ich eine Routine auf, die ein CSV File einliest und in ein mehrdimensionales Array schreibt. Das sieht so aus:
Delphi-Quellcode:
Wenn ich diese Routine nicht verwende habe ich keine Probleme. Ich habe bereits behoben, dass falls eine Zeile nicht alle Werte wie die erste hat, dann fülle ich mit dem ersten Wert auf (das ist eine ID).
function GetLanguages: Boolean;
var Txt : String; LstValues, LstFile : TStringList; i, cnt, j, FillCnt : Integer; begin Result := false; if not FileExists(ChangeFileExt(Application.ExeName, '.lng')) then Exit; TraceFile(DateTimeToStr(Now()) + ' - ' + TRACESYS + ': Sprachdatei wird eingelesen'); // LanguageFile einlesen LstValues := TStringList.Create; LstFile := TStringList.Create; try LstFile.Delimiter := ';'; LstValues.Delimiter := ';'; LstFile.Clear; LstFile.LoadFromFile(ChangeFileExt(Application.ExeName, '.lng')); Txt := LstFile.Strings[0]; GetValues(Txt, LstValues); myLangList.CommaText := LstValues.CommaText; myLangList.Delete(0); SetLength(myLangValues, LstFile.Count, LstFile.Count); // Speicher für Spracharray reservieren: array of array of String cnt := 0; // Zähler für den ValueIndex for i := 1 to LstFile.Count - 1 do begin Txt := LstFile.Strings[i]; GetValues(Txt, LstValues); while LstValues.Count > (myLangList.Count+1) do LstValues.Delete(LstValues.Count - 1); FillCnt := (myLangList.Count+1) - LstValues.Count; for j := 0 to LstValues.Count - 1 do begin if LstValues.Strings[j] = '' then myLangValues[cnt, j] := LstValues.Strings[0] else myLangValues[cnt, j] := LstValues.Strings[j]; end; if FillCnt > 0 then begin for j := LstValues.Count to myLangList.Count do myLangValues[cnt, j] := LstValues.Strings[0]; end; Inc(cnt); end; finally LstFile.Free; LstValues.Free; end; end; nichts desto trotz bekomme ich hierbei eine exception. |
AW: Ungültige Zeigeroperation
Ohne da jetzt durchgestiegen zu sein, wie sieht es so aus (ungetestet)? Allerdings fülle ich nichts auf, da mir die Länge der längsten Zeile ja nicht im Voraus bekannt ist.
Delphi-Quellcode:
function GetLanguages: Boolean;
var LstValues, LstFile: TStringList; i, j: Integer; Filename: string; begin Result := false; Filename := ChangeFileExt(Application.ExeName, '.lng'); if not FileExists(Filename) then Exit; TraceFile(DateTimeToStr(Now()) + ' - ' + TRACESYS + ': Sprachdatei wird eingelesen'); // LanguageFile einlesen LstFile := TStringList.Create; try LstFile.LoadFromFile(Filename); LstValues := TStringList.Create; try LstValues.Delimiter := ';'; LstValues.StrictDelimiter := true; //ggf. weglassen SetLength(myLangValues, LstFile.Count); for i := 0 to LstFile.Count - 1 do begin LstValues.DelimitedText := LstFile[i]; SetLength(myLangValues[i], LstValues.Count); for j := 0 to LstValues.Count - 1 do myLangValues[i, j] := LstValues[j]; end; Result := true; finally LstValues.Free; end; finally LstFile.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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