如何使用C ++ Builder XE10(Seattle)和CLANG编写VCL组件

时间:2017-08-24 20:26:21

标签: c++ clang c++builder vcl

在我的应用程序中,我需要捕获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);
    }
}

代码编译得很好,在我的测试应用程序中,一切都按预期工作:

  • 我将新创建的DBGridHack从组件面板插入到MainForm
  • 在事件选项板中双击OnDrawCell

...并获得以下代码:

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(没有更新订阅包)。

0 个答案:

没有答案