DELPHI中如何调用FROM

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DELPHI中如何调用FROM相关的知识,希望对你有一定的参考价值。

我建了一个FORM请问unit1.pas存的是什么,我在这个FORM中建了一个按钮,用什么事件可以调用另一个FORM
比如两个表一个是FORM1,另一个FORM2
试过后如果正确追加
我试了下两位的做法,但是运行FORM1的时候FORM自己就运行了,看不到FORM1了,怎么了,我是想在FORM1的里的一个按钮来实现调用FORM2

另外怎么将两个表放到一个PROJECT里啊,怎么确定位置,不太明白,最好可以提供一下你们的QQ

1。form1 对应的窗体文件form1.dfm,单元文件unit1.pas.
form2 对应的窗体文件form2.dfm,单元文件unit2.pas.

2。在unit1.pas的uses 中增加一个unit2.例如:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2;

3。双击按钮,编写如下代码: form2.show.

即可
参考技术A 50462223

如何在 Visual C++ 中使用 Delphi 的寄存器调用约定调用函数?

【中文标题】如何在 Visual C++ 中使用 Delphi 的寄存器调用约定调用函数?【英文标题】:How to call a function using Delphi's register calling conventions from Visual C++? 【发布时间】:2013-03-11 15:06:30 【问题描述】:

我有一个用 Visual C++ 2012 编写的程序,我试图调用一个用 Delphi 编写的函数(我没有源代码)。下面是 Visual C++ 中的代码:

int (_fastcall *test)(void*) = (int(_fastcall *)(void*))0x00489A7D;

test((void *)0x12345678);

但在编译后的代码中它实际上是:

.text:1000113B                 mov     eax, 489A7Dh
.text:10001140                 mov     ecx, 12345678h
.text:10001145                 call    eax

我所例外的是:

.text:1000113B                 mov     ebx, 489A7Dh
.text:10001140                 mov     eax, 12345678h
.text:10001145                 call    ebx

我知道“fastcall”使用 EAX、ECX、EDX 作为参数,但我不知道为什么 Visual C++ 编译器使用 EAX 作为入口点。 EAX不应该是第一个参数(12345678h)吗?

我尝试在汇编代码中调用 delphi 函数并且它可以工作,但我真的很想知道如何在不使用汇编的情况下做到这一点。

那么是否可以让 Visual C++ 编译器生成我所例外的代码?如果是,该怎么做?

【问题讨论】:

msdn.microsoft.com/en-us/library/6xa169sk.aspx 好像根本不谈eax 我认为您需要将它与另一个封装原始但使用 _stdcall 公开的 Delphi 函数桥接。 @DavidHeffernan 我指的是 en.wikipedia.org/wiki/X86_calling_conventions ,我看到有多个约定称为“fastcall”,所以我称之为“pascal”。我修改了标题。很抱歉给您带来不便。 @PlasmaHH 是的,微软的 fastcall 与 EAX 无关。我想做的是 Borland/Embarcadero 的快速呼叫。不知道有没有可能 @MickeyShine:所以当你知道 ms fastcall 不是你想要的,你为什么期望它表现得像你想要的那样? 【参考方案1】:

Delphi 的 register 调用约定,也称为 Borland fastcall,在 x86 上按此顺序使用 EAX, EDX and ECX registers。

但是,Microsoft 的 fastcall 调用约定使用不同的寄存器。它根本不使用 EAX。相反,它使用 ECX 和 EDX 寄存器作为前两个参数,如 described by the documentation。

因此,有了这些信息,您可能可以编写一些汇编程序来从 C++ 调用 Delphi register 函数,方法是将参数移动到 EAX 寄存器中。然而,让 Delphi 编译器来做这件事会容易得多。尤其是当我认为您的真正问题涉及多个函数和多个参数时。

我建议你编写一些 Pascal 代码来适应 stdcallregister

function FuncRegister(param: Pointer): Integer; register; external '...';

function FuncStdcall(param: Pointer): Integer; stdcall;
begin
  Result := FuncRegister(param);
end;

exports
  FuncStdcall;

然后你可以在你的 C++ 代码中调用FuncStdcall 并让 Delphi 编译器处理参数传递。

【讨论】:

酷。但是我不是delphi的专业人士,我会花一些时间尝试按照您所说的进行。谢谢

以上是关于DELPHI中如何调用FROM的主要内容,如果未能解决你的问题,请参考以下文章

请问如何在delphi from窗体内加网页

delphi如何关闭启动窗体

delphi如何固定from1窗口大小?

delphi如何调用DLL

如何从 Delphi 调用 Oracle 函数?

如何在 Delphi 中调试从 Java 调用的 DLL?