abstract错误是什么样的错误呀? 帮帮我呀 (50分)

  • 主题发起人 主题发起人 xuaner
  • 开始时间 开始时间
X

xuaner

Unregistered / Unconfirmed
GUEST, unregistred user!
我在主窗口的N1菜单上create 一个窗口,application.createform(tform1,form1);
在form1的exitbutt中写上form1.release;
当我循环点击n1,和exitbutt时就会出现上述的错误提示:abstract错误,这是怎么回事呀?
如何解决?(有时是出现访问错误的提示。)
(mainform为mdiform,form1为mdichild form.)
 
abstract是虚方法错误(意思是你调用的方法没有被重载),应改为:
if form1<>nil then
form.close;
 
如上所说我试了,还是不行。源码如下:
procedure Tmainf.N2Click(Sender: TObject);
var
existflag:boolean;
i:integer;
begin
if not assigned(moinf) then begin
moinf:=tmoinf.create(self);
moinf.show;
end else moinf.BringToFront ;
end;
在moinf.button1.onclick中 if moinf<>nil then
moinf.release;
点击主窗体菜单上N2项,然后在产生的窗口上click button,再去点击N2再产生moinf时
就出错!
然后修改如下:
procedure Tmainf.N2Click(Sender: TObject);
var
existflag:boolean;
i:integer;
begin
existflag:=false;
For i:=0 To Screen.FormCount-1 Do
Begin
If UpperCase(Screen.Forms.Name)=UpperCase('moinf') Then
Begin
existflag:=True;
Exit;
End;
End;
if existflag=True then begin **
moinf.BringToFront ;
end else begin
moinf:=tmoinf.create(application);
moinf.top:=0;
moinf.Left:=0;
moinf.show;
end;
end;
不会出错了,但是编绎时却说existflag已赋值但从没应用过! 也就是说程序执行到**
处就不会往下执行了。相应的表单也不会放置到最前面。我将上述判断窗口是否存在
写成函数
function findform(cs:string):boolean;
var
i:integer;
begin
result:=false;
For i:=0 To Screen.FormCount-1 Do
Begin
If UpperCase(Screen.Forms.Name)=UpperCase(cs) Then
Begin
result:=True;
Exit;
End;
End;
ENd;
再在N2CLICK中调用
if findform('moinf') then ...
却会出错。真是不解。哪位高手教我?分不够可以再给。
 
直接用form1.close;-
 
不要用application.createform(tform1,form1);创造一个窗口这是应用程序自动创造的;
而TFORM1.create(self);而form1.free;form1:=nil;关闭窗口;
 
borland不推荐用release。
 
在moinf.button1.onclick中 if moinf<>nil then
begin
moinf.release;
moinf := nil;
end 或者直接一句freeandnil(moinf), 然后就不出错了
 
按各位所说我解决了问题,万分感激。但我还有三件事情不明白:1、判断一个窗口存不存在
用screen对象的上述方法非得要在每个菜单项上写吗?写成函数再调用为何会不行
2、为何会执行到**处就不再执行下去了呢?3、为何用screen对象做一个循环判断窗口
存在时再bringtofront没有反应而用not assign(窗口名)判断窗口存在时却可以将已存在
的窗口移到最前呢?
再次感谢!

 
多人接受答案了。
 
你的问题所在:
If UpperCase(Screen.Forms.Name)=UpperCase('moinf') Then
Begin
existflag:=True;//这一句已赋值
Exit;//这一句已退出;所以提示已赋值,未使用(应该用Break)
End;
if existflag=True then begin **//这一句根本不会执行,因为existflag永远为假
moinf.BringToFront ;
 
后退
顶部