![]() |
Re: Generisches Typecasting?
Zitat:
Und für Libraries gibt es die Möglichkeit dynamisch irgendwelche Funktionen zu laden und auszuführen. Dann könnte es doch auch möglich sein, anhand der Klasseninformation eine Funktion zu finden und auzuführen, oder? Es ist ja schließlich auch möglich dynamisch irgendwelche Klassen zu erstellen, wenn sie registriert sind. |
Re: Generisches Typecasting?
Ja, wenn die published sind ist das kein problem. Einfach den pointer holen und eine methoden-variable zusammen basteln:
Delphi-Quellcode:
type
TMyCall = procedure of object; var method:TMethod; ... method.data := myObj; method.code := myObj.MethodAddress('Perform'); ... if method.code <> nil then TMyCall(method); // dies ist der aufruf! // edit: verdammte kommentare |
Re: Generisches Typecasting?
Moin!
Zitat:
Zitat:
Zitat:
Zitat:
Im Endeffekt ist es so, das bei allen deinen Beispielen extra dafür Vorkehrungen getroffen wurden damit dies möglich wird, nicht aber in dem Fall wo du die Informationen suchst. @Maximov: Der o.g. Code sollte beim Aufruf eigentlich gut in die Hose gehen, da die Aufrufparameter fehlen und dadurch der Stack schiefer hängen sollte als der Haussegen. MfG Muetze1 |
Re: Generisches Typecasting?
Zitat:
Denn du erkennst ja schon, das das nicht funktioniert, wenn die Funktion nicht in der Basisklasse enthalten ist, folglich beziehst du dich schon auf die Polymorphie (denn ohne Polymorphie bist du nicht daran gebunden, was du von wem aufrufst). Oder ist das jetzt ein Denkfehler meinerseits und du willst was ganz anderes? :gruebel: |
Re: Generisches Typecasting?
So'n Mist!!! :evil: Aber danke für die eingehene Erklärung, hab mir das wohl zu einfach vorgestellt. :roll:
Aber mal angenommen, eine von TWinControl abgeleitete Klasse hat eine Methode published gemacht, kann ich dann das von maximov gepostete Beispiel anwenden? Nachtrag: Tja, ich hab eben gedacht, ich könnte genau sowas wie Polymorphie benutzen, obwohl die Methoden überhaupt als polymorph deklariert sind... :pale: |
Re: Generisches Typecasting?
Zitat:
.. Wie auch immer. Ich würd auch eher auf Polymorphie zurück greifen. |
Re: Generisches Typecasting?
Zitat:
Du hast folgendes Problem: Du hast ein TButton, der aber als TWinControl gecastet ist. Der Compiler geht also innerhalb der Methode davon aus, das Du nur ein TWinControl hast. Wird in diesem Moment eine Methode aufgerufen wie z.B. Repaint setzt der Compiler die Sprungadresse zu TWinControl.Repaint ein. Da hilft das nichts, das Dein Objekt ein TButton ist und Repaint dortdrin eigentlich überschrieben wäre, da das der Compiler der die Sprungadresse dorthin compiliert nix davon weiss. Du musst tatsächlich TButton(Object).Repaint aufrufen um die überschriebene Methode zu nehmen. |
Re: Generisches Typecasting?
Zitat:
ODer wie darf ich dich verstehen? |
Re: Generisches Typecasting?
Moin!
Nein, da er in die VMT Tabelle ausgehend von der aktuellen Instanzenadresse reinspringt, springt er an die Position der RePaint Procedure die der Button aber in der Instanz mit seiner eigenen Adresse überschrieben hat. Er wird bei dem Vorgehen trotzdem das Repaint des Buttons aufrufen. Probiere es aus! MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:04 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