Probleme mit OnDrawItem in TDBComboBox
-
Hallo,
auf meiner Form habe 2 TDBComboBoxes. Die 1. Combo habe ich mit dem OI erzeugt. Die 2. Combo soll dynamisch erstellt werden. Beide Combos sollen jeweils eine eigene Event-Funktion für OnDrawItem erhalten.
Die Zuordnung im OI funktioniert für die 1. einwandfrei.
Wenn ich meine dynamische Version zuweisen will erzeugt der Compiler einen Fehler.
Ich habe keine Ahnung warum?Anbei ein bißchen Sourcecode.
Habe ich hier einen Fehler gemacht oder ist das ein Bug im Builder2009?//h class TForm1 : public TForm { __published: TButton *Button1; TDBComboBox *DBComboBox1; //wird im OI erzeugt void __fastcall DBComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State); void __fastcall Button1Click(TObject *Sender); private: TDBComboBox* dynDBCombo; //wird zur Laufzeit erzeugt void __fastcall dynDBComboDrawItem(TWinControl* Control, int Index, TRect &Rect, TOwnerDrawState State); } //cpp void __fastcall TForm1::Button1Click(TObject *Sender) { dynDBCombo = new TDBComboBox(this); dynDBCombo->Parent = this; dynDBCombo->Style = csOwnerDrawFixed; dynDBCombo->OnDrawItem = dynDBComboDrawItem; //hier Fehler, siehe Compilerfehler unten } //wird vom OI erzeugt u funktioniert einwandfrei void __fastcall TForm1::DBComboBox1DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State){ ... } //OnDrawItem für dynDBCombo void __fastcall TForm1::dynDBComboDrawItem(TWinControl* Control, int Index, TRect &Rect, TOwnerDrawState State){ .. }
Fehlermeldung des Compilers
[BCC32 Fehler] Unit1.cpp(451): E2034 Konvertierung von 'void (_fastcall * (_closure )(TWinControl *,int,TRect &,TOwnerDrawState))(TWinControl *,int,TRect &,TOwnerDrawState)' nach 'TDrawItemEvent' nicht möglich
-
Hi,
so sollte er compilieren:
void __fastcall TForm1::dynDBComboDrawItem(Controls::TWinControl* Control, int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State) { }
Dekl. in StdCtrls.hpp:
typedef void __fastcall (__closure *TDrawItemEvent)(Controls::TWinControl* Control, int Index, const Types::TRect &Rect, Windows::TOwnerDrawState State);
mfg
kpeter
-
Hallo @kpeter,
Dein Tipp ist wirklich absolut erstklassig. Es hat sofort geklappt. Der Fehler ist behoben.Bisher bin davon ausgegangen, dass ich die Verknüpfung des Events per Laufzeit mit der gleichen Funktion durchführen kann, die der OI im Designmodus vorgibt. Scheinbar ein Irrtum! Das werde ich mir merken!
Vielen Dank.
-
Hallo
Grundsätzlich kann man die gleichen Methoden sowohl zur Entwurfszeit im OI als auch zur Laufzeit per Code einem Event zuweisen. Dieser Fall hier ist ein kleiner Fehler der Entwicklungsumgebung. Eigentlich sollte auch für den OI das const notwendig sein.
bis bald
akari
-
Hi,
man sollte zumindest das TDrawItemEvent bei ausschl. dynamisch erzeugten Komponenten im Hinterkopf behalten.
Diese Kompos sind u.a. TComboBox, TListBox einschl. deren nicht-/ und datensensitiven Erben und TOutline.
Das beginnt beim BCB3. Dort würde stehen müssen// vom OI erzeugt: ...DrawItem(TWinControl *Control, int Index, TRect &Rect, TOwnerDrawState State) // vom Compiler akzeptiert (entspricht Dekl. aus StdCtrls.hpp BCB3) ...DrawItem(TWinControl *Control, int Index, const Windows::TRect &Rect, TOwnerDrawState State)
Wahrscheinlich verhalten sich die anderen BCB-Versionen ähnlich...
mfg
kpeter