Не могу разобраться с функциями
Фрагмент хедера :
void __fastcall MD(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall MM(TObject *Sender,TShiftState Shift, int X, int Y);
void __fastcall MU(TObject *Sender,TMouseButton Button, TShiftState Shift, int X, int Y);
Фрагмент cpp-шника:
SG->onMouseDown=MD;
SG->onMouseMove=MM;
SG->onMouseUp=MU;
Реализую функции MD, MM и MU и все прекрасно работает.
А затем я в хэдер добавил след строчку:
void __fastcall DC(TObject *Sender, int ACol,int ARow, TRect &Rect, TGridDrawState State);
а в cpp-шник: SG->onDrawCell=DC;
И компилятор выдает ошибку!!! :
[C++ Error] IPanel.cpp(743): E2034 Cannot convert 'void (_fastcall * (_closure )(TObject *,int,int,TRect &,TGridDrawState))(TObject *,int,int,TRect &,TGridDrawState)' to 'void (_fastcall * (_closure )(TObject *,int,int,const TRect &,TGridDrawState))(TObject *,int,int,const TRect &,TGridDrawState)'
Помогите, плиз...
void __fastcall DC(TObject *Sender, int ACol,int ARow, const TRect &Rect, TGridDrawState State);
и все заработало. Однако я все равно не понимаю, почему если кинуть на форму StringGrid и задать событие
OnDrawCell, то в сигнатуре const не будет и все будет работать. Объясните популярно, пожалуйста.
Цитата:
Originally posted by Бешеный кролик
Однако я все равно не понимаю, почему если кинуть на форму StringGrid и задать событие
OnDrawCell, то в сигнатуре const не будет и все будет работать.
Однако я все равно не понимаю, почему если кинуть на форму StringGrid и задать событие
OnDrawCell, то в сигнатуре const не будет и все будет работать.
Такого быть не должно. Билдер строит прототип функции по RTTI пакета, где расположен компонент. Если прототип ошибочный - глюк в Билдере, или исходники, из которых собирается приложение, различаются с теми, из которых собран пакет дизайна. Эффект может проявиться только, если приложение собирается с полной перекомпиляцией VCL и без пакетов.