Zeiger auf eine Funktion übergeben
-
Hallo allerseits!
Ich habe folgendes Problem:
Im meinem Quellcode möchte ich eine Funktion in einer anderen Klasse aufrufen und dabei verschiedene Zeiger mit übergeben.
[cpp]
__fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner)
{
DBAccess->GetItems(TableName, MenuItem, Funktionszeiger);
}[/cpp]Funktionszeiger soll ein Zeiger auf folgende Funktion sein:
void __fastcall TfrmMain::MenuItemClick(TObject *Sender) { //... }
In folgender Funktion soll der Zeiger an die OnClick-Methode des neu erzeugten MenueItems übergeben werden:
[cpp]
int TMySQLAccess::GetProcessTableItems(AnsiString sProcessTable, TMenuItem *MenuItem, Funktionszeiger)
{
MenuItem->Clear();if (SqlQuery(true, "SELECT id, item FROM "+sProcessTable) != OP_SUCCESS) return OP_FAIL;
while (!mySQLDataModule->mySQLQuery->Eof)
{// untermenü-punkte erstellen
TMenuItem *NewSubItem = new TMenuItem(Application);
NewSubItem->Caption = mySQLDataModule->mySQLQuery->FieldByName("item")->AsString;
NewSubItem->Tag = mySQLDataModule->mySQLQuery->FieldByName("id")->AsInteger;
NewSubItem->OnClick = Funktionszeiger;
MenuItem->Add(NewSubItem);mySQLDataModule->mySQLQuery->Next();
}return OP_SUCCESS;
}[/cpp]Meine Frage ist nun: Als was für einen Typen muß ich Funktionszeiger deklarieren?
-
ich hab mir mit Methodenzeigern auch mal die Zähne ausgebissen. Das is was ziemlich heftiges und ich weiß nicht, ob das geht, weil man ja nicht nur die Adresse der Methode übergeben muß sondern im Prinzip auch die zugehörige Klasseninstanz...
Bei Ereignisbehandlungsroutinen gibt es ja eine Vereinfachung, die Borland eingeführt hat (siehe Hilfe zu "__closure").
Ansonsten kann ich Dich nur auf die Hilfe verweisen. Such mal nach der Seite "Zeiger auf Funktionen" (Sprachstruktur / Zeiger).
Ob das aber so klappt, weiß ich nicht. Aber probiers doch mal gemäß Anleitung und sag, ob es tut... das geht meist am schnellsten ...
-
Original erstellt von F98:
Meine Frage ist nun: Als was für einen Typen muß ich Funktionszeiger deklarieren?TNotifyEvent
[ Dieser Beitrag wurde am 06.03.2003 um 21:18 Uhr von WebFritzi editiert. ]
-
Ich mach das jetzt mal so, wie es im Denkanstoß von WebFritzi steht:
[cpp]
__fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner)
{
DBAccess->GetItems(TableName, MenuItem, MenuItemClick); //Fehler
}int TMySQLAccess::GetProcessTableItems(AnsiString sProcessTable, TMenuItem *MenuItem, *TNotifyEvent MenuItemClick)
{
MenuItem->Clear();if (SqlQuery(true, "SELECT id, item FROM "+sProcessTable) != OP_SUCCESS) return OP_FAIL;
while (!mySQLDataModule->mySQLQuery->Eof)
{// untermenü-punkte erstellen
TMenuItem *NewSubItem = new TMenuItem(Application);
NewSubItem->Caption = mySQLDataModule->mySQLQuery->FieldByName("item")->AsString;
NewSubItem->Tag = mySQLDataModule->mySQLQuery->FieldByName("id")->AsInteger;
NewSubItem->OnClick = MenuItemClick;
MenuItem->Add(NewSubItem);mySQLDataModule->mySQLQuery->Next();
}return OP_SUCCESS;
}[/cpp]Leider bringt der Compiler folgende Fehlermeldung:
[C++ Fehler] UMain.cpp(32): E2034 Konvertierung von 'void (_fastcall * (_closure )(TObject *))(TObject *)' nach 'void (_fastcall * (_closure *)(TObject
*)(TObject *)' nicht möglich
Was mache ich da falsch?
-
int TMySQLAccess::GetProcessTableItems(AnsiString sProcessTable, TMenuItem *MenuItem, TNotifyEvent *MenuItemClick)
ähm, warum ein Pointer auf ein Funktionszeiger ?
Schreib so:
int TMySQLAccess::GetProcessTableItems(AnsiString sProcessTable, TMenuItem *MenuItem, TNotifyEvent MenuItemClick)
-
*Strike*
Erstmal danke an alle für die Hilfe. Es funzt wunderbar.
Vorschlage: Das wäre doch mal ein Thema für die FAQ, oder?
-
Original erstellt von F98:
Vorschlage: Das wäre doch mal ein Thema für die FAQ, oder?Nö, finde ich nicht.
-
Warum nicht? Andere sollen doch auch davon profitieren *sozialdenk* :p
-
andere wissen sowas schon.
-
@Sunday soll das heißen, dass du alles weißt..
-
nö, aber das wusste ich auch
-
... bin mir garn nicht bewußt, das ich auch unregistriert gepostet habe ...
-
Weitere OffTopic-Beiträge werden kommentarlos gelöscht.