原则:单向调用,即A调用B,而B不调用A。窗体之间相互调用在结构上是愚蠢的。
一种简单的做法:
A.DoSomething;
begin
  B.Create;
  try
    B.Do(Parm);
  finally
    B.Free;
  end;
end;B.Do(var Parm :Type);
begin
  B.InitParm(Parm);
  if B.ShowModal = mrOK then 
   begin
     B.ProcessParm(Parm);
  end;
end;

解决方案 »

  1.   

    定义消息,使用 SendMessage 传递
      

  2.   

    我做个程序就是A中要显示B窗体,这里好像就要A调B,而B中要使用A的数据,那么B又要调A,这样不就成了互相调用了吗?有没有别的好方法楼上的兄弟我对说的消息传递很感兴趣,能不能写个例子
      

  3.   

    将uses 子句写在implementation 下
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses unit2;  ////////////////////////写入对B的调用
      

  4.   

    自定义消息
    const mymsg:=wm_user+100;(自定义消息范围 wm_user+100 到 $7fff)发送消息
    sendmessage(form1.handle,mymsg,0,0);捕获消息
    procedure wmmymsg(var selfmsg:tmessage); message mymsg;procedure wmmymsg(var selfmsg:tmessage);
    begin
    ...
    end;
      

  5.   

    消息传递听起来不错,不过我认为比较麻烦,而且效率不高。我认为你可以在TFormB中设置一些它需要的变量,这样在FormA创建FormB后,给这些变量赋值,就不会有互调的危险了。另外,如果FormB需要的数据是动态的,不能在事先赋,那么你可以在FormB中增加一个事件,比如叫OnRequireData:TRequireDataEvent = procedure ( Sender:TObject; const DataName: String; var Data: Variant );
    // DataName为数据的名称,Data为返回的数据,用Variant是为了兼容多种类型,你也可以只用String来表示TFormB = class(TForm)
    private
      ...
      FOnRequireData: TRequireDataEvent;  function RequireData( const DataName: String ): Variant;public
      property OnRequireData: TRequireDataEvent read FOnRequireData write FOnRequireData;end;function TFormB.RequireData( const DataName: String ): Variant;
    begin
      FOnRequireData( Self, DataName, Self );
    end;这样,在FormB中,如果需要FormA中的数据,只需调用RequireData方法即可。而FormA在创建FormB后给OnRequireData事件赋值。做成事件的一个好处是,如果由另外一个Form创建和调用TFormB,则它可以提供自己的数据供应方法,这体现一种多态性及它所带来的灵活性。事件和消息是类似的行为,不过事件则要灵活得多,因为消息只允许有两个整型参数(如果要传递其它类型,需要进行转换),而事件则根据你的具体系统的需要而定义。
      

  6.   

    这里谢谢大家了我还有一个小问题,就是TFormA调用TRormB后,这时如果关掉B就结束整个程序,那么得在B中TFormA.close,这样不就又调用了A吗,这不就又成了互调了,有没有别的方法解决
      

  7.   

    我也有同样的问题。我曾经试过将uses 子句写在implementation好像能成功,不过在FORMB中调用FORMB.CLOSE时,程序不能正常结束,只能把delphi关了才能,不知道为什么?
     
     
     
      

  8.   

    我想这位仁兄是不是和我一样 , 以前是用VFP 的。因为VFP里面经常在两个窗体中传参数的。
    我比较喜欢用窗体中的变量来达到相同的目的。
      

  9.   

    将uses 子句写在implementation 下——实现DELPHI应用程序内窗体(单元)间的相互交叉调用(没有任何问题)说明:DELPHI1-4好象说过交叉调用要特殊处理。就是指USES语句的位置。
    在DELPHI6下再测试,上述约束已经不复存在。