delphi做的com组件怎么显示模态窗体(不同于DLL窗体),求大虾指教!(50分)

  • 主题发起人 主题发起人 rejoise
  • 开始时间 开始时间
R

rejoise

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个COM组件,并且用file->new form创建了一个窗体form2
com组件里有一个方法用来显示这个窗体
procedure Ttest.haha;
begin
form2:=tForm2.create(application);
form2.ShowModal;
end;
这样的语句会出错Incompatible types: 'TComponent' and 'IApplicationObject'
我在exe这样的程序都是这样写的啊,现在不知道怎么办了,请大虾指教
我现在只好这样写了
form2:=tForm2.CreateParented(GetDesktopWindow());
form2.ShowModal;
可是如果我调用这个方法,跳出窗体非常缓慢,而且不太正常,不知道正确的方法是什么
请大虾指教◎
 
是啊,这个窗体应该有父亲的,试试指定为(self),或者用一个参数,在调用时传入父窗体这个参数。
 
用self不行啊,在com组件里用self是指com组件这个类,好像不对
还有怎么用参数,请指教,谢谢!
 
首先要有Handle,就看你怎样取这个Handle了
 
我在VB里创建了一个COM组件,然后显示模态窗口,特简单
在delphi中怎么这么难,在delphi这样写
form2:=tForm2.CreateParented(GetDesktopWindow());
form2.ShowModal;

现在我在VB里调用我delphi写的com组件,模态窗口总是显示的太慢,而且总是不弹出来显示,而是呆在任务栏里,请大虾再指教
 
传参数还用我教!
看看这样行不行:)
procedure Ttest.haha(myform: Tform);
begin
form2:=tForm2.create(myform);
form2.ShowModal;
end;
 
大哥啊,现在我在VB里调用com组件里的haha方法,参数是什么啊,我不知道啊
我更不知道传什么进去啊
更何况,我还准备用javascript调用
<script>
set aaa=CreateObject("project1.test")
call aaa.haha()
</script>
这简直没法传啊
救我呀!
 
我用TForm2.Create(nil);
 
我也想知道
 
可以呀,我用过没问题
procedure DoCopyAnywhere(Wnd: HWND; sl: TStringList);
var
frm : TfrmCopyAnywhere;
begin
frm := TfrmCopyAnywhere.Create(Application);
try
frm.AddFiles(sl);
frm.ShowModal;
finally
frm.Free;
end;
end;
你看一看下面这篇文章吧
Windows外壳扩展编程入门实例
http://www.playicq.com/datanew/Windows外壳扩展编程入门实例.pdf
 
哎,用nil我也试过的,第一次调出窗口特别慢,而且如果关掉后再次调出,窗口跳不出来
只能呆在任务栏里,并且如果拖动窗体会出现重影,特难看
to app2001,
我不知道你是不是写的com组件,那里的application和应用程序里的application是不一样

问题还没解决,痛苦!
 
你看了我推荐的那篇文章了吗?那上面的算不算是com组件?我给你的方法就是上面提的
 
你的文章大不开
 
现在是这样的,我不创建窗体了
我只是简单的showmessage('123')
也会出现我说的情况
就是第二次调不出来,而且对话框拖动会出现重影,出现好多对话框
不知道为什么
大虾救我!!!
 
http://www.delphiok.com/article/0017.htm
 
现在问题解决得差不多了,可是还是有一些需要探讨

现在可以做到在IE中弹出模态窗口,可是在任务栏上会多个窗口,就是模态窗体的
而我把焦点移动到别的程序,如资源管理器等
再回到刚才的IE,可以发现,模态窗口没有跟着IE跳出来,就是说没有出现在当前的IE窗口中,而是呆在任务栏上,这样IE看上去好像死了一样

现在的问题是
1)我不想跳出的模态窗体占用任务栏(简单)
2)当切换焦点后,再次回到IE窗口时,必须让模态窗口跳出(困难)

估计还是跳出的窗口需要设定父窗体,现在我没设,创建用的是create(nil),可能是问题

我在VB里写的com组件和delphi类似,就能够很好满足我的上面两个要求,可是delphi做不到,郁闷

请继续,谢谢!解决后,我分全给了!!!
 
至于永远将窗体显示在前面,你要在你的窗体的建立事件中加上一句
SetWindowPos(Form.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE)
//试试看吧
 
我可不是永远显示在最前面。当切换焦点到别的程序时,它可不能显示在前面
比如说我转到资源管理器,它怎么能出现呢

我的意思是就和普通程序一样
比如你在word里设置字体属性,然后你转到别的程序,再转到word
那字体设置那个模态窗口肯定是激活的,在word上面的,而不是显示任务栏中
就是那个效果

说到底,word是word字体设置框的父窗体
而com组件中的模态窗体父窗体是空的,所以问题没解决
而VB不知怎么做到的
 
如果只是在本程序的最前面的话你可以在窗体的OnShow的事件里设置FormStyle :=fsStayOnTop;
 
这些方法我都试过啊,不行啊
感觉这个模态窗体不是IE窗口的
它在任务栏中占一个地方,所以重新回到IE时,它跳出出来
老大,你可以写一个看看,没那么容易啊
 

Similar threads

后退
顶部