Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi AV bei Verwendung einer INI-File (https://www.delphipraxis.net/68188-av-bei-verwendung-einer-ini-file.html)

GuenterS 26. Apr 2006 10:39

Re: AV bei Verwendung einer INI-File
 
Zitat:

Zitat von jim_raynor
Zitat:

Zitat von GuenterS
Ich habe gerade versucht ClassName in einer class Procedure zu verwenden. Das funktioniert.

Ich habe ja auch nicht behauptet, dass es nicht funktioniert. Folgendes als Beispiel:

Delphi-Quellcode:
type
  TMyClass = class of TModule;

var
  MyClass: TMyClass;

begin
  MyClass:=nil;
  ShowMessage(IntToStr(MyClass.GetModuleID));
end;
könnte zu einer AV führe, da er ja keine gültige Klasse bekommen hat.

Und deshalb meine Bitte. Zeig mal den Aufruf der Funktion. Eventuell übergibts du ja nil als Objekt/Klasse.

p.S: Hab schon mitbekommen, dass es eine Klassenfunktion ist, aber trotzdem kann man mit dem obigen Konstrukt eine Übergabe von nil erreichen und das dürfte dann in einer AV in Classname verursachen, wenn dort keine prüfungen auf nil drin sind.

so ruft man aber keine class funktion auf

Delphi-Quellcode:
  var
    TMyClass = class(TObject)
    public
      class procedure Test;
    end;


... aufruf

    TMyClass.Test;

jim_raynor 26. Apr 2006 10:49

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:
var
  Module: TModule;

begin
  Module:=nil;
  ShowMessage(IntToStr(Module.GetModuleID));
end;
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 ;)

DevilsCamp 26. Apr 2006 10:52

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?

Aenogym 26. Apr 2006 10:55

Re: AV bei Verwendung einer INI-File
 
Zitat:

Zitat von DevilsCamp
Wieso hängt Ihr euch eigentlich daran auf, dass die Variable ClassName heißt?

weil ClassName ein funktion ist.

Hawkeye219 26. Apr 2006 11:07

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

GuenterS 26. Apr 2006 11:49

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.

3_of_8 26. Apr 2006 11:56

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.

GuenterS 26. Apr 2006 12:07

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.

Muetze1 26. Apr 2006 12:10

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?

3_of_8 26. Apr 2006 12:10

Re: AV bei Verwendung einer INI-File
 
Delphi-Quellcode:
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;
EDIT:

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 22:14 Uhr.
Seite 2 von 4     12 34      

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