大家看一看这段代码会不会出异常(0分)

  • 主题发起人 主题发起人 coleman
  • 开始时间 开始时间
C

coleman

Unregistered / Unconfirmed
GUEST, unregistred user!
这是我做试验用的一段代码,请各位高手分析一下,会不会出现异常。
一天后告诉大家答案。(多做几层嵌套是为了实验button1的onclick先返回
,还是button1先free),大家遇到这种问题有没有更好的解决办法。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
procedure proc(var Msg:TMessage)
message wm_user+1;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.proc(var Msg: TMessage);
begin
button1.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(Self.Handle,WM_user+1,0,0);
Button2Click(self);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage('2');
Button3Click(Self);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ShowMessage('3');
Button4Click(Self);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
ShowMessage('4');
end;

end.
 
我试了,不会出现异常.
 
告诉大家吧,我实验的结果为用鼠标点button1触发onclick时间会出异常。
而使用键盘用tab键把focus移到button1上,再按下space键,这样就不会出异常。
这个问题很faint! ccweifen你可以再试一试。
 
奇了怪了!
 
不信大家可以试一试嘛
有没有能告诉我是为什么的?
 
procedure TControl.WMLButtonUp(var Message: TWMLButtonUp);
begin
inherited
//此中执行了button1click()并且处理了wm_user+1消息从而清除了button1
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
end;
DoMouseUp(Message, mbLeft);//此时button1已是非法指针,出现EAccessViolation错误
end;
//keydown,keypress,keyup处理中不会碰到这种代码

 
解释的太好了,那这个算不算delphi的bug呢?
 
这恐怕应当属于“协议式编程”,不算 bug
 
接受答案了.
 

Similar threads

I
回复
0
查看
740
import
I
I
回复
0
查看
686
import
I
I
回复
0
查看
763
import
I
I
回复
0
查看
541
import
I
后退
顶部