Announcement

Collapse
No announcement yet.

Methodenzeiger richtig implementieren?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Methodenzeiger richtig implementieren?

    Hallo!

    Ich arbeiten mit den Komponenten von TMS. Da gibt es die AdvCardList Komponente. Diese verwaltet "Visitenkarten" in einer Collection und zeigt sie auf dem Bildschirm an.
    Nun möchte ich implementieren, daß beim Doppelklick auf TAdvCards eine bestimmte Methode der Klasse aufgerufen wird. Nun kommen die Methodenzeiger ins Spiel:

    typedef void __fastcall (__closure *TFuncPointer)(int);

    Um die entsprechende Methode in einer AdvCard zu speichern, leite ich einen Nachkommen davon ab:
    Code:
    class TFuncCard : public Advcardlist::TAdvCard
    {
    public:
    	TFuncPointer exe;
    	__fastcall virtual TFuncCard(Classes::TCollection* Collection) : TAdvCard(Collection) // Konstruktor der Basisklasse aufrufen
    	{
    		exe = NULL;
    	}
    };
    Die Cards werden von einem Thread aus befüllt (Auszug):
    TFuncCard * aCard = (TFuncCard*)Form1->AdvCardList1->Cards->Add(); // Add() ist vom Typ TAdvCard, deshalb wird auf TFuncCard gecastet
    aCard->Caption = "Test";
    aCard->exe = ShowKunde; // ShowKunde ist eine Methode der Thread-Klasse
    aCard->ItemList->Items[2]->AsInteger = (long int)&aCard->exe; // Testweises darstellen der Adresse der Methode als Integer

    Jetzt tritt das Problem auf: Die Adressen von ShowKunde ist auf jeder Karte anders, obwohl sie eigentlich gleich sein sollte. Bei der ersten Karte passt es, bei der zweiten Karte ist die Adresse um 900 erhöht, bei allen weiteren Karten um 144. Bis auf die erste Karte gibt es auch eine Schutzverletzung beim Doppelklick.

    Kann mir wer sagen, wo der Hund begraben liegt? Ist es ein offensichtlicher Fehler, oder wird evtl. innerhalb der Komponente mein Nachfahre von AdvCard verstümmelt?

    Bin für jeden Hinweis dankbar.

    Ciao

    CodeGier

  • #2
    TFuncCard * aCard = (TFuncCard*)Form1->AdvCardList1->Cards->Add(); // Add() ist vom Typ TAdvCard, deshalb wird auf TFuncCard gecastet
    Warum?? Wenn TFuncCard von TAdvCard abgeleitet ist, kann sie ohne casten die Methoden nutzen. Dazu gehört allerdings, dass auch eine entsprechende neue Instanz mit new angelegt wurde.

    So sehe ich das so, dass

    eine Klasse TFuncCard erstellt wird die von TAdvCard abgeleitet ist
    ein casten von einem TAdvCard-Objekt zu einem TFuncCard-Objekt erfolgt
    Christian

    Comment


    • #3
      Hallo Christian,

      Originally posted by Christian Marquardt View Post
      So sehe ich das so, dass

      eine Klasse TFuncCard erstellt wird die von TAdvCard abgeleitet ist
      ein casten von einem TAdvCard-Objekt zu einem TFuncCard-Objekt erfolgt
      Und genau damit hast Du mir auf die Sprünge geholfen. Herzlichen Dank dafür!

      Jetzt funkt es so, wie ich es haben wollte.

      Ciao

      CodeGier

      Comment

      Working...
      X