求才解惑(100)

  • 主题发起人 主题发起人 wxl2009
  • 开始时间 开始时间
W

wxl2009

Unregistered / Unconfirmed
GUEST, unregistred user!
我在編程時總是遇到 access violation at address 這個問題,可是在使用第一次的時候是沒有問題的,再用第二次就會出現這個問題。
 
访问内存地址权限的问题.是否越界,是否读写已经释放的内容?
 
有没有可能是你引用的某个变量可能被释放了,但没有被赋值为nil,于是你第二次认为这边变量已经有值了,继续使用那个变量?
 
Delphi环境下导致Access violation错误的大部分常见原因。这个列表不是也不可能覆盖所有可能出现的Access violation的情况。请在论坛上发送你的Access violation信息,大家可以试着一起解决这个问题——真正的实际事例一般情况下比列出来的错误隐晦得多。1. 调用一个不存在的对象 ??如上所述,大部分Access violation的合理原因是使用了没有被创建或者已经被释放的对象。为了防止这种类型的Access violation的发生,请确保你访问的任何对象都首先被创建了。例如,当一个Table定位在一个没有被创建的data module(从auto-crete窗口里移走了)里,你可能在窗体的OnCreate事件里打开这个表。2. 不存在的API参数 ??如果你试图给Win API函数传递一个不存在的参数将会出现一个Access violation错误。解决此类Access violation错误的最好方法是查阅Win API帮助,看看这个API函数调用的参数信息以及参数类型。例如,总是保证不给一个缓冲参数传递一个无效指针。 3. 让Delphi释放 ??当一个对象拥有另一个对象时,让它给你做删除工作。因为默认情况下,所有的窗体(自动创建的)都属于Application对象。当一个应用程序结束时,它释放了Application对象,也就释放了所有窗体。4. 杀死异常 ??永远不要破坏临时异常对象(E),处理一个异常会自动释放异常对象。如果你自己手动释放了异常对象,程序会试图再次释放它,那么就会出现Access violation错误5. 检索一个空字符串 ??一个空字符串是没有任何数据的。就是说,检索一个空字符串相当于访问一个不存在的对象,这将导致Access violation错误6. 直接引用指针 你必须间接引用指针,否则你会改变指针地址并可能会破坏其他存储单元
 
我覺得是我在edit 動態加顏色造成的! 我的代碼是:例如: var focusEdit :Teditif focusEdit<>nil then focusEdit.Color:=clwindow; focusEdit:=sender as TEdit; focusEdit.color:=clyellow;在運行到 focusEdit.color:=clyellow;這一步的時候報的錯
 
if focusEdit<>nil thenbegin focusEdit.Color:=clwindow; focusEdit:=sender as TEdit; focusEdit.color:=clyellow;end;
 
to znxia這樣就不會錯了嗎?
 
我写错了var focusEdit :Teditif focusEdit<>nil then focusEdit.Color:=clwindow; focusEdit:=sender as TEdit;if focusEdit is TEdit then focusEdit.color:=clyellow;--------------------最好你把代码完整地贴出来
 
procedure TFROM1.edit1Enter(Sender: TObject); begin if focusEdit<>nil then focusEdit.Color:=clwindow; focusEdit:=sender as TEdit; focusEdit.color:=clyellow;end;這個是我運行的代碼!
 
var BName:string; PName:Char;begin BName:=(sender as Tbutton).name; PName:=BName[Length(BName)]; if Pos('point',Bname)>0 then Pname:='.'; if focusEdit<>nil then begin focusEdit.color:=clyellow; PostMessage(focusEdit.Handle,WM_CHAR,Ord(PName),0); end; Beep;也是運行到focusEdit.color:=clyellow; 這邊報的錯!
 
通过alt+F12,查看一下dfm文件中,edit1Enter事件是不是被多个地方引用?procedure TFROM1.edit1Enter(Sender: TObject);begin if focusEdit<>nil then focusEdit.Color:=clwindow; if sender is TEdit then begin focusEdit:=sender as TEdit; focusEdit.color:=clyellow; end;end;
 
對,這個事件被多次調用!還有向對應的 edit1Exit 事件還是不行啊!還是會出現這個錯誤!
 
focusEdit:=sender as TEdit;可能当前Sender并不是TEdit,你偏偏把它类型强制转化为TEdit,那么后来调用属性Color就会发生异常,原因应该是这个,自己把edit1Exit再更改一下吧。
 
后退
顶部