COM中的PopupMenu弹出问题

huaalexa 2007-06-01 04:56:35
编了IE的浏览栏Dll,里面有若干个PopupMenu,如果是直接打开IE,PopupMenu可以正常弹出(不管有多少个IE窗口),但是如果在 浏览器中 点击链接后打开的新窗口中,在这个新窗口中 PopupMenu 不能弹出(其它控件都正常),而实际上 PopupMenu 也是存在的,就是不能弹出。 问,何故?如何处理?

该问题 ptma(守望者)楼主已提过,其中也没有给出解决的办法,希望高手能给予多多指教!!!
...全文
246 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaalexa 2007-06-07
  • 打赏
  • 举报
回复
问题已结贴了
huaalexa 2007-06-07
  • 打赏
  • 举报
回复
好,特别鸣谢graycarl(gray)兄的热心帮助,
也感谢dacsd(dacsd)的参与!
dacsd 2007-06-04
  • 打赏
  • 举报
回复
"用Delphi开发ActiveX以后,才知道什么叫鸡肋"颇有同感。
huaalexa 2007-06-04
  • 打赏
  • 举报
回复
非常感谢graycarl(gray)!
从中我得到了启发,已解决此问题.
另外还遇到在浏览栏(DLL)的Edit中就不能响应用户输入Backspace退格键,删除前一个字符.
希望各位兄弟帮帮忙!!!
等此问题解决了,一起给各位结分!
graycarl 2007-06-04
  • 打赏
  • 举报
回复
需要实现IInputObject
graycarl 2007-06-02
  • 打赏
  • 举报
回复
IE是以"多线程SDI"方式设计的,就是说我们看到的每个IE窗口被同一进程里的不同的界面线程拥有,而VCL设计时是只考虑了单用户界面线程情况的 :(,使用VCL编写IE插件或者ActiveX组件,不只是菜单 实际上还有很多时候会碰到难办的问题,如果要编写这些应用,可以考虑放弃Delphi吧。
菜单的问题我之前也有碰到过 关键在于Menus单元里的
var
PopupList: TPopupList;

TPopupList创建了一个隐藏Window来处理菜单消息 在initialization节中初始化了PopupList,所以这个Window只属于创建它的线程 我用了这样一个临时的办法来解决这个问题
1.移除PopupList变量声明和其初始化代码
2.添加函数声明function PopupList: TPopupList;
3.添加和改写如下实现代码
var
PopupList_TlsIndex : Cardinal;

procedure Init_PopupList_TlsIndex;
begin
PopupList_TlsIndex := TlsAlloc;
end;

procedure Clear_PopupList_TlsIndex;
begin
TlsFree(PopupList_TlsIndex);
end;

function PopupList: TPopupList;
begin
Result := TlsGetValue(PopupList_TlsIndex);
if not Assigned(Result) then
begin
Result := TPopupList.Create;
TlsSetValue(PopupList_TlsIndex,Result);
end;
end;

procedure TPopupList.Add(Popup: TPopupMenu);
begin
if Count = 0 then FWindow := Classes.AllocateHWnd(MainWndProc);
inherited Add(Popup);
end;

procedure TPopupList.Remove(Popup: TPopupMenu);
begin
inherited Remove(Popup);
if Count = 0 then
begin
Classes.DeallocateHWnd(FWindow);
TlsSetValue(PopupList_TlsIndex,nil);
Destroy;
end;
end;

initialization
Init_PopupList_TlsIndex;
...
finalization
...
Clear_PopupList_TlsIndex;



这个办法其目的是把PopupList放到线程局部存储(TLS)里,经过这样修改后Menu看起来是可以出来了 不过也许也带来了内存泄露的问题,不建议使用。
个人以为 用Delphi开发ActiveX以后,才知道什么叫鸡肋 :D。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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