AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

AV bei Verwendung einer INI-File

Ein Thema von 3_of_8 · begonnen am 25. Apr 2006 · letzter Beitrag vom 26. Apr 2006
Antwort Antwort
Seite 2 von 4     12 34      
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 11:39
Zitat von jim_raynor:
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;
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#12

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 11:49
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
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#13

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 11:52
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?
  Mit Zitat antworten Zitat
Benutzerbild von Aenogym
Aenogym

Registriert seit: 7. Mär 2004
Ort: Schwerin
1.089 Beiträge
 
Delphi 7 Enterprise
 
#14

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 11:55
Zitat von DevilsCamp:
Wieso hängt Ihr euch eigentlich daran auf, dass die Variable ClassName heißt?
weil ClassName ein funktion ist.
Steffen Rieke
Was nicht buzzt, wird buzzend gemacht!
http://blog.base-records.de
http://www.base-records.de
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#15

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 12:07
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
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#16

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 12:49
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.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 12:56
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 13:07
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.
Günter
Pünktlichkeit ist die Fähigkeit vorherzusagen um wieviel sich der Andere verspäten wird.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#19

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 13:10
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?
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: AV bei Verwendung einer INI-File

  Alt 26. Apr 2006, 13:10
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));
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 4     12 34      


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 11:40 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