我在一个form中定义了一个过程,在这个过程中需要用到该form的控件,在过程中就写类似下面的语句使用控件:form名.控件名,可是程序一运行到这里就出现错误了,我这个form是一个子form,是通过其他主form动态创建的,请教一下各位高手,这个问题该如何解决呢???

解决方案 »

  1.   

    form名.控件名 改为: self.控件名 或者直接用控件名
      

  2.   

    因为你动态创建的子窗体只是你设计时看到的子窗体类的一个实例。
    例:设计时
    type
      TForm2 = class(TForm)
    end;
    var
      Form2: TForm2;
    ...............
    在主窗体动态创建时:
    begin
      Form2:=Tform2.create(Application);
      Form2.show;
    end;这两个form2不是想象中的一样。
    可以把动态创建的子form看成是设计时窗体类的继承。
      

  3.   

    写没写
     Uses 窗体单元名?
      

  4.   

    是自己定义的过程吗?那你过程的参数肯定有了,比如:
    procedure TFrm_GoodsAdd.EditChange(d1: TDataSet;c1,c2: TWinControl);
    var
      str1,str2,str3:String;
    begin
      c1.Visible:=false;
      d1.Filtered:=false;
      if (c2 as TEdit).Text='' then
         d1.Filter:=''
      else
        d1.Filter:='SuoXie like '''+(c2 as TEdit).Text+'%''';
      d1.Filtered:=true;
      if d1.RecordCount>0 then
        c1.Visible:=true;
      (c1 as TListBox).Items.Clear;
      while not d1.Eof do
      begin
        str1:=d1.FieldValues['SuoXie'];
        str2:=':';
        while length(str1)+length(str2)<10 do
          str2:=' '+str2;
          str3:=d1.FieldValues['MingC'];
          (c1 as TListBox).Items.Add(str1+str2+str3);
          d1.Next;
      end;
      (c1 as TListBox).ItemIndex:=0;
    end;
    这样是吗?这是我自己定义的一个过程?你可以看看!!!
    有问题请发信息到我的E-mail:[email protected]
      

  5.   

    这是我的源程序
    unit moboffer;
    interface
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids, DBGrids, DB, DBTables, StdCtrls, ComCtrls, CheckLst;
    type
        Tfm_foffer = class(TForm)
        ComboBox1: TComboBox;
        Label4: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure FormShow(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      fm_foffer: Tfm_foffer;implementationuses offeryl;
    {$R *.dfm}procedure mobofferfind();
    begin
    if  (fm_foffer.ComboBox1.Text='') or (fm_foffer.ComboBox1.Text='全部') then  begin
     .....
    end;procedure Tfm_foffer.Button1Click(Sender: TObject);
    begin
    mobofferfind();
    end;
    ...
    end.
    这个form的名字为fm_foffer,formstyle是fsMDIChild,这个form是通过下面语句从一个菜单生成的:
    procedure Tmainform.N30Click(Sender: TObject);
    var achild:tfm_foffer;
    begin
    achild:=Tfm_foffer.create(Application);
    end;
      

  6.   

    //试试再MainForm中 uses 这个fm_foffer
    procedure Tmainform.N30Click(Sender: TObject);
    //var achild:tfm_foffer;  这句不用
    begin
    //achild:=Tfm_foffer.create(Application);
      fm_foffer:= Tfm_foffer.create(Application);
    end;
      

  7.   

    如果主form中不能更改的话,该如何在子form中修改才能实现呢?
      

  8.   

    fancier(OP&&(C/C++)) 的方法可以,但是为什么原来的语句不行呢??
      

  9.   

    在类中要避免用类的实例名引用类的任何方法,属性及事件,因为类可以有多个实例!
    如果你的工程中某个窗体只有一个实例,不会出问题,但像你说的动态创建多个实例就会出问题,因为你在类中定死了某一个实例,像
    var
      Form1:TForm1;
    这一般是DELPHI自己加上去的,所以在这个单元中的实现部分任何引用类实例名的方法都不会出错,像
      Form1.Edit1.Text:='';
    这样的方法,虽然看起来没问题,但如果实例不是Form1,问题就来了.应该改成
      Self.Edit1.Text:='';

      Edit1.Text:='';如果你要动态生成某个窗体类,为了避免这种情况,应该把DELPHI自动加上的这段代码去除:
    var
      Form1:TForm1;
    这样如果在某个地方引用了类实例就会编译出错,而在要自动生成的地方定义一个实例:
    procedure a
    var
      frmTemp:TForm1;
    begin
      frmTemp:=TForm1.Create(Application);
      try
        frmTemp.ShowModal;
      except
        frmTemp.Free;
      end;
    end;
    如果你以后不要引用此实例,则可以这样
    procedure b
    begin
      with TForm1.Create(Application) do
      try
        ShowModal;
      except
        Free;
      end;
    end;