深入VCL内部,请超高手。(100分)

  • 主题发起人 主题发起人 a1b1c1
  • 开始时间 开始时间
A

a1b1c1

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在控件中动态生成控件。
如,如何通过TEdit和TListBox组合出TMyComboBox,
其中,TListBox须动态生成。
我的问题是,如何在动态生成后,动态删除前加入控制代码以使其暂停,响应相关事件、消息。
 
写好函数过程 比如boxclick.然后


myListbox.onclick:=boxclick;
 
我提出的问题为什么总是没人回答得了呢。
--------------------------------------
因为我是高手,所以需要超高手来回答,但这没有吗?
--------------------------------------
我还有两个问题,结果同这个一样,没人回答的了(正确)。
------------------------------------------------------
可有其它可去的论坛?能不能推荐几个?
 
andy263,
thanks,
我问不是这个。
如何使一个控件暂停,以使接收其它消息。
例如Onclick中:
动态生成
显示
暂停---------------》只能接收自己的消息。
删除---------------》 在OnClick中完成。
 
可有其它可去的论坛?能不能推荐几个?
 
你可以把过程放入一个线程 不停的去响应系统消息 遇到满足条件的在执行删除操作。
 
To Andy263 Again:

动态生成就是为了减少系统消耗,如果采用你的方法,当控件太多时,就会引发其它问题。
例如由于同步导致速度延缓。
 
^_^ 想不到其他方法了 和你一起关注一下
 
方法我倒有,但略显笨着。
所以想找个好的思路,
另外,感谢你,支一招给你?关于BMP的透明问题。
 
写一个类继承于TComboBox(TMyComboBox),覆盖其procedure WndProc(var Message: TMessage); override;在需要的地方发送一自己定义的消息给你创建的对象


procedure ComboBox.WndProc(var Message: TMessage);
begin
case(Message.Msg) of
自己消息 : do//
end;
inherited; //一定要调用此句让系统来处理其他消息
end;
 
这问题不复杂,不过说起来话一大堆,麻烦.
建议找书瞧瞧,自己动手,印象会深一点.
 
//暂停---------------》只能接收自己的消息。

替换其 WindowProc 属性,即写一个新的只处理你自己消息的消息处理函数,
在你的某控件只想处理自己消息的时候,将该处理函数赋予其 WindowProc,
这样,该控件就只处理你特定的消息了(当然,赋值前别忘了记录旧的属性)。
 
To zhou_an_jun : 我只用TcomboBox举了个例了。win32标准控件不在讨论范围。
To wlmmlw : 你是意思是讲起来不复杂?事实上,你动手试一个,你就知道了,书上?
我从未见过讲在控件中动态生成控件的例子,(我读的书不够多吗,绝对错误)。
 
to beta,
你说有没错。
但我的要求是在一个过程中完成创建、响应、删除,
在使用WindowProc时,你必须将你不处理的消息转给操作系统或其父类,结果,它就被删除了。
 
建议搂主多看看VCL的源代码
象搂主所说的功能
应该是绝大多数VCL控件都有的处理方法
就是三个函数
beforceclick;
doclick;
afterclick;
然后分别在三个函数中处理相应的beforceclick event
onclick event
after click event

在doclick中这样写
if assign(FONCLICK) then
........
 
TO zealothasu, 看懂我的问题了吗?
 
可能稍有点误差
你把需要响应的事件定义好FLISTCLICK
但是你在beforceclick中加入动态创建的语句
然后创建的时候把事件指向代码不就OK了吗
肯定会自己响应的
 
来自:a1b1c1, 时间:2003-12-23 10:54:00, ID:2370867
To zhou_an_jun : 我只用TcomboBox举了个例了。win32标准控件不在讨论范围。
To wlmmlw : 你是意思是讲起来不复杂?事实上,你动手试一个,你就知道了,书上?
我从未见过讲在控件中动态生成控件的例子,(我读的书不够多吗,绝对错误)。


这一句看得出来楼主真的很自信
你看看有多少控件内部使用到TTimer
还有数据控件的参数
 
任何控件都有onDestory属性,你自己声明一个Tnotifyevent类型的过程(在这个过程中做你想做的事),然后在创建后,把你的过程赋给新控件的onDestory.
 
用GetMessage循环
while GetMessage(msg, 0, 0, 0) do
begin
if {msg for destroy the control} then break
else if {msg is for the control} then //processit
else ;//discard
end;
 
后退
顶部