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:
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
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; } };
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
Comment