D2007的BUG,编译出来的程序运行时在任务栏上不会正常显示? ( 积分: 100 )

  • 主题发起人 主题发起人 jxhdy2001
  • 开始时间 开始时间
J

jxhdy2001

Unregistered / Unconfirmed
GUEST, unregistred user!
程序原来使用Delphi7编译都很正常,现在使用2007编译,都不会在任务栏上正常显示,切换程序只能使用Ctrl+Tab了,这是怎么回事啊?
急。。。。

下面是工程文件中的代码:
var
h:THandle;
pre:Longint;
Str:String;
begin
h := CreateSemaphore(nil, 0, 10, 'Bap_Business'); //创建或打开信号量,如查h=null可在此调用GetLastError函数取得更多错误信息
ReleaseSemaphore(h, 1, @pre); //信号量计数增加1,如果r=false可在此调用GetLastError函数取得更多错误信息
if pre > 1 then
begin
WaitForSingleObjectEx(h, 0, True);
Str:= '××业务运行平台已经有两个在运行中,您不能再次运行!'+ #13 + '如果要使用本系统请进行用户切换,谢谢合作!';
MessageBox(Application.Handle, Pchar(Str),'警告',Mb_IconInformation or MB_OK + MB_DEFBUTTON1);
halt;//已有两个实例运行,退出
end;
Application.Initialize;
Application.Title := 'F3协同管理系统';
Application.CreateForm(TCiMainDM, CiMainDM);
Application.CreateForm(TCiPicFrm, CiPicFrm);
FInitInstance := TInit.Create(GAppMgrObj.GlobalContext);
FInitInstance.Run('');

h := OpenSemaphore($00f0000 or $00100000 or $3, false, 'Bap_Business');
// if h=null then //创建或打开信号量出错,可在此调用GetLastError函数取得更多错误信息
WaitForSingleObjectEx(h , 0, True);
// if r2=$FFFFFFFF then //信号量计数减少出错,可在此调用GetLastError函数取得更多错误信息
end.


我在李维中文官方论坛的提示:http://liwei.csdn.net/Forum/topic.aspx?topicid=1094
 
要在任务栏显示请Application.MainForm:=false;
 
不对吧。。Application.MainForm 是窗体啊?如何赋值False,如果是设置Visible也不行啊?
 
需要显示的窗体的Visible属性改变下,我觉得这不是D2007的BUG,之前的版本才是有BUG,我D2006里,这属性不管设置成什么都没效果的
 
dpr文件中
Application.MainFormOnTaskbar := True;
试试
 
我有试过了,如果设置Application.MainFormOnTaskbar := True;
在Windows2000下会在任务栏上出现二个。
如果不设置:程序最小化一下,就能正常显示了。
 
还有一点,就是D2007编译出来的程序在任务管理器中看不到运行的程序,只有在进程才能看到?这是为什么啊?
 
D2007为了兼容vista,对Forms单元做了不小的改动,比如TApplication的class helper
在vista以前的windows版本里会有这些问题,但在vista里是正常的.
将以前的应用移植到d2007还是要慎重的,DELPHI从头到尾的版本,好象就没哪个完全处理好了窗口的用户控制问题.
 
这个并不是问题。CodeGear为了适应Vista的特效,做了一些修改。但是不是给你留下了
Application.MainFormOnTaskbar := True;
属性了吗?你既然可以在dpr里面改代码,为什么不多加一行代码呢?自己定义一个OperationIsWinVista函数,判断系统版本,如果是Vista则返回True,如果不是则返回False,然后改写上面这行语句:
Application.MainFormOnTaskbar := OperationIsWinVista;
即可啊!在任何系统下表现都会一致的!这也不是什么很难的东西。

也许CodeGear有错就错在应该自己写好这一句,不应该留给用户写。但我认为,CodeGear把这段代码交给最终用户(程序员)去写也无可厚非,毕竟IDE的用户是程序员,太傻瓜的IDE对程序员来说未必是件好事。呵呵。个人意见仅供参考。
 
谢谢大家的参于和帮助。
我想出现这样的问题与我工程文件的运行模式有很大关系。
我没有直接执行Application.Run
我在FInitInstance.Run('')中处理先显示登录窗口,用户正常登录后,才创建主窗体,因为主窗体在创建时要初始化很多东西,所以才这么做的,而且我的主窗体是普通的窗体,不是MDI的,窗体上有停靠其它的一些窗体。可能这也有一些关系
 
多罗嗦几句,楼主的问题我记得我在我群中和sunage讨论过。他也说到任务栏无显示的情况,我很早就给他解决方案了。呵呵。主要是楼主不了解Application的运作方式,编写的代码没有遵循这些运作方式限定的约定,所以才出现了未知或非预期的行为。如果有空,楼主可参考一下Application的源码,看看它到底是如何工作的。
 
另外再补充一句
Application.MainFormOnTaskbar := True;
这句代码可以在任何时候使用的,你既可以在需要的时候先设置它为True,也可以在不需要的时候设置它为False,而不是一成不变的设置为True或False。这也是为什么上面我说“CodeGear把这段代码交给最终用户(程序员)去写也无可厚非”的原因。
 
下面是 FInitInstance对象Run方法执行的代码:
procedure TInit.Run;
begin
inherited Run;
if TSystemCore.Operator = nil then
begin
try
GAppMgrObj.BeginFlash;
FLogoned := InternalLogon;
if not FLogoned then
begin
Terminate;
Exit;
end;

Init;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TGetTimeForm, GetTimeForm);
finally
GAppMgrObj.EndFlash;
end; //.try
end;
Application.MainFormOnTaskBar := False;
//执行这句后,出现在任务栏上又不见了,把程序最小化一下之后就正常了,能否告诉我最小化执行了Forms的哪段代码?
Application.Run;
end;
 
我的也遇到同样的问题,还是未能解决,
 
我的Delphi2006就是不能在任务栏中显示。你们的呢?
 
我在MainForm的OnShow事件中添加了一句 Application.MainFormOnTaskBar := False;
在XP和Windows2003下基本正常,可以Windows2000下,最大化时,会把任务栏遮掉。不知道为什么。
 
问题解决了,任务栏被遮掉的原因是我使用了VCLSkin皮肤控件。再次谢谢大家的帮助
 
多人接受答案了。
 
后退
顶部