![]() |
Delphi-Version: 11 Alexandria
Ausführen einer Methode bei MethodAddress
Ich habe ein Formular mit vielen sichtbaren abgeleiteten Graphic-Komponenten.
Ich habe den Namen der Komponente, weiß aber nicht genau von welchem Typ die ist. Ich möchte diese bestimmte neu zeichnen mit "repaint" weil sich einfach nur die Farbe ändern soll. Dazu habe ich folgenden Ansatz?, weiß aber nicht wie ich die Methode repaint dann ausführen kann. Stehe ich da einfach nur auf dem Schlauch?
Delphi-Quellcode:
procedure TFMain.repaint_bauteil(acomp_name: string; astatus: integer);
var aComp: TComponent; aMethodAddress: Pointer; begin aComp := FMain.FindComponent(aComp_Name); aMethodAddress := aComp.MethodAddress('Repaint'); if Assigned(aMethodAddress) then begin //wie jetzt hier die entsprechende Procedure 'Repaint' ausführen? end; end; |
AW: Ausführen einer Methode bei MethodAddress
Entweder guckst du hier ab:
![]() Oder du machst sowas:
Delphi-Quellcode:
(aComp as TControl).Repaint;
|
AW: Ausführen einer Methode bei MethodAddress
Entweder selbst durch die TypeInfo kämpfen
![]() oder die erweiterte RTTI benutzen ![]() Die Funktionen an TObjekt kennen keine Typen (das sind die Funktionen, welche der DFM-Loader/Writer nutzt, aber deswegen prüft/vergleicht inzwischen der FormDesigner, in der IDE, nun beim Speichern zumindest mal die Typen der Felder und Methoden-Parameter zwischen PAS und DFM) |
AW: Ausführen einer Methode bei mehreren Komponenten
So richtig komme ich noch nicht klar.
Mit einer einzelnen bestimmten Komponente gehts..
Delphi-Quellcode:
Da ich aber verschiedene eigene Klassen habe (verschiedene eigene Grafiken) vom
procedure TFMain.repaint_bauteil(acomp_name: string; astatus: integer);
var aComp: TComponent; acolor: TColor; begin aComp := FMain.FindComponent(aComp_Name); acolor := (acomp as TMyOwnComp).FarbeDefault; case aStatus of 99: Acolor := clred; 100: Acolor := clyellow; end; (acomp as TMyOwnComp).Farbe := acolor; (acomp as TMyOwnComp).Repaint; end; Typ TmyOwnCompName1, TmyOwnCompName2..... dachte ich mir, es geht vielleicht wie folgt, tuts aber nicht :( Alle Komponenten haben die Eigenschft Farbe und die Methode Repaint;
Delphi-Quellcode:
procedure TFMain.repaint_bauteil(acomp_name: string; astatus: integer);
var aComp: TComponent; acolor: TColor; aClassType: TClass; begin aComp := FMain.FindComponent(aComp_Name); aCLassType := aComp.ClassType; ..... (acomp as aClassType).Farbe := acolor; // geht nicht ******* end; |
AW: Ausführen einer Methode bei MethodAddress
Wie ist denn die Klassenhierarchie für deine Komponenten?
|
AW: Ausführen einer Methode bei MethodAddress
Wenn das z.b irgendwie alles von t-control abgeleitet ist, dann reicht as TControl für repaint.
|
AW: Ausführen einer Methode bei MethodAddress
Wenn das alles deine eigenen Klassen sind, leite sie doch einfach von einer gemeinsamen Elternklasse ab, die diese Funktionalität bereitstellt. Dann kannst du darauf casten.
Wenn das nicht geht, kannst du ein Interface verwenden, in dem die Funktionalität erreichbar ist, so dass deine Klassen dieses alle implementieren können. Dann kannst du mit Supports dieses holen und nutzen. |
AW: Ausführen einer Methode bei MethodAddress
Casten und die Methode "direkt" aufrufen ist natürlich immernoch das Beste, am Einfachsten über einen gemeinsamen Vorfahren.
Delphi-Quellcode:
type
TMyForm = class(TForm) private procedure Test; procedure DoLog(S, S2: string); end; procedure TMyForm.Test; begin for var M in TRttiContext.Create.GetType({TMyForm}Self.ClassType).GetMethods do // ja, es fehlt ein .FindMethod('DoLog') ... k.A. warum die immer wieder so dämlich sind if M.Name = 'DoLog' then M.Invoke(Self, ['abc', 'def']); end; |
AW: Ausführen einer Methode bei MethodAddress jetzt habe ich noch ne AV
ich habe es wohl nicht so mit Klassen, eigenen Komponenten und Vererben (vererben klingt auch so negativ irgendwie)
also die Elternklasse ist TGraphicControl.. Ich erstelle eine neue Komponente TT die sieht dann erstmal nackt so aus:
Delphi-Quellcode:
Funktioniert soweit.unit Test; interface uses System.SysUtils, System.Classes, Vcl.Controls; type TTest = class(TGraphicControl) private { Private-Deklarationen } protected { Protected-Deklarationen } public { Public-Deklarationen } published { Published-Deklarationen } end; procedure Register; implementation procedure Register; begin RegisterComponents('TEest', [TTest]); end; end. wenn ich jetzt diese Komponente auf ne Form ziehe und folgenden Code habe als Beispiel:
Delphi-Quellcode:
läuft das Progrämmchen auch, aber es kommt eine Zugriffsverletzung bei der letzten Zeile mit "acomp as'.procedure TFMain.BtnTestCompClick(Sender: TObject); var aComp: TComponent; aComp_Name: string; begin aComp_Name := 'Test1'; aComp := FMain.FindComponent(aComp_Name); (acomp as TGraphicControl).Height := 200; end; Habe bestimmt nur ne Kleinigkeit übersehen? Die Eigenschaft height ist ja standardmässig auch vorhanden in TGraphicControl |
AW: Ausführen einer Methode bei MethodAddress
Weder prüfst Du, ob aComp überhaupt was zugeweisen wurde, also FindComponent erfolgreich war, noch prüfst Du, ob aComp überhaupt vom Typ TGraphicControl ist.
Delphi-Quellcode:
if Assigend(aComp) and (aComp is TGraphicControl) then TGraphicControl(acomp).Height := 200;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:56 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 by Thomas Breitkreuz