【问题标题】:calling C++ builder XE Form from delphi code从 delphi 代码调用 C++ builder XE Form
【发布时间】:2012-07-11 02:03:12
【问题描述】:

我正在使用来自 JEDI JCL 包的出色 TExceptionDialog 来显示 C++ builder XE 项目中未处理的异常,到目前为止一切正常。我决定通过编写我自己的自定义表单以通过 FTP 将崩溃报告上传到服务器来稍微增强它。

问题是我无法从 delphi PAS 单元打开我的自定义表单,试图定义为外部(这里没有 delphi 程序员,抱歉 :( )但不知道如何正确编码。我读过有很多教程,但除了为我的自定义表单编写 DLL 或 OLE 容器之外找不到任何有用的东西,对于这个项目来说真的是矫枉过正。

问题是,我怎样才能正确地执行这个任务?如何从 PAS delphi 单元执行 C++ 单元中定义的表单的 ShowModal()?

【问题讨论】:

  • 我们能否明确组织。你有一个使用 C++ Builder .dll 项目的 Delphi .exe 项目?
  • 它说“在 C++ builder XE 项目中”。它是一个 C++ Builder XE 项目,具有由 JCL 调试向导自动生成的单一表单 tracer.pas。我需要从该 tracer.pas 调用表单的 ShowModal 方法
  • 将方法变量 (procedure of object) 传递给 tracer.pas 中的表单。所以,就像一个事件处理程序。
  • 感谢您的回答。你能告诉我一些代码吗?我不是 Delphi 程序员,我已经尝试过了,但我总是遇到“不满意的前向或外部声明..”错误。顺便说一句,为了澄清自己,我必须调用位于 C++ 文件中的 tracer.pas 之外的表单的 ShowModal。调用应该在 tracer.pas 中。
  • 好吧,我不知道C++ Builder,所以我不知道那方面。

标签: delphi interop c++builder


【解决方案1】:

我找到了一种简单实用的方法,有点难看但有效!

技巧是通过使用 Screen.Forms 对象遍历所有表单来获取表单。我已将表单的 TAG 属性设置为预定义的数字,只是为了获得它的简单 ID。

简而言之,在我的表单的 C++ 单元中,我会这样做:

MyForm->Tag=9999; // easy way of Iding my form

然后,在我的 TExceptionDialog 的 delphi 单元中,在 SEND 按钮单击方法中:

procedure TExceptionDialog.SendBtnClick(Sender: TObject);
var
   i: integer;
   form: TForm;
begin
  for i := 0 to Screen.FormCount-1 do // all forms
  begin
    form := Screen.Forms[i]; // get a form
    if(form.Tag = 9999) then // check if its my form
    begin
      form.ShowModal; // if its mine, call showmodal
      break;
    end;
  end;
  ModalResult := mrOk;  // return to my app
end;

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多