Aufruf einer (Klasse-)Methode nur anhand des Namens



  • Du könntest auch von allen Komponenten neue Ableiten, die dann mit Hilfe von ActiveX und Typelibraries, auch ihr Methoden als String preisgeben würden.



  • Jede Klasse könnte eine Map mit dem String als Schlüssel und eine Methodenzeiger als Wert besitzen.



  • Würde sowas funktionieren ?

    class TNewControl: public TControl
    {
    public:
       __property OnMouseMove;
    };
    
    ...
       // Einfach mal nach TButton konvertieren...
       // ... ist aber Schweinerei!
       TNewControl *ctrl = dynamic_cast<TNewControl*>(form->Components);
       if (ctrl)
          ctrl->OnMouseMove = &FormMouseMove;
    ...
    


  • bIce schrieb:

    Du könntest auch von allen Komponenten neue Ableiten, die dann mit Hilfe von ActiveX und Typelibraries, auch ihr Methoden als String preisgeben würden.

    kommt mir sehr aufwendig vor und ich kenne u.U. auch nicht alle Komponenten
    im Vorfeld. Dann wird's mit dem Ableiten schwierig...



  • Anonymous schrieb:

    Jede Klasse könnte eine Map mit dem String als Schlüssel und eine Methodenzeiger als Wert besitzen.

    Kann ich das z.B. bei TButton o.ä. selbst beeinflussen?
    Ich glaube, das habe ich nicht ganz verstanden.



  • bIce schrieb:

    Würde sowas funktionieren ?

    class TNewControl: public TControl
    {
    public:
       __property OnMouseMove;
    };
    
    ...
       // Einfach mal nach TButton konvertieren...
       // ... ist aber Schweinerei!
       TNewControl *ctrl = dynamic_cast<TNewControl*>(form->Components);
       if (ctrl)
          ctrl->OnMouseMove = &FormMouseMove;
    ...
    

    Wegen des dynamic_cast dürfte sowas nicht funktionieren (oder?). Lasse ich
    den dynamic_cast weg, habe ich das gleiche wie vorher, nur mit einer selbst-
    geschriebenen Klasse anstatt TButton. (Oder liege ich völlig falsch?)



  • Sunday schrieb:

    vielleicht sagst du auch mal, was genau du erreichen willst, eventuell gibt es ja einen anderen lösungsweg zu deinem problem...

    Also, ich möchte eine Komponente erstellen, die immer, wenn ein Formular in
    der Anwendung geladen wird, dieses Formular übersetzt. D.h. ich gehe alle
    Komponenten auf dem Formular durch und setze Caption, Text oder auch andere
    Eigenschaften. Welche Eigenschaften eine solche Komponente hat, kann ich
    dabei nicht vorher wissen: Es können ja auch Komponenten von Dritt-Her-
    stellern sein.
    Deshalb möchte ich zur Laufzeit herausfinden, welche Eigenschaften eine
    Komponente hat und möchte auch den Wert ändern können.
    Ist mein Problem jetzt etwas besser verständlich?



  • Alexander Kempf schrieb:

    Welche Eigenschaften eine solche Komponente hat, kann ich dabei nicht vorher wissen: Es können ja auch Komponenten von Dritt-Herstellern sein.

    Wenn du nicht weisst, um was für Komponenten es sich handelt, woher willst du denn dann wissen, was du da eigentlich reinschreiben sollst?



  • Du kannst anstelle nach TButton auch nach einem gemeinsamen Vorfahren casten(natürlich mit dynamic_cast), der die gewünschte Eigenschaft oder Methode hat, um die Anzahl der Fälle zu reduzieren. Dazu zeigt dir die Hilfe die Objekthierarchie an.



  • Geo:
    Damit (StichWort InheritsFrom()) kann man den Umfang der Abfragen zwar reduzieren, am "Problem" des if/else-Konstukts ändert sich aber nichts. Und wenn eine (3rd-party)Komponente von einer in der Hierarchie hochstehenden Klasse wie zB. TWinControl direkt abgeleitet wurde nützt dir das ja auch nicht wirklich etwas.



  • Jansen schrieb:

    Alexander Kempf schrieb:

    Welche Eigenschaften eine solche Komponente hat, kann ich dabei nicht vorher wissen: Es können ja auch Komponenten von Dritt-Herstellern sein.

    Wenn du nicht weisst, um was für Komponenten es sich handelt, woher willst du denn dann wissen, was du da eigentlich reinschreiben sollst?

    Ich stelle mir das so vor, daß die Informationen z.B. aus einer XML-Datei
    oder aus einer Datenbank kommen. Wie die Daten da reinkommen ist ein anderes
    Thema, aber auch dafür habe ich schon (noch nicht ganz konkrete) Vorstellungen.
    Es gibt ja aber auf jeden Fall für visuelle Komponenten Eigenschaften die mit
    großer Wahrscheinlichkeit wirklich existieren, wie "Caption" oder "Text". Die
    könnte man dann mal "auf Verdacht" setzen und das ganze in einen try/catch-
    Block setzen.
    Schwierig, schwierig...



  • Jansen schrieb:

    Geo:
    Damit (StichWort InheritsFrom()) kann man den Umfang der Abfragen zwar reduzieren, am "Problem" des if/else-Konstukts ändert sich aber nichts. Und wenn eine (3rd-party)Komponente von einer in der Hierarchie hochstehenden Klasse wie zB. TWinControl direkt abgeleitet wurde nützt dir das ja auch nicht wirklich etwas.

    Genau.
    Ich glaube, hier hat mich jemand verstanden 😉 Ganz schön schwer, was zu er-
    klären, so daß es alle verstehen.


Anmelden zum Antworten