![]() |
Re: AV bei Verwendung einer INI-File
Zitat:
Delphi-Quellcode:
var
TMyClass = class(TObject) public class procedure Test; end; ... aufruf TMyClass.Test; |
Re: AV bei Verwendung einer INI-File
Selbst, wenn der Aufruf so nicht möglich ist (was ich kaum glaube, hab aber kein Delphi da um es zu überpüfen) kannst du auf jeden Fall folgendes machen:
Delphi-Quellcode:
Und es würde mich stark wundern, wenn er dann bei ClassName nicht knallt. Aber back to topic. Meine Vermutung ist, dass beim Aufruf von GetModuleID eine ungültige Klassen-/Objektreferenz vorliegt wodurch er in ClassName knallt. Allerdings kann man das erst mit Gewissheit sagen, wenn Manuel ein wenig mehr Quellcode zeigt ;)
var
Module: TModule; begin Module:=nil; ShowMessage(IntToStr(Module.GetModuleID)); end; |
Re: AV bei Verwendung einer INI-File
Wieso hängt Ihr euch eigentlich daran auf, dass die Variable ClassName heißt?
TIniFile.ReadString erwartet an erster Stelle einen STRING und nichts anderes!!!! Daher erneut meine Frage an 3_of_8: Hast du diese Probleme auch in anderen Projekten oder nur dort? |
Re: AV bei Verwendung einer INI-File
Zitat:
|
Re: AV bei Verwendung einer INI-File
Hallo,
jim_raynor hat Recht. Der Zugriff über einen Klassenzeiger führt nicht zum Fehler, der Zugriff über eine NIL-"Instanz" aber wohl. Manuel greift offenbar über eine nicht initialisierte Variable vom Typ TModule (oder eines Nachfolgers) auf die ID zu und erhält dann die beschriebene Fehlermeldung. Gruß Hawkeye |
Re: AV bei Verwendung einer INI-File
Okok. Es funktioniert beides (compilierbar), wobei das mit dem nil Pointer ne AV gibt.
Nur wissen wir immer noch nicht, wie er denn nun die Funktion aufruft. |
Re: AV bei Verwendung einer INI-File
Also:
ModuleConfigFile ist ein String, der in dem Initialization-Abschnitt einer referenzierten Unit zugewiesen wird. Die Datei existiert definitiv. Ich verwende deshalb nicht ini.ReadInteger, weil die ID als Hex-Zahl vorliegt ($0101) und ich mir nicht sicher bin, ob ReadInteger das erkennt. Ich glaube das Problem ist, dass TModuleClass(Pointer(ModuleButtons[I])).ClassName; Immer ein Leerstring ist. |
Re: AV bei Verwendung einer INI-File
aha.
Du rufst in dem Beispielcode wo doch der Fehler liegen sollte nirgends TModuleClass(Pointer(ModuleButtons[I])).ClassName; auf? Wieso ist das ein Problem, wenn dir das einen Leerstring liefert? Vielleicht dürfen wir etwas mehr von dem sehen, was den Fehler verursacht. |
Re: AV bei Verwendung einer INI-File
Du hast eine Klasse, welche eine statische Methode hat. Diese verwendet eine Variable (glaubst du zumindest), namens ClassName. Diese Variable hast du irgendwo global deklariert (in der Klasse kann nicht sein, da du in einer statischen Methode keinen Zugriff auf Klassenvariablen hast). So, da du nun aber dich in einer statischen Methode befindest, nimmt er in deiner Methode natürlich erstmal das naheliegenste, sprich: wenn vorhanden, das Element im aktuellen Gültigkeitsbereich. Dieses wäre dann _nicht_ die globale Variable ClassName sondern die in TObject definierte statische Methode namens "ClassName", welche einen String zurück gibt.
Wie man nun an der Definition von ReadString von TIniFile erkennen sollte, dass er nicht die ClassName Methode nimmt ist mir zwar schleierhaft, aber man lässt sich ja gerne belehren... So, das nur noch mal zum Hinweis. Grundlegend bringt es uns nicht weiter, da beides eine statische Methode ist und somit ein gültiges Konstrukt, auch wenn er vllt. nicht wie gewünscht die globale Variable sondern die Methode nutzt. Und zum anderen Frage ich mich, was diese ( TModuleClass(Pointer(ModuleButtons[I])).ClassName; ) abenteuerliche Konstruktion von nöten macht? |
Re: AV bei Verwendung einer INI-File
Delphi-Quellcode:
EDIT:
for I:=0 to high(ModuleButtons) do
begin showmessage(TModuleClass(Pointer(ModuleButtons[I])).ClassName); bitmap:=TBitmap.Create; bitmap.LoadFromResourceName(HINSTANCE, TModuleClass(Pointer(ModuleButtons[I].Tag)).ClassName); CreateCursorFromBMP(TModuleClass(Pointer(ModuleButtons[I])). GetModuleID(TModuleClass(Pointer(ModuleButtons[I])).ClassName),bitmap); end; Also. Ich habe KEINE Variable namens ClassName. Ich will diese statische Methode haben. Ich füge einem Panel mit einer Prozedur mehrere Buttons hinzu, jeder steht für eine Klasse abgeleitet von TModule. Im Tag desselben steckt ein Pointer auf eine class of TModule. Später lese ich das wieder aus und erzeuge eine Instanz: module:=TModuleClass(Pointer((Sender as TComponent).Tag)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:00 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