是呀,不用临时变量,使用GetComponentFromName这样的自写函数也可以实现,我只是觉得应该有类似于VC中This的做法,看来Self是不行了。
解决方案 »
- GetSystemInfo得到的CPU数量为什么是3个
- FileExists,GetFileAttributes
- 散分啦
- 请问这个问题如何解决!急急急!
- 我要导入的文本段的开始标志如下,其中07403十分重要,它是与其它文本段的开始标志相区别的唯一特征:
- 我现在想问问,为什么会出现黑色背景!?
- 国庆Delphi版的朋友也不能闲着呀!我们也聚会呀!(当然PLMM越多越好)!
- 如何取得一个目录内的所有文件和目录,并删除它们?
- 各位评评,有这种事吗???我公司派我去深圳出差叫我自己掏钱负担车费、生活住宿费,然后回来报销!
- 小问题,怎么连接三个或者多个表呀,他们都有ID字段,用SQL,马上给分
- 断开数据库连接
- Delphi程序员学习面向对象程序设计时须看C++的书才行!
请执教确实不太明白,请一定赐教
但我不推荐这种做法,在With之外你是无法对Create出来的TEdit进行引用的,
因为没有存在引用这个对象的指针!With TEdit.Create(frmMain) Do
//这样的话代码段里什么都不加就是对Create出来的东东操作
Begin
Left := 20;
Top := 30;
Width := 200;
Parent:= FrmMain;
Text := 'Hello'
Show;
End;
他们是应该用在class的方法(函数)定义当中的,表示调用此方法的那个对象。
跟你说的完全是两码事!
begin
font.color:=clRed;
text:='sdfgjdsg';
........
end;
因为这些空间都是动态生成的,没有办法实现定义好变量名(当然也可以采用预定义控件数组的形式),另外什么都不加,外面的值直接赋进来当然是没有问题,关键是我要付出去TEdit.Create(frmMain) 本身,而且我主要是想知道TEdit.Create(frmMain) 在它本身的with事件中能否表示,如何表示。
to jeaking(空空)
按照您的意思,在我对一个类进行创建的时候,除了用它的name之外,无法采用别的表示形式了?当然我知道在类本身定义的方法事件函数中都可以使用self。
to iBear(大熊)
呵呵。下面是我的代码:to all:
type
FormParams=record
Width:integer;
Height:integer;
XSpace:integer;
YSpace:integer;
ComponentCount:integer;
LeftTop:TPoint;
lstCompLeftTop:TPoint;
CurCompLeftTop:TPoint;
LastRightButtom:Tpoint;
LastLabel:TLabel;
end;
const
LONGRULER=25;
var
Fp:FormParams; function CreateComp_TEdit:boolean;
begin
CreateComp_TLabel;
with TEdit.Create(frmTemp) do
begin
Parent:=frmTemp.BasePanel^;
Top:=Fp.CurCompLeftTop.Y;
Left:=Fp.CurCompLeftTop.X+Fp.XSpace;
Name:='edt'+MyDocBody[i].FieldName;
Enabled:=True;
Fp.LastLabel.FocusControl:=self;//注意,关键是这一句!!
Width:=Font.Size*MyDocBody[i].FieldLength+5;
InCreaseState(Height,Width);
//OnClick:=AreaChkClick;
end;
end;
VC我是将近4年前学了一段时间,我记得可以用this::这种形式,不知道是不是,很久了,而且当时学的也不好。
FormParams=record
Width:integer;
Height:integer;
XSpace:integer;
YSpace:integer;
ComponentCount:integer;
LeftTop:TPoint;
lstCompLeftTop:TPoint;
CurCompLeftTop:TPoint;
LastRightButtom:Tpoint;
LastLabel:TLabel;
end;
const
LONGRULER=25;
var
Fp:FormParams; function CreateComp_TEdit:boolean;
begin
CreateComp_TLabel; tempEdit : TEdit;
tempEdit = TEdit.Create(frmTemp); with tempEdit do
begin
Parent:=frmTemp.BasePanel^;
Top:=Fp.CurCompLeftTop.Y;
Left:=Fp.CurCompLeftTop.X+Fp.XSpace;
Name:='edt'+MyDocBody[i].FieldName;
Enabled:=True;
Fp.LastLabel.FocusControl:=tempEdit ;//注意,关键是这一句!!
Width:=Font.Size*MyDocBody[i].FieldLength+5;
InCreaseState(Height,Width);
//OnClick:=AreaChkClick;
end;
end;
这样不是很好么,你到底想要干什么啊?不明白!!
既然没有Name,我们可以用Components的Index来引用。procedure TForm1.Button1Click(Sender: TObject);
var
iCreateEditID: Integer;
begin
With TEdit.Create(Self) Do
Begin
Left := 20;
Top := 30;
Width := 200;
Parent:= Self;
Text := 'Hello';
Show;
iCreateEditID := ComponentIndex;
ShowMessage(IntToStr(iCreateEditID));
(Self.Components[iCreateEditID] as TEdit).Text := '123';
End;
end;你明白了吗?:)
用!我程序的目的是根据一个配置文件,生成显示窗体及其上面的控件,因为是动态生成的所以名字是不会事先得知的。对控件的操作有统一的处理函数进行挂接,另外我的控件其命名规则也是有矩可循的。
Name := 'EditNo1';
ShowMessage(Self.Components[Self.ComponentCount - 1].Name);
finally
Free;
end;
with TEdit.Create(nil) do try
Parent := Self;
Name := 'EditNo2';
ShowMessage(Self.Controls[Self.ControlCount - 1].Name);
finally
Free;
end;
GetMem(MyEdit,sizeof(Tedit));
MyEdit^:=(TEdit.Create(form1));
再用 with myedit^ do呢
你的self其实是TEdit所在Form。对于Unit(无frm)无法编译。to qiubolecn(来自差生市)&&jeaking(空空)
我想在With XXX do的情况下,大部分的操作再不指定前缀的时候,默认都是对当前with的对象的,我想应该delphi对此有一种表述,类似于self一样,这样的话,程序编写会简单很多。看来是不行,结贴。谢谢大家参与
不过能够解决我程序中的问题,谢谢。
p:^TEdit这样的定义是没什么意义的