我在一个form中定义了一个过程,在这个过程中需要用到该form的控件,在过程中就写类似下面的语句使用控件:form名.控件名,可是程序一运行到这里就出现错误了,我这个form是一个子form,是通过其他主form动态创建的,请教一下各位高手,这个问题该如何解决呢???
解决方案 »
- 昨天开贴没问出答案,今天再来开一贴. 关于这类项目管理类软件如何做?
- 请教DELPHI的adocconnection和adoquery控件连接数据库的用法,有教程或网站最好
- 请问DBGRID中的picklist怎么用?
- 怎样关闭StringGrid的高亮(蓝色)显示
- 烦恼中,散分。大伙给点建议
- 用Web App Debugger类型写的程序如何放到IIS上?
- goomoo(古木) 來來拿分
- 怎样把dbgrid中的数据一次性全部导入到excel表格中??
- 如何在制作DLL中连接数据库
- 请教利用SQL动态创建Access数据库,SQL的具体实现的问题!
- 来北京都有半个月了,还没有找到工作,只好到上面请大家帮忙
- 如何实现MDI子窗体间的融合(Dock)
例:设计时
type
TForm2 = class(TForm)
end;
var
Form2: TForm2;
...............
在主窗体动态创建时:
begin
Form2:=Tform2.create(Application);
Form2.show;
end;这两个form2不是想象中的一样。
可以把动态创建的子form看成是设计时窗体类的继承。
Uses 窗体单元名?
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]
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;
procedure Tmainform.N30Click(Sender: TObject);
//var achild:tfm_foffer; 这句不用
begin
//achild:=Tfm_foffer.create(Application);
fm_foffer:= Tfm_foffer.create(Application);
end;
如果你的工程中某个窗体只有一个实例,不会出问题,但像你说的动态创建多个实例就会出问题,因为你在类中定死了某一个实例,像
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;