wie ging das nochmal mit onClick eine procedure zuweisen
-
ich habe folgendes problen habe mir eine unit geschrieben wo
ich eine procedure geschrieben habe um Labels zuerzeugen und eine um
dem erzeugten Label ein onClick zuzuweisen.
kammt immer ein fehler rauswas mache ich falsch?
void __fastcall ErzeugeLabel(TObject *Sender,TPanel *Formula,String Text,bool onKlick)
{//========================================================
//Erzeuge Label mit Text
TLabel *LBez = new TLabel(Application);
LBez->Left=10;
LBez->Top=10;
LBez->Parent=Formula;
LBez->AutoSize=True;
LBez->Align=alLeft;
LBez->ParentColor=True;
LBez->Caption=Text;
LBez->Visible=True;
LBez->Show();
if (onKlick)
{
LBez->OnClick = LabelKlick;
}//========================================================
}bitte um hilfe
-
Soweit ich das kenne, musst Du dem OnClick eine Funktion zuordnen, die EXAKT so deklariert ist, wie in TLabel vorgegeben.
Sonst musste Dir was eigenes einfallen lassen.
Ein EIGENES OnMyClick()
-
bei dieser deklaration
void __fastcall LabelKlick(TObject *Sender);
bekomme ich diesen Fehler
[C++ Fehler] UErzeugen.cpp(27): E2034 Konvertierung von 'void (_fastcall *)(TObject *)' nach 'void (_fastcall * (_closure )(TObject *))(TObject *)' nicht möglich.
-
Du darfst nicht den Originalnamen benutzen, wenn Du was eigenes schreibst!
Ist das K in Klick gewollt oder ein Tippfehler?
Du kannst ja mal das (_closure) in Header mit einbauen.Mach mal in einer Form1:
void __fastcall TForm1::Form1Click(TObject *Sender) { int i; i++; OnClick=MyClick; } //Die Funktion in private: oder public: im Header einfuegen!!! void __fastcall TForm1::MyClick(TObject *Sender) { int i; i++; }Beim ersten Klick in Form wird Original- OnClick der Form gerufen und OnClick 'umgelenkt'
Bei weiteren Clicks kommt nur noc MyClick zum Zuge!PS: das i ist nur da um Haltepunkte zu setzen!!!
-
Die Funktion muss eine Methode der besitzenden Formularklasse sein.
Siehe auch bei den passsenden FAQ-Einträgen.-junix
-
wie soll das denn gehen
meine untit ist kein Form zugewiesen
die unit benutze ich universal. In verschiedenen Forms
-
Der Ansatz oben war schon richtig.
Erstens es handel sich dabei um eine "_closure", d.h. die zugewiesene Funktion muss genau gleich declariert sein:
- __fastcall ( fast immer )
- gleiche Prameter mit gleichen Namen ( oft : TObjec *Sender wie in onClick)Wenn du deine Zielfunktion so deklariert hast z.b.
class myclass : public TLabel { myclass{TObject *myobeject} :: TLabel(*myobject) { this->OnClick = myclick; // ohne (Parameter) !! wichtig für closures } void __fastcall myclick(TObject *Sender) { ...mycode... } }Die Funktion muss dabei keine Funktion des Formulars sein, wobei diese "__fastcall" kein C++ Begriff ist, sondern aus der VCL von Borland stand. Was es bedeutet ist hier nicht wichtig, ist nur eine Compiler anweisung. Dies muss aber stets dabei sein, wenn die Click() Funktion auch so declariert wurde.
mfg mayer
-
ja vielen dank
aber er zeikt mir voldenden Fehler an.
und ich weiß nicht wodrann es liegen kann[C++ Fehler] UErzeugen.h(10): E2040 Deklaration nicht ordnungsgemäß abgeschlossen.
#f = der Fehler
class myclass : public TLabel
{
#f myclass{TObject *myobeject} :: TLabel(*myobject)
{
this->OnClick = myclick; // ohne (Parameter) !! wichtig für closures
}void __fastcall myclick(TObject *Sender)
{
...mycode...
}#f}
-
Da fehlt glaube ein Semikolon nach der letzten schließenden geschweiften Klammer.
-
ne das mit dem Semikolon ist es auch nicht
-
äh, du weisst schon wie man Funktionen deklariert? Mal so rein Klammertechnisch und so? Vielleicht - statt nur zu Copy-Pasten - solltest du mal erst dasZeugs genau anschauen...
-junix
-
ne funktione deklarieren habe ich bei c++ noch nicht gemacht
wäre nicht schlecht wenn du mir mal ein beispiel geben könntest.
im bezug auf dieses.
-
Du programmierst mit dem BCB ohne zu wissen wie man Funktionen deklariert!

Schau dir das hier noch mal genau anmyclass{TObject *myobeject} :: TLabel(*myobject)myclass soll eine Funktion sein (genauer gesagt der Konstruktor der Klasse) und normalerweise wird die Parameterliste nicht von geschweiften Klammern eingerahmt.
Bitte lese unbedingt ein Grundlagenbuch zu C++.Ciao
-
Ja schönen dank an alle
Es geht!