delphi 如何在我的应用程序中将外部应用程序作为MDIChild或模态对话框打开,就好像它是我的应用程序的另一种形式

33qvvth1  于 2022-11-23  发布在  其他
关注(0)|答案(1)|浏览(157)

我的公司有一个庞大的用Delphi编写的300万行代码的大部分与数据库相关的应用程序,我们负责支持这个程序。这个应用程序有一个主窗体fsMDIForm,其他窗体是fsMDIChild,当需要它们的时候可以编程创建。在我们的团队中,我们使用过其他不同的编程语言,如C++,C#,Python,VB,一个想法是用另一种编程语言(如Visual Studio中的C#)制作程序的一部分,并在我们的应用程序中打开它。例如,在我们公司的另一个C#项目中,我们有一个表单,让用户选择一个可转换为PDF的文件(如图片、文档等),并将其转换为PDF/A进行存档。它还允许用户附加多个PDF。现在项目经理告诉我们在我们的 Delphi 项目中使用此代码。有很多方法可以做到这一点,比如创建一个DLL并从 Delphi 中调用它,或者简单地将其转换为EXE并从Delphi中调用它,然后等待它关闭等等。有时候,在Delphi中重新编写它是唯一的解决方案,但如果我将这样的代码放在一个简单的C#项目中并从中创建一个EXE,然后在 Delphi 应用程序中将此EXE文件作为Modal/MDIChild-Form运行,就好像它是主应用程序的一部分一样。
我做了一件多么糟糕的事:

procedure TEditEmailDlg.btnAttachFileClick(Sender: TObject);
var
  tf: string;
begin
  tf := TempFolder + 'FCDAA5F7-E26D-4C54-9514-68BDEC845AE3.Finished';
  ShellExecute(Handle, 'open', 'C:\Program Files (x86)\GL-K-S\tools\2PDFA.exe', '', '', SW_SHOWNORMAL);
  repeat
    Sleep(300);
  until FileExists(tf);
  with TStringList.Create do
  begin
    LoadFromFile(tf); // Selected and converted filenames
    ...
  end;
  ...
  DeleteFile(tf);
end;

正如你所看到的,它等待应用程序被关闭,但它不像一个MDI形式的项目,该项目将不会respounding.如果这是一个好主意,请让我知道我如何才能做到这一点,如果不是,为什么,什么是更好的解决方案,以防止重写的形式和代码背后的 Delphi .

axkjgtzd

axkjgtzd1#

由于您有 Delphi (D)和C#或C++(C)的代码,您可以对这两个应用程序做一点修改,以使用Windows MessagesShared Memory
我用Windows消息10年前,对不起,我没有代码现在.

  1. Windows消息:
    D在运行时会将一个窗口句柄(WH)作为命令参数发送给C。当C完成或由于任何其他原因,它会通过向WH发送自定义消息来通知D。
    1.共享内存:
    D在运行时会将共享内存的名称作为命令参数发送给C。
    在这两种情况下,C都会将窗口句柄(WH2)发送回D,然后D会使用SetParent()函数使D内的MyForm成为该窗口WH2的父窗口。
SetParent(WH2, MyForm.Handle);
MoveWindow(WH2, 0, 0, MyForm.ClientWidth, MyForm.ClientHeight, True);

当D从C获得通知消息告知它C将要关闭时,D将关闭MyForm
您也可以使用GetWindowRect()函数来获取WH 2的宽度和高度,以调整MyForm大小。var r:TRect;

GetWindowRect(WH2, r); 
MyForm.ClientWidth := r.Right - r.Left;
MyForm.ClientHeight := r.Bottom - r.Top;

相关问题