如何获得类是否存在(100分)

  • 主题发起人 主题发起人 sess
  • 开始时间 开始时间
S

sess

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获得类是否存在:
我想动态建立几个TEDIT类,名称假如为EDIT1,EDIT2,EDIT3,我如何判断我已经建立了EDIT1而不重复再CREATE一次呢?
 
try
edit.Destroy

except
on EAccessViolation do
showmessage('不存在')
//这个类没有被创建然后你就可建立它了
end;
 
我的edit1.....是变量,string型
 
使用DELPHI中的is来判断,如:
if not (Edit1 is TEdit) then
begin
Edit1:=TEdit.Create(nil);
end;
//ok
 
这样吧:

If not Assigned(Edit1) then
Edit1 := TEdit.Create(xxx)
xxx根据需要确定

如果是你在第二次贴贴子上说的,是STRING,则不存在动态建立几个
STRING的情况。


 
我得edit1其实是ss:='Edit1';
 
概念有问题吧:

〖我得edit1其实是ss:='Edit1'〗

ss := 'Edit1'是个STRING,EDIT1如果是从TEDIT.Create出来的,那它爸爸
就是TEDIT.

这两个东西(SS和EDIT1)就象是标语和羊,没任何关系。

请您说清楚您的问题。


 
以来一个
var
i: integer;
edit0, edit1, edit2: string;
begin
for i := 0 to 2 do try
TEdit('edit' + inttostr(i)).Destroy;
except
on EAccessViolation do
showmessage('不存在')
//这个类没有被创建然后你就可建立它了
end;

to 歪就歪:
>> If not Assigned(Edit1) then
>> Edit1 := TEdit.Create(xxx)
xxx根据需要确定
if not assigned(edit1) then
showmessage('dddd')
不管edit1已建立或未建立都不执行这句.



 
我把问题说得更透一些,我在FORM上有个EDIT和BUTTON,在BUTTON CLICK中,
我想根据EDIT.TEXT内容再建立一个名字为EDIT.TEXT的TEdit控件,可以吗?
 
FUDEI:

震惊之余,打开DELPHI5,试了,没问题啊,怎么回事?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Edit1: TEdit;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
if not assigned(edit1) then
showmessage('dddd')
else
showmessage('Create');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit1 := TEdit.Create(Form1);
end;

end.
 
sess:
可以,试试:

var YourCreateEdit : TEdit;

for i:= 0 to ComponentCount-1 do begin
if Components is TEdit then begin
if TEdit(Components).Name := YourInputEdit.Text then
showmessage(YourInputEdit.TExt+' has already created')
else begin
YourCreateEdit := TEdit.Create(YourForm);
YourCreateEdit.Name := YourInputEdit.Text;
YourCreateEdit.Parent := YourForm;
end;
end;
end;

代码未经测试,但基本如此。原理是,在FORM上找到所有EDIT的控件,
检查它的名字是否与你要生成的名字相同,如果没有,就CREATE一个

但记住,由于你只有这新生产的EDIT的名字,而保存这EDIT的指针的
地方只有一个,也就是YourCreateEdit,在你要生产多个EDIT时,要
小心把前面生成的EDIT的指针给保存起来,以便FREE。



 
to 歪就歪:
我用的是delphi4
var
d: pchar;
begin
// d:=nil;
if Assigned(d) then
showmessage('ddddd');
这段代码我在delphi4下正常显示了

to sess:
FORM上的EDIT和BUTTON, button事件如下:
var
ed: tedit;
begin
ed:=tedit.create(form);
ed.parent:=self;
ed.Left :=50
ed.Top :=50;
ed.name:=EDIT.text

end;


 
FUDEI:
您说的PCHAR。他问的EDIT,请分清楚。

而且,就是个PCHAR,恐怕你自己都很明白的,要把那NIL给注释掉。
 
这个问题我再引申说一下,比如我定义一个animal的类,他应该是从最顶层继承的
,这样就不可能在FORM里找到,我在FORM上有一个EDIT和BUTTON,EDIT.TEXT中的
内容是ANIMAL的实例,即我输入一个CAT,按BUTTON 就帮我建一个cat的 TAnimal类
输入一个Dog,按BUTTON 就帮我建一个Dog的 TAnimal类,如果CAT 或DOG存在,就不建立。可以吗?
 
补充:不在form里,意思是说用component之类的找到,另外,我想问一下findcompontent是怎样用的。
 
歪就歪:
我把你上面那大段试过,确实正确.
但我又试你的第一个贴了,
If not Assigned(Edit1) then
Edit1 := TEdit.Create(xxx)
xxx根据需要确定
还是不正常显示,
我已找出原因了: 我的edit变量是放在button事件中的是局部变量,
而你那大段中的edit变量是放在form中的是窗体变量。

BTW:请教歪兄未何同一段代码, 使用局部和窗体变量会有两种效果呢?


 
补充:不在form里,意思是说用component之类的找bu到,另外,我想问一下findcompontent是怎样用的。
 
function FindComponent(const AName: string): TComponent;
函数返回名为AName的控件
 
SESS:

唉,老兄,就这点问题把人累死。我有点怀疑你是否明白类和实例的关系。

ANIMAL的实例,永远就是ANIMAL,而不是CAT,你要CAT,你就要从ANIMAL里
继承一个叫CAT的类。如果象你前文所说,要生成一个〖名字〗叫CAT的ANIMAL
类,那么:

请您在建立每一个ANIMAI的实例时,不管它是猪、牛、马、猫,都请把它
的指针保存起来

TAnimal := Class
.....定义你的ANIMAL

var
MyObjectList: TList
/
procedure TForm1.Create...
begin
MyObjectList := TList.Create
end

procedure TForm1.Destory...
var i: integer;
begin
if MyObjectList.Count <> 0 then begin
for i := 0 to MyObjectList.Count-1 do begin
if Assigned(TAnimal(MyObjectList)) then begin
TAnimail(MyOjbectList).Free;
MyObjectList := nil;
end;
end

MyObjectList.Free;
end

var aWhatEverAnimal: TAnimal;

procedure btnCreateAnimalClick(...);
var i: integer
AlreadyHave : Boolean;
begin
//检查是否有个叫CAT的ANIMAL类
AlreadyHave := False;

if MyObjectList.Count <>0 then begin
for i:= 0 to MyObjectList.Count-1 do begin
TAnimal(MyObjectList).Name = YourINputEdit.Text then
AlreadyHave := True;
end;
end;

if not AlreadyHave then begin
aWhatEverAnimal := TAnimal.Create;
aWhatEverAnimal.Name := YourInputEdit.Text;
MyOjbectList.Add(aWhatEverAnimal);
end
else
ShowMessage('Oh, my God, you can not have more than 1 '+ YourInputEdit.Text;


end;
 
后退
顶部