在我的应用程序中,我需要捕获TDBGrid组件的OnDrawCell事件(默认情况下不可用/可见)。 因此,我创建了一个新组件(名为TDBGridHack)作为TDBGrid的后代。
标题文件:
#ifndef DBGridHackH
#define DBGridHackH
#include <System.SysUtils.hpp>
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.DBGrids.hpp>
#include <Vcl.Grids.hpp>
class PACKAGE TDBGridHack : public TDBGrid
{
private:
Vcl::Grids::TDrawCellEvent FOnDrawCell;
public:
__fastcall TDBGridHack(TComponent* Owner);
__published:
__property Vcl::Grids::TDrawCellEvent OnDrawCell = {read=FOnDrawCell, write=FOnDrawCell};
virtual void __fastcall DrawCell(int ACol, int ARow, const TRect& ARect, TGridDrawState AState);
};
#endif
源文件:
#include <vcl.h>
#pragma hdrstop
#include "DBGridHack.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// Durch ValidCtrCheck wird sichergestellt, dass die erstellen Komponenten
// keine virtuellen Funktionen haben.
//
static inline void ValidCtrCheck(TDBGridHack *)
{
new TDBGridHack(NULL);
}
__fastcall TDBGridHack::TDBGridHack(TComponent* Owner)
: TDBGrid(Owner)
{
}
void __fastcall TDBGridHack::DrawCell(int ACol, int ARow, const TRect& ARect, TGridDrawState AState)
{
TDBGrid::DrawCell(ACol, ARow, ARect, AState);
if ( FOnDrawCell )
{
FOnDrawCell( this, ACol, ARow, ARect, AState );
}
}
namespace Dbgridhack
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TDBGridHack)};
RegisterComponents(L"Hack", classes, 0);
}
}
代码编译得很好,在我的测试应用程序中,一切都按预期工作:
...并获得以下代码:
void __fastcall TForm1::DBGridHack1DrawCell(TObject *Sender, int ACol, int ARow,
const TRect &Rect, TGridDrawState State)
{
// do something here....
}
到目前为止 - 非常好,但是: 我打算使用这个组件的真正最终应用程序是使用clang编译器构建的。
将TestApplication的编译器更改为CLANG(32位)会引发链接器错误:&#34;未解析的外部 __ InitExceptBlockLDTC ...&#34;。
所以我将BPL的编译器设置也更改为CLANG(32位)。 - 安装组件工作正常,但组件本身与调色板不同。
然后我添加了&#34; -tP&#34;这里提到的选项: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Release_Notes#Additional_Options_for_BCC32C_to_Generate_a_Package
结果:
组件返回到调色板。
也可以将网格放在TestApplications表单上。
...但是双击OnDrawCell事件会创建以下损坏的代码:
void __fastcall TForm1::DBGridHack1DrawCell(Variant , int , int , Variant &, Variant )
{
}
现在我有点陷入困境。 创建VCL组件以供CLANG编译器使用的正确方法是什么?
最好的问候 赫维希我的设置是:MS Windows 10上的Embarcadero C ++ Builder XE10 Seattle(没有更新订阅包)。