用FORM.COMPONENTCOUNT的时候报错,哪位能给个合理的解释(100分)

  • 主题发起人 主题发起人 左右手
  • 开始时间 开始时间

左右手

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序里要遍历窗体中的控件,然后进行其他操作,但是当使用FORM.COMPONENTCOUNT时
却出现如下错误:Access violation at address 0041bc38 in moudle 'Project1.exe'.Read of address 00000010
使用窗体内的其他容器的COMPONENTCOUNT属性到是不出错,但是返回的值却都是零。
我做了个DEMO测试了一下,却发现用FORM.COMPONENTCOUNT时不出错,搞不懂是什么原因
哪位大虾能给个合理的解释。
 
说实话,我没有碰到过,我猜测是不是你的demo相对比较简单,而实际
使用的form中控件太多,或者你比较一下你这两个窗体的属性有什么不同,
也许是太多导致内存溢出,也许是某个属性有问题,也许是delphi的bug呢?
你用的delphi版本是多少?我有d5和d6,可以帮你试一下。
 
把代码贴出来了:
procedure TFrm_AddYG.GetPurview;//取得员工对应账套的权限
var
i:integer;
begin
if (DBCB_ZTMC.Text<>'') and (ADOTbl_YG.RecordCount >0) then
begin
ADOQuery1.Connection := Frm_Main.ADOConnection_Main;
ADOQuery1.SQL.Text := 'select * from 登录用户库 where 操作员ID=:EmID and 账套ID=:ZTID';
ADOQuery1.Parameters[0].Value := ADOTbl_YG.FieldValues['操作员ID'];
ADOQuery1.Parameters[1].Value := ADOQry_ZT.FieldValues['账套ID'];
ADOQuery1.Open;
if (ADOQuery1.RecordCount >0) and (ADOQuery1.FieldValues['权限']<>null) then
begin
SPurview := ADOQuery1.FieldValues['权限'];
for i:=0 to Frm_AddYG.ComponentCount-1 do //就在这里出错
begin
if Frm_AddYG.Components.ClassName='TCheckBox' then
if SPurview[(Frm_AddYG.Components as TCheckBox).Tag]='1' then
(Frm_AddYG.Components as TCheckBox).Checked := True
else (Frm_AddYG.Components as TCheckBox).Checked := False;
end;
end
else ClearCheck(-1);
end;
end;
 
TO:小猪
是用的D5并且已经加了所有补丁的
 
我又做了测试,把这个单元加到一个新的工程文件中,然后调用FORM.COMPONENTCOUNT时就
不会出错
 
没发现问题,可能是别的原因,你在仔细找找
 
会不会是因为有动态创建的控件,而无法判断COMPONENTCOUNT出的错呢
 
我看不出任何问题。
 
我也看不出有什么问题,但是它就是出问题,而且我做了一天的测试,只在这个程序里出错,
到别的程序里就不出错,可是我这个程序也没什么特别的呀,还请大虾们指教!
 
将Frm_AddYG.去掉,或者将Frm_AddYG.改为self.
 
试了一下,johnnywww的答案是对的,能不能给讲一下为什么?
 
发分了,已经明白了,因为我是单写了个过程来创建所有的窗体的,
这样创建后的Frm_AddYG根本就是一个空值,所以才会出问题
 
后退
顶部