AGB  ·  Datenschutz  ·  Impressum  







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

ClassName ist falsch

Ein Thema von xZise · begonnen am 12. Jun 2009 · letzter Beitrag vom 16. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

ClassName ist falsch

  Alt 12. Jun 2009, 13:13
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:
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;
Jetzt ist das Problem, dass in "ClassName" nicht der richtige Wert steht:
Zitat:
---------------------------
Liberate
---------------------------
Kein Zugriff auf die Variable/Methode Buch der Klasse TBuchZeile, da es sich um ein Dummy handelt.
---------------------------
OK
---------------------------
Für sich gesehen kein Problem. Nur sobald man den Code durchsucht, wird man feststellen, dass es die Klasse TBuchZeile nie den obigen Fehler aufrufen wird.

Woran könnte das liegen? Könnte da an einer folgenden Definition liegen:
Delphi-Quellcode:
var
  Zeile : TZeile;
begin
  Zeile := TBuchZeile.Create;
  ...
end;
Wobei dann müsste der Aufruf selber schon Probleme bereiten

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: ClassName ist falsch

  Alt 12. Jun 2009, 13:22
Ich vermute mal TBuchzeile ist TZeile abgeleitet, dann gilt TBuchZeile is-a TZeile und du hast ja eine Objekt vom Typ TBuchZeile erzeugt
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

Re: ClassName ist falsch

  Alt 12. Jun 2009, 13:22
Vermutlich ist TBuchzeile von TZeile abgeleitet, daher ist das ein gültiger Aufruf.

[edit] *grmpf* Markus [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: ClassName ist falsch

  Alt 12. Jun 2009, 13:25
Zitat:
Jetzt ist das Problem, dass in "ClassName" nicht der richtige Wert steht:
Falsch, in ClassName steht der richtige Wert. Ist doch klar. Aufgrund der Polymorphie kann sich TBuchZeile in TZeile befinden, da TBuchZeile in direkter Vererbungslinie mit TZeile liegt. Da anscheinend in TBuchZeile kein PruefeZugriff deklariert ist, wird die Funktion aus der Basisklasse übernommen.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: ClassName ist falsch

  Alt 12. Jun 2009, 14:25
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: ClassName ist falsch

  Alt 13. Jun 2009, 11:12
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:
var
  Zeile : TZeile;
begin
  Zeile := TBuchZeile.Create;
  Zeile.IstDummy := true;
  TExemplarZeile(Zeile).Buch := nil; // Hier würde der Fehler erzeugt
  ...
end;
Und nun müsste doch schon alleine der Zugriff auf Buch, welche ja nicht in TBuchZeile existiert einen Fehler produzieren?

Naja ich hänge mal die Unit an.

MfG
xZise
Angehängte Dateien
Dateityp: pas uzeilen_766.pas (31,2 KB, 1x aufgerufen)
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

Re: ClassName ist falsch

  Alt 13. Jun 2009, 11:17
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..
$2B or not $2B
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: ClassName ist falsch

  Alt 13. Jun 2009, 11:22
Ein harter Cast überprüft den typ nicht, sondern interpretiert den Speicherbereich.

Aber ich verstehe nicht, was du mit diesem Code vorhast.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

Re: ClassName ist falsch

  Alt 13. Jun 2009, 11:47
Zitat von himitsu:
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..
Naja ich hätte TExemplarZeile aber erwartet

Also wenn ich folgende Funktion habe:
Delphi-Quellcode:
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;
Dann erwarte ich dass in Classname <Klasse> steht und nicht <Andere Klasse>, aber er kann Machwas aufrufen, weil er gecastet wurde

Aber das ist nicht mein Problem, sondern eher, wo ich einen falschen harten Cast mache

Zitat von mkinzler:
Ein harter Cast überprüft den typ nicht, sondern interpretiert den Speicherbereich.
Nagut okay das könnte zufällig also klappen?

Zitat von mkinzler:
Aber ich verstehe nicht, was du mit diesem Code vorhast.
Mit welchem Code genau? UZeilen.pas? Damit beschreibe ich die Daten die nachher in mehreren VSTs stehen. Und zwar lade ich damit quasi die komplette Datenbank in den RAM was zum einem schneller ist und zum anderen auch direkte Verknüpfungen erlaubt. Also um zum Beispiel den Fachnamen eines Exemplars zu ermitteln muss man nicht folgende Kette aufrufen:
  • BuchID zur ExemplarID
  • FachID zur BuchID
  • Fachname zur FachID
Sondern kann einfach folgendes sagen:
Fachname := MeinExemplar.Buch.Fach.Name; 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!

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: ClassName ist falsch

  Alt 13. Jun 2009, 12:04
Zitat:
Nagut okay das könnte zufällig also klappen?
Das wäre ein großer Zufall
Zitat:
mkinzler hat folgendes geschrieben:
Aber ich verstehe nicht, was du mit diesem Code vorhast.

Mit welchem Code genau?
Der Code in #6
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:29 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