C++ Builder,将参数传递给 onClick 按钮事件

C++ Builder, pass argument to onClick button event

我正在使用 C++Builder 创建 GUI。

我动态创建了一个按钮,这个按钮有一个OnClick事件:

TButton* exportLongitudinalButton = new TButton(infoGroupBox);
exportLongitudinalButton->Parent = infoGroupBox;
exportLongitudinalButton->Caption = "Export DXF";
exportLongitudinalButton->OnClick = frmConcreteWidth -> onDXFExport;

onDXFExport函数:

void __fastcall TfrmConcreteWidth::onDXFExport(TObject *Sender)
{
   double x = 2.0;
   double y = 4.0;
   dxfFile.drawLongitudinalPlot(x,y);
}

有没有办法通过 OnClick 事件函数传递参数?

我想要一个 onDXFExport 函数,它看起来像这样:

void __fastcall TfrmConcreteWidth::onDXFExport(TObject *Sender, double x, double y)

并这样称呼它:

exportLongitudinalButton->OnClick = frmConcreteWidth -> onDXFExport(this, x, y)

这可能吗?

你所要求的通常是不可能的,至少不是你想要的方式。

OnClick 事件具有您无法更改的非常独特的签名。因此,您只需将 x/y 值存储在 onDXFExport() 需要时可以访问的其他地方。

有很多不同的方法可以解决这个问题。

例如,使用 TfrmConcreteWidth 对象的数据成员。或者创建一个 struct/class 实例来保存值,然后将指向该实例的指针存储在 TButton::Tag 属性 中。或者从 TButton 派生一个新的 class 并向其添加您自己的数据成员。

最接近您要求的方法也是最复杂的方法 - 创建一个直接存储值并使用内联汇编调用 onDXFExport() 的 thunk,然后您可以分配一个通过使用 TMethod 结构指向事件的那个 thunk 的指针。但是当其他方法更容易和更安全地使用时,我不建议使用这种方法。