![]() |
ClassName ist falsch
Hallo ihr,
ich habe ein Problem mit Classname. Und zwar ist dieser Wert nicht zwingend richtig. Ich habe einfach mal folgende Prozedur geschrieben:
Delphi-Quellcode:
Jetzt ist das Problem, dass in "ClassName" nicht der richtige Wert steht:
procedure TZeile.PruefeZugriff(const AName: string);
begin if FDummy then raise EKeinZugriffDaDummy.CreateFmt('Kein Zugriff auf die Variable/Methode %s der Klasse %s, da es sich um ein Dummy handelt', [AName, Self.ClassName]); end; Zitat:
Woran könnte das liegen? Könnte da an einer folgenden Definition liegen:
Delphi-Quellcode:
Wobei dann müsste der Aufruf selber schon Probleme bereiten :P
var
Zeile : TZeile; begin Zeile := TBuchZeile.Create; ... end; MfG xZise |
Re: ClassName ist falsch
Ich vermute mal TBuchzeile ist TZeile abgeleitet, dann gilt TBuchZeile is-a TZeile und du hast ja eine Objekt vom Typ TBuchZeile erzeugt
|
Re: ClassName ist falsch
Vermutlich ist TBuchzeile von TZeile abgeleitet, daher ist das ein gültiger Aufruf.
[edit] *grmpf* Markus :? [/edit] |
Re: ClassName ist falsch
Zitat:
![]() |
Re: ClassName ist falsch
Einzige Möglichkeit an den "tatsächlichen" Klassennamen ranzukommen:
Du derstellst dir in der Basisklasse eine Funktion ala RealClassName, definierst diese NICHT als Virtual, greifst darin direkt auf den Klassentyp zu oder setzt den Result-String selber. Und dann nicht vergessen dieses in allen abeleiteten Klassen zu überschreiben .... Nja, oder du setzt gleich den gewünschten String direkt (per Hand) an der Stelle ein. :nerd: |
Re: ClassName ist falsch
Liste der Anhänge anzeigen (Anzahl: 1)
Tach,
tut mir leid, aber ich glaube mein "Problem" ist nicht so richtig klar geworden. Und zwar wird PruefeZugriff('Buch') nie in TBuchZeile oder TZeile sondern nur in TExemplarZeile aufgerufen. Die beiden Klassen TBuchZeile und TExemplarZeile sind beide von TZeile abgeleitet also sozusagen Geschwister. Um also obiges Beispiel fortzusetzen:
Delphi-Quellcode:
Und nun müsste doch schon alleine der Zugriff auf Buch, welche ja nicht in TBuchZeile existiert einen Fehler produzieren?
var
Zeile : TZeile; begin Zeile := TBuchZeile.Create; Zeile.IstDummy := true; TExemplarZeile(Zeile).Buch := nil; // Hier würde der Fehler erzeugt ... end; Naja ich hänge mal die Unit an. MfG xZise |
Re: ClassName ist falsch
die Klasse wurde als TBuchZeile erzeugt und ClassName geht über den internen Klassenzeiger und ließt darüber den Namen aus ... also immer den Namen der Klasse, über welche die Instanz erzeugt wurde..
|
Re: ClassName ist falsch
Ein harter Cast überprüft den typ nicht, sondern interpretiert den Speicherbereich.
Aber ich verstehe nicht, was du mit diesem Code vorhast. |
Re: ClassName ist falsch
Zitat:
Also wenn ich folgende Funktion habe:
Delphi-Quellcode:
Dann erwarte ich dass in Classname <Klasse> steht und nicht <Andere Klasse>, aber er kann Machwas aufrufen, weil er gecastet wurde :(
type
<Erste Klasse> = class function MyName : string; end; <Klasse> = class(<Erste Klasse>) procedure Machwas; end; <Andere Klasse> = class(<Erste Klasse>) procedure Machwasanderes; end; procedure <Andere Klasse>.Machwasanderes; begin Showmessage('Bye World'); end; procedure <Klasse>.Machwas; Showmessage(MyName); end; function <Erste Klasse>.MyName : string; begin Result := Classname; end; Aber das ist nicht mein Problem, sondern eher, wo ich einen falschen harten Cast mache :) Zitat:
Zitat:
Delphi-Quellcode:
Mit PruefeZugriff, will ich verhindern, dass ein Objekt welches als Dummy markiert wurde, auf Eigenschaften zugreift (bis auf die ID). Und zwar habe ich beim Laden der Listen das Problem, dass ich zum Beispiel die BuchID eines Exemplares kenne, aber nicht zwingend das Buch zu dieser ID. Zum einen kennen die Exemplare ja nicht alle Bücher (bis auf die Bücher die auch Exemplare haben) und zum anderen könnten die Bücher ja später geladen werden. Deshalb erstelle ich einen Dummy oder Platzhalter in den nur die ID des Buches steht. Dadurch kann ich später sagen, welches Buch dahinter steckt. Da aber bis auf die ID keine Werte gesetzt sind, darf man darauf nicht zugreifen. Erst mit "VerknüpfeListen" wird das Problem behoben!
Fachname := MeinExemplar.Buch.Fach.Name;
MfG xZise |
Re: ClassName ist falsch
Zitat:
Zitat:
|
Re: ClassName ist falsch
Moin Markus,
Du meinst diesen? Zitat:
MfG xZise |
Re: ClassName ist falsch
Ich meine die Tatsache, das eine Objekt als TBuchZeile erzeugt wird und dann als TExemplarZeile interpretiert wird.
Da diese Klasse in diesem Kontext aber nicht mehr identisch sind, macht der Code mit großer Wahrscheinlichkeit nicht das was du bezwecken willst. ( Wobei ich immer noch nicht genau weiss, was dass ist) |
Re: ClassName ist falsch
Hä?
Wer sagt denn, dass NIE (also wirklich nie nie nie nie nie nie) sowas vorkommt? Ich erstelle die Objekte in dieser Unit (UZeilen.pas) benutze sie aber mehreren anderen Units. Und wenn vielleicht ist irgendwo der Wurm drin und ich caste etwas falsch? Und genau kann könnte rein zufällig das passieren. Wobei dieser Fehler lässt sich mit einer Wahrscheinlichkeit von 100 % (15 "Tests") reproduzieren! MfG xZise |
Re: ClassName ist falsch
Dann überprüfe die Klasse bevor du sie castest oder mache wenigstens einen Softcast!
Delphi-Quellcode:
if Zeile is TExemplarzeile then TExemplarZeile(Zeile).Buch := nil;
|
Re: ClassName ist falsch
Joar also ich habe den kompletten Code nach den cast zur TExemplarZeile durchsucht. Und naja an jeder Stelle, sollte eigentlich eine TExemplarZeile vorhanden sein. Nun habe ich an einer Stelle das zum Softcast geändert (warum da kA :P ). Und naja heute kam zumindest einmal der Bug das eine Konvertierung nicht möglich ist. Genau aus diesem Grund werde ich das mal bei allen casts machen. Dann werde ich Rasen mähen und dann sehe ich mal weiter :P
MfG xZise |
Re: ClassName ist falsch
tja, harte Casts sollte man halt wirklich nur machen, wenn man weiß, daß da wirklich nur dieser Typ vorkommen kann :)
ansonsten sollte IS und AS verwendet werden :angel: |
Re: ClassName ist falsch
Naja ich weiß ja dass es diese Zeile sein muss... Aber anscheinend ist da irgendwo der Wurm drin :)
MfG xZise |
Re: ClassName ist falsch
Hallo an alle,
Okay ich habe den Fehler gefunden ;) Und zwar, lag es daran, dass ich auf inzwischen veraltete Objekte zurückgegriffen hatte. MfG xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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