很简单的,两个窗体。
在form1窗体中单击按钮事件,并将值传递到form2,将执行查询结果显示在form2的相关控件里.
unit1单元文件相关程序:procedure TForm1.Button1Click(Sender: TObject); //button1是查询按钮begin        with adoquery2 do
        begin
            close;
            sql.Clear;
            sql.add('select 个人档案 from 人事信息表 where 员工编号=:a');
            parameters.ParamByName('a').Value:=ADOQuery1.FieldByName('员工编号').AsString;
            open;
        end; 
procedure TForm1.Button2Click(Sender: TObject); //button2 就是点击该按钮将值传递过去
begin
     form2.showmodal;
end;----------------
form2的代码:procedure TReadPDF.FormCreate(Sender: TObject);
begin
       with adoquery2 do
        begin
            close;
            sql.Clear;
            sql.add('select 个人档案 from 人事信息表 where 员工编号=:a');
            parameters.ParamByName('a').Value:=form1.ADOQuery1.FieldByName('员工编号').AsString;
            open;
        end; 
        if adoquery2.RecordCount>0 then
        begin
            edit1.text:=adoquery2.fieldbyname('个人档案').asstring;
        end;
end;这里就提示adoquery1 找不到员工编号字段!!
窗体单元文件已经引用。请高手指点!!一般一个窗体引用另外一个窗体的数据是 怎么处理的?

解决方案 »

  1.   

    不好意思,form1单元的代码是这样的:
    procedure TForm1.Button1Click(Sender: TObject); //button1是查询按钮begin        with adoquery1 do
            begin
                close;
                sql.Clear;
                sql.add('select 个人档案 from 人事信息表');
                open;
            end;
    end; 
    谢谢!!
      

  2.   

    建一个公共单元,把相关变量都放在这里
    对于数据集控件,都统一放在一个datamodule中.
    这样用起来比较方便
      

  3.   

    恩,楼上说的不错,共享数据组件应该放到datamodule里
      

  4.   


    我所有的数据集组件是放在datamodule里的,没错。
    我只是简单说明情况.
    procedure TForm1.Button1Click(Sender: TObject); //查询信息放到dbgrid中
    begin  With DataModule1.ADOQuery1 do
      begin
        Close;
        SQL.Clear;
        SQL.Add('Select * from hr');
        Open;
      end;
      if DataModule1.ADOQuery1.RecordCount>0 then //显示查询结果记录条数
      begin
         edit1.Text:=inttostr(DataModule1.ADOQuery1.RecordCount);
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);//按钮2单击打开form2
    begin
       form2.ShowModal;
    end;
    fom2 中的代码:procedure TForm2.FormCreate(Sender: TObject);
    begin
            edit1.text:=datamodule1.ADOQuery1.fieldbyname('empid').asstring;
    end;
    按照道理说,form1中打开数据集adoquery1的查询结果,应该没被关闭才是。。
    我在fom2中引用打开数据集的结果,为什么提示adoquery1中的empid 字段没有找到呢??
      

  5.   

    同意楼上,单步跟踪,看看adoquery1.sql.text里现在是什么
    因为公共的数据集不定哪里用到它了呢
      

  6.   

    真邪..其实我就用的两个ADOQuery控件..
    我这个例子本身就是用来测试的。我看了下。。
    在fom2中取在form1中已经打开的的adoquery1的时候..adoquery1里sql值为空...不解,关注!
      

  7.   

    代码有误,注意红色部分:
    unit1单元文件相关程序:
    procedure TForm1.Button1Click(Sender: TObject); //button1是查询按钮 begin         with adoquery1 do 
            begin 
                close; 
                sql.Clear
                sql.add('select 个人档案 from 人事信息表'); 
                open; 
            end; 
    end----------------
    form2的代码:procedure TReadPDF.FormCreate(Sender: TObject);
    begin
           with adoquery2 do
            begin
                close;
                sql.Clear;
                sql.add('select 个人档案 from 人事信息表 where 员工编号=:a');
                parameters.ParamByName('a').Value:=form1.ADOQuery1.FieldByName('员工编号').AsString;
                open;
            end; 
            if adoquery2.RecordCount>0 then
            begin
                edit1.text:=adoquery2.fieldbyname('个人档案').asstring;
            end;
    end;
      

  8.   

    对不起,看错了.
    1、是否在TForm2中引用了 Unit1 单元
    2、如果引用了,可以在Form1中添加一个隐藏的Label控件,让其Caption:= ADOQuery1.FieldByName('员工编号').AsString
    3、在 Form2 中: parameters.ParamByName('a').Value:=form1.Label1.Caption;
      

  9.   

    回楼主,肯定是你哪里代码写错了.
    我写了个简单的例子
    form1代码如下-------------一个edit1,两个按钮
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Edit1: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses Unit3, Unit2;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
     with DataModule2.adoquery1 do
     begin
      close;
      sql.Clear;
      sql.add('select * from xue where name1='''+edit1.text+'''');
      open;
     end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      if not assigned(form3) then
        form3 := TForm3.Create(application);
      form3.edit1.text := DataModule2.adoquery1.fields[0].asstring;
      form3.showmodal;
      form3.free;
      form3 := nil;
    end;end.form2为datamodule  一个adoconnection,两个adoqueryform3代码如下---------------------------------一个edit1
    unit Unit3;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm3 = class(TForm)
        Edit1: TEdit;
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form3: TForm3;implementation{$R *.dfm}end.
      

  10.   

    to ZXF_feng看了你的代码,我知道我的错误在什么地方..在button2的click事件中,先创建,窗体,再给窗体的edit传递值,然后再showmodal,这样就OK了.我之前是先fom2.showmodal,然后在fom2.formcreate事件中赋值给edit,就提示错误..这个可能是form2在创建时候自行进行了某些操作导致的,我有时间再研究下,谢谢你,很热心的。