提示非法访问,帮我看看!

Storm2008 2009-02-19 07:56:55


procedure TfrmSetup.btnOKClick(Sender: TObject);
var
i, j : Integer;
cbArray : Array[0..11] of TComboBox;
begin


for i := 0 to 11 do
begin
for j := i to 11 do
begin
if (cbArray[i].Text = cbArray[j].Text) and (i<>j) then
begin
MessageBox(self.Handle, #10#13+' ',
'提示', MB_OK+MB_ICONWARNING+MB_APPLMODAL);
self.pcSetup.ActivePageIndex := 4;
Exit;
end;
end;
end;

ModalResult := mrOk;

end;




frmSetup是动态创建以模态窗体显示出来的,当把self换成frmSetup的时候,老是提示非法访问,请帮我看看为什么。
单位要写个测试程序,平时程序写得少,写起来满费劲的。
谢谢各位。
...全文
278 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
火龙岛主 2009-02-20
  • 打赏
  • 举报
回复
self变量表示对象(实例)本身,无论你类的实例是谁,他都可以代表。
如果你使用frmSetup变量,那么就限制了当前方法只能在frmSetup变量中使用,否则一旦你的
实例发生了变化,就会产生非法或者意想不到的问题。
yct0605 2009-02-20
  • 打赏
  • 举报
回复
来看看了
bdmh 2009-02-20
  • 打赏
  • 举报
回复
TfrmSetup的实例名已经发生改变,所以不能直接引用,应该声明一个TfrmSetup的变量,访问这个变量
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
谢谢各位!
ahjoe 2009-02-19
  • 打赏
  • 举报
回复
类变量只是声明一下是不能用的。
starluck 2009-02-19
  • 打赏
  • 举报
回复

就是说并没有给frmSetup赋值,frmSetup是nil, 此时frmSetup和类名TfrmSetup没有任何关系,frmSetup也不是TfrmSetup的实例
如果声明
var
frmSetup :TfrmSetup;
在调用那条语句就没问题了。


//这里只能看出来 frmsetup 是声明成 TfrmSetup类的一个变量。

需要 frmSetup := TfrmSetup.create(..) 这样才会有对 TfrmSetup的实例的引用,才能访问这个类里的东西。呵呵
de410 2009-02-19
  • 打赏
  • 举报
回复
呵呵~~问题解决了~~来晚了~~
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Seamour 的回复:]
你什么时候给frmSetup赋过值了么?如果没给过值的话,frmSetup就是nil,不错就怪了
[/Quote]


[Quote=引用 5 楼 starluck 的回复:]
frmSetup 是声明成 TfrmSetup 的一个变量


Delphi(Pascal) code

Function SetupPara : Boolean;
var
sFileName : String;

iniSetup : TIniFile;
frm : TfrmSetup;
begin
frm := TfrmSetup.Create(Application);
Result := (frm.ShowModal=mrOK);
if Result then




而这里TfrmSetup 类生成的实例是由 frm 来引用的, 现在 frmSetup 没有与任何 TfrmSetup 的实例有关系,
你那样写肯…
[/Quote]


就是说并没有给frmSetup赋值,frmSetup是nil, 此时frmSetup和类名TfrmSetup没有任何关系,frmSetup也不是TfrmSetup的实例
如果声明
var
frmSetup :TfrmSetup;
在调用那条语句就没问题了。


不过有时候对self到底代表的是什么还是不清楚。


谢谢两位~
让我又明白了一些~
starluck 2009-02-19
  • 打赏
  • 举报
回复


Function SetupPara : Boolean;
var
sFileName : String;

iniSetup : TIniFile;
frm : TfrmSetup;
begin
frm := TfrmSetup.Create(Application);
frmSetup := frm; //这样操作一下,即将 frmsetup 与 frm 一样指向了同一个TfrmSetup类生成的实例,那么你的那个代码就不会出错了。 反正一句话 frmSetup 只是一个变量,没有赋值给它,你那样他也不知道去访问什么地方了。 呵呵.
Result := (frm.ShowModal=mrOK);
if Result then



starluck 2009-02-19
  • 打赏
  • 举报
回复
frmSetup 是声明成 TfrmSetup 的一个变量



Function SetupPara : Boolean;
var
sFileName : String;

iniSetup : TIniFile;
frm : TfrmSetup;
begin
frm := TfrmSetup.Create(Application);
Result := (frm.ShowModal=mrOK);
if Result then




而这里TfrmSetup 类生成的实例是由 frm 来引用的, 现在 frmSetup 没有与任何 TfrmSetup 的实例有关系,
你那样写肯定会出错的。
Seamour 2009-02-19
  • 打赏
  • 举报
回复
你什么时候给frmSetup赋过值了么?如果没给过值的话,frmSetup就是nil,不错就怪了
Storm2008 2009-02-19
  • 打赏
  • 举报
回复
Function SetupPara : Boolean;
var
sFileName : String;

iniSetup : TIniFile;
frm : TfrmSetup;
begin
frm := TfrmSetup.Create(Application);
Result := (frm.ShowModal=mrOK);
if Result then


这是调用的部分




cbArray 里的对象都创建了,我把那部分代码删了。
问题就出在self的位置上,换成frmSetup就提示错误。
我原以为这部分代码是在procedure TfrmSetup.btnOKClick(Sender: TObject)中,messgebox显示在frmSetup的上面,用frmSetup是正常的,后来试了两次不行,就改成self了。
不过原理还是搞不清楚,平时看的资料太少



starluck 2009-02-19
  • 打赏
  • 举报
回复


procedure TfrmSetup.btnOKClick(Sender: TObject);
var
i, j : Integer;
cbArray : Array[0..11] of TComboBox;
begin


for i := 0 to 11 do
begin
for j := i to 11 do
begin
if (cbArray[i].Text = cbArray[j].Text) and (i<>j) then
begin
MessageBox(self.Handle, #10#13+' ',
'提示', MB_OK+MB_ICONWARNING+MB_APPLMODAL);
self.pcSetup.ActivePageIndex := 4;
Exit;
end;
end;
end;

ModalResult := mrOk;

end;


cbArray 里的对象是从别的地方传过来的还是?
如果不是传过来的,还没有实例哦?



当把self换成frmSetup的时候,老是提示非法访问,请帮我看看为什么。

你不是这样创建的吧? frmsetup := TfrmSetup.create(..).
从OOP来讲,应该用SELF才合理。呵呵
Seamour 2009-02-19
  • 打赏
  • 举报
回复
你的cbArray都创建对象了么?
frmSetup又是怎么建立的?frmSetup:=TfrmSetup.Create(Application)?

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧