一个简单问题请大家看看.(35分)

  • 主题发起人 主题发起人 nuke
  • 开始时间 开始时间
N

nuke

Unregistered / Unconfirmed
GUEST, unregistred user!
Outlook Express中,按一下新邮件按扭就会弹出一个新窗口,
并且可以最小化到任务栏上.
而我在程序中却作不到,
我的程序如下
aform:=Tform.create(application);
aform.show;
每次把主窗口最小化就连这个弹出的子窗也最小化了.
如何作出Outlook的效果呢?
 
为什么outlook就一定方窗口呢?你没有试过关闭outlook,newmail还一样存在
吗?我想这可说明它们都不是主窗口或它们不在一个应用程序内。
不过,主窗口最小化,而其它窗口还在显示我目前不会,不知其它人有何办法。
 
应该是两个任务
 
对,是两个任务
 
又研究了一下,应该是有一个hide的mainform,
nuke,你可在project中run前加入:
Application.ShowMainForm:=false;
然后在每个form的close中判断是否全部form都已关闭以判断是否可关闭mainform.
自己做个计数器就行了。
 
Application就是那个隐藏的form 啊。
以前讨论过的,在哪儿...忘了
 
哦...原来如此
 
outlook只有一个执行程序呀!
Foxmail是用Delphi编的,他也做到这点了呢!
 
我又又研究了一下,就是两个任务,看看任务栏就知道了。总之一个二个都可以
搞定了。
 
那究竟该怎样实现呢?
象您上面说的那种方法吗?
Outlook是怎样实现的呢还有foxmail?
??...
:(
 
是一个程序,但可以带参数调用
 
它用的是动态创建方法,调用msoe.dll,
动态创建一个窗口可以将主窗口极小化
而子窗口仍在,在任务栏中也是两个任务
 
能不能给点代码,我也想学一手。
 
窗口的Owner指定为Nil:
MyForm:=TMyForm.Create(Nil);
MyForm.Show;
应该就可以了。
 
李颖的方法试过了,没用.
还请LSS说详细一点儿,我正急切盼望您的解答.
 
白天我上不来,我现在给你的信箱发了一个例子,请查收
 
LSS
邮件已经收到.可惜什么也看不清,一片乱码. :(
(我用的是NetscapeMessage不支持hz码的 :(后来用Foxmail解了一下,乱码依旧
只是看清了最后几个字"分太少" :P
能不能发封其他编码的信来呢?
或者就在论坛上说说吧,讲讲原理,看程序可头疼呢,
万一再看不懂可就罗嗦喽!
35分是少了,100分马上跟到!
 
nuke, Delphi 4.0以前的版本都是那样的, 如果一个程序里面打开的Form多了就会
在任务栏出现很多窗体, 4.0 把那个改掉了, 我觉得现在好多了.
 
project2为动态窗口dll,在集成环境下选择编译即可生成project2.dll
project1为主窗口,运行时先生成project2.dll,再运行project1.exe
可产生两个窗口,可各自极小化。分太少了
程序非常简单,动态创建一个窗口,但句柄不同,虽能完成你的要求,
但还不能象outlook一样,可单独关闭主任务。
我的outlook出毛病了,不知为什么显示不正常
 
LSS的程序看过了,是利用了DLL,想了想,又看了看李颖的帖子.
自己做了一个.
其实不用DLL一样可以实现,还是我自己来终结这个论点吧.
只要把窗体的Owner设为Desktop就行了,如果要象Outlook那样的话
再动态修改一下application.mainform(Read only不过我曾看到一篇
Tip给出了动态修改的方法,当时没注意,等会儿再开个论题讨论一下,
一定是可以的)
我做的程序原码如下(其实就是重载了CreateParams(Params))
程序如果加一个参数'1'运行的话,就显示Form2否则显示Form1,这是模拟
的Outlook点激Mailto只显示邮件编辑窗口.
....哎...可惜不能给自己加分!!!
:(
------Project.dpr----
program Project2;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
application.showmainform:=false;
if paramcount=0 then
begin
form1.show;
end
else
begin
if paramstr(1)='1' then
begin
form2.show;
end;
end;
Application.Run;
end.

-----Unit1.pas------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
VAR AFORM:tform2;
begin
AFORM:=tform2.CREATE(APPLICATION);
aform.show;
end;

end.
------Unit2.pas---------
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm2 = class(TForm)
private
procedure CreateParams(VAR Params: TCreateParams);
override;
public
{ Public declarations }
end;

var
Form2: TForm2;
implementation
{$R *.DFM}
procedure TForm2.CreateParams(VAR Params: TCreateParams);
begin
Inherited CreateParams(Params);
Params.WndParent := GetDesktopWindow;
end;

end.
 

Similar threads

后退
顶部