很郁闷,老是对类、实例摸不着头(100分)

  • 主题发起人 主题发起人 jobsxy
  • 开始时间 开始时间
J

jobsxy

Unregistered / Unconfirmed
GUEST, unregistred user!
原程序:

//菜单项一
procedure Tform1.menuclick1(Sender: TObject);
begin
defproc(TFrmAlarmInfo);
end;
//菜单项二
procedure Tform1.menuclick2(Sender: TObject);
begin
defproc(TFrmMove);
end;
....

//公共过程,用于判断此类实例是否已经运行,是则显示,否则创建
procedure TFr_MenuTree.defproc(MyForm:TFormclass);
var
i: integer;
abc: TForm;
begin
For i := 0 To application.ComponentCount-1 do begin
if Uppercase(application.Components.ClassName)=Uppercase(Myform.ClassName) then begin
TForm(MyForm).Show;
Exit;
end;
end;
abc := MyForm.Create(Application);
abc.ManualDock(Fr_main.Panel3,nil,alNone);
abc.show;
end;

现在的问题是,如果我判断这个类不存在,则创建并显示,这一步没问题,但如果判断有此类,那我如何让此类的实例SHOW出来呢?
 
这一句改为如下试试
(application.Components as MyForm).Show;
 
我刚才试了一下,你的代码能显示出来呀,我这样实验的,不知是否符合你的意图

implementation
uses
unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
For i := 0 To application.ComponentCount-1 do
if Uppercase(application.Components.ClassName)=Uppercase(form2.ClassName) then
TForm(form2).Show;
end;
 
if Uppercase(application.Components.ClassName)=Uppercase(Myform.ClassName) then begin
TForm(MyForm).Show;
Exit;
这一段不就是有此类的实例就SHOW出来吗?
 
to lichaogang:按你的提示改了以后就正确了。

能否帮我解释一下:
(application.Components as MyForm).Show;

TForm(MyForm).Show;

有什么区别吗?
 
as 是 类的类型强制转换符
 
你的问题问的是什么?类与类的实例。
那么我告诉你这就是类与类实例的关系。你可以这样理解,类只是定义一个模板,只是定义一些规范,而它的实例才是在内存中存在的对象,才是一个可以操作的实体。(类是一个类型,实例是一个变量,沿用以前的说法,是否好理解一些?)
application.Components---一个对象,一个实例。
MyForm-----只是一个类

 
for I:=0 to Screen.FormCount-1 do
if Screen.Forms.ClassType is //你的类名 then
你的类名(Screen.Forms).Show;
 
多人接受答案了。
 
后退
顶部