我的公司有一个庞大的用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 .
1条答案
按热度按时间axkjgtzd1#
由于您有 Delphi (D)和C#或C++(C)的代码,您可以对这两个应用程序做一点修改,以使用Windows Messages或Shared Memory。
我用Windows消息10年前,对不起,我没有代码现在.
D在运行时会将一个窗口句柄(
WH
)作为命令参数发送给C。当C完成或由于任何其他原因,它会通过向WH
发送自定义消息来通知D。1.共享内存:
D在运行时会将共享内存的名称作为命令参数发送给C。
在这两种情况下,C都会将窗口句柄(
WH2
)发送回D,然后D会使用SetParent()
函数使D内的MyForm
成为该窗口WH2
的父窗口。当D从C获得通知消息告知它C将要关闭时,D将关闭
MyForm
。您也可以使用
GetWindowRect()
函数来获取WH 2的宽度和高度,以调整MyForm
大小。var r:TRect;