关于PANEL的Broadcast?(20分)

  • 主题发起人 主题发起人 易名烦
  • 开始时间 开始时间

易名烦

Unregistered / Unconfirmed
GUEST, unregistred user!
var<br>&nbsp;M: TMessage;<br>begin<br>&nbsp;with M do begin<br>&nbsp; &nbsp; &nbsp; msg := WM_SetText;<br>&nbsp; &nbsp; &nbsp; lparam := integer(pchar('我是按钮'));<br>&nbsp; &nbsp; &nbsp; wparam := 0;<br>&nbsp; &nbsp; &nbsp; result := 0;<br>&nbsp;end;<br>&nbsp;panel1.Broadcast(M);<br>panel1上有三个按钮,为何只有一个变了caption。<br>如果把msg改成BN_Disable,lparam := 0,为何一个按扭都不变灰。<br>
 
已有人在d6+win98下实现,为何D7+WINXP不能呢?
 
procedure TWinControl.Broadcast(var Message);<br>var<br>&nbsp; I: Integer;<br>begin<br>&nbsp; for I := 0 to ControlCount - 1 do<br>&nbsp; begin<br>&nbsp; &nbsp; Controls.WindowProc(TMessage(Message));<br>&nbsp; &nbsp; //第一个按钮caption改变后result=1,就退出了。<br>&nbsp; &nbsp; if TMessage(Message).Result &lt;&gt; 0 then Exit;<br>&nbsp; end;<br>end;
 
我的理解:<br>&nbsp; &nbsp; 广播的意思就是把这个MESSAGE发给容器里的所有控件吧,不该管它的返回值吧。
 
那只是你的理解,Borland 的人不这样理解:)<br>从 Broadcast 的源代码,再加上单步跟踪很容易看出来。<br>你只好这样了:<br>procedure TForm1.Button4Click(Sender: TObject);<br>var<br>&nbsp; M: TMessage;<br>&nbsp; i: integer;<br>begin<br>&nbsp; with M do begin<br>&nbsp; &nbsp; msg := WM_SetText;<br>&nbsp; &nbsp; lparam := integer(pchar('我是按钮'));<br>&nbsp; &nbsp; wparam := 0;<br>&nbsp; &nbsp; Result := 0;<br>&nbsp; end;<br>&nbsp; //panel1.Broadcast(M);<br>&nbsp; for i := 0 to panel1.ControlCount - 1 do<br>&nbsp; begin<br>&nbsp; &nbsp; panel1.Controls.WindowProc(M);<br>&nbsp; end;<br>end;<br>
 
哪为何有人在D6+WIN98下实现了,代码一和我的一样,是COPY过去了。
 
“为何一个按扭都不变灰”,如果TButton里面的代码<br>是使用标准函数建立的Button类,才能支持你的消息,<br>请去查一下它的源代码。<br>其实,你可以使用Delphi中的标准方法,通过枚举组件<br>来实现,如:<br>FOR I:=COMPONENTCOUNT-1 DO<br>BEGIN<br>&nbsp; IF (COMPONENTS IS TBUTTON) THEN<br>&nbsp; &nbsp; &nbsp;(COMPONENTS AS TBUTTON).ENABLE:=FALSE;<br>其余依此类推..........<br>END;
 
TButton居然不是标准的Window的Button???????????????????????<br>好了,结了吧。
 
后退
顶部