AGB  ·  Datenschutz  ·  Impressum  







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

Ausführen einer Methode bei MethodAddress

Ein Thema von josef-b · begonnen am 4. Feb 2024 · letzter Beitrag vom 5. Feb 2024
Antwort Antwort
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
671 Beiträge
 
#1

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 14:41
Wie ist denn die Klassenhierarchie für deine Komponenten?
  Mit Zitat antworten Zitat
Benutzerbild von Olli73
Olli73
Online

Registriert seit: 25. Apr 2008
Ort: Neunkirchen
671 Beiträge
 
#2

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 14:43
Wenn das z.b irgendwie alles von t-control abgeleitet ist, dann reicht as TControl für repaint.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.370 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 15:13
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 15:25
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 = 'DoLogthen
      M.Invoke(Self, ['abc', 'def']);
end;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Ausführen einer Methode bei MethodAddress jetzt habe ich noch ne AV

  Alt 4. Feb 2024, 19:58
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:

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.
Funktioniert soweit.

wenn ich jetzt diese Komponente auf ne Form ziehe und folgenden Code habe als Beispiel:

Delphi-Quellcode:

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;
läuft das Progrämmchen auch, aber es kommt eine Zugriffsverletzung bei der letzten Zeile mit "acomp as'.

Habe bestimmt nur ne Kleinigkeit übersehen? Die Eigenschaft height ist ja standardmässig auch vorhanden in TGraphicControl

Geändert von josef-b ( 4. Feb 2024 um 20:09 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.434 Beiträge
 
Delphi 7 Professional
 
#6

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 20:11
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.
if Assigend(aComp) and (aComp is TGraphicControl) then TGraphicControl(acomp).Height := 200;
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 20:36
Ja, ich glaube ich war jetzt einfach etwas zu schnell und ungenau, sorry
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 22:04
weder ... noch prüfst Du, ob aComp überhaupt vom Typ TGraphicControl ist.
Doch doch.

Wenn es Keines ist, dann gibt es eine "passende" Exception, denn (acomp as TGraphicControl) .

Aber hier TGraphicControl(acomp) würde es nicht geprüft.


Achtung, IS und AS haben beim NIL einen kleinen UInterschied.

IS sagt False, wenn es NIL ist, also wenn es nicht "dieser Typ" ist.
AS dagegen läßt NIL durch, da es nur püpft, ob es der richtige Typ ist ... und NIL ist nicht ein "falscher Typ", da es nichts ist.



Zitat:
Dann kannst du darauf casten
Nicht vergessen, dass beim Zugriff über einen Vorfahr-Typen eventuell ein VIRTUAL + OVEERRIDE nötig ist, wenn die Funktionalität erst in den Nachfahren steckt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Feb 2024 um 22:08 Uhr)
  Mit Zitat antworten Zitat
josef-b

Registriert seit: 6. Jun 2004
Ort: bei Jena in Thüringen
95 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Ausführen einer Methode bei MethodAddress

  Alt 4. Feb 2024, 21:31
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.
So habe ich das jetzt gemacht. Funktioniert prima. Vielen Dank für Eure Hilfe
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:22 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