由于程序启动时可能访问很大的文件或者数据库,所以需要一个启动窗口。在网上狂搜,按照网友指点,基本实现了启动窗口。思路就是把主窗口隐藏,
然后显示SplashForm,等完成启动函数后,释放SplashForm。现在的问题是,这个启动窗口在执行我的启动函数的过程中没有办法刷新。当启动窗口显示后,
如果用户切换到别的程序,再切换回来,发现启动窗口变成灰色,无法刷新。
在VC中,可以在线程中创建启动窗口,主进程不会影响到启动画面的显示,在delphi中,我也试图
用线程来解决,在线程中用Synchronize刷新窗口,但是由于启动函数中也在使用VCL,直到启动函数
结束后,Synchronize才能执行。我不希望在我的启动函数中,不时地加入代码来刷新启动窗口,这样有些愚蠢,看看哪位大虾指点指点?否则,我只能放弃delphi了。

解决方案 »

  1.   

    Application.ProcessMessages;用了吗?
      

  2.   

    否则,我只能放弃delphi了。
    //////////////////////////
    呵呵..你放弃Delphi就放弃啰...还真搞笑..这样的话也说...
    不就是这样的一个问题嘛.把你那段源码贴出来.我相信你肯定写错了..
      

  3.   

    你的Delphi用好了没有?
    这种问题,难道只有VC能实现?楼主在说笑罢了
      

  4.   

    看来还是不少xdjm对delphi有信心了,我把相关代码贴出来,请指点://项目文件中
    var
      t:TSplashThread;  //处理启动参数
      //.......
      Application.Initialize;
      Application.ShowMainForm := False;
      Application.Name := '';
      Application.Title := '';
      Application.CreateForm(TMainForm, MainForm);  SplashForm := TSplashForm.Create(Application);
      SplashForm.Show;
      SplashForm.Update;
      t := TSplashThread.Create(False);//下面创建其他东东
    //......  
    //执行费时的初始化操作
      MainForm.Initiallize;
      MainForm.Visible := True;
      t.Terminate;
      SplashForm.Free;  Application.Run;//SplashThread中
    procedure TSplashThread.Execute;
    begin
      { Place thread code here }
      FreeOnTerminate := True;
      while (True) do
      begin
        if Terminated then break;
        Synchronize(UpdateSplash);
    //    Sleep(200);
      end;
    end;procedure TSplashThread.UpdateSplash;
    begin
      Application.ProcessMessages;
    end;
    我跟了一下,在执行MainForm.Initiallize的时候,线程处于等待状态
    我的想法是,不在MainForm.Initiallize中写刷新SplashForm的代码,
    请大家看看有什么好办法?
      

  5.   

    var
      frm:tform
    begin  Application.Initialize;
      frm:=tform.create(nil)
      frm.showmodel
      frm.free
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    --在frm的create 执行线程在线程结束时sendmessage通知frm关闭这样不就行了吗?
      

  6.   

    http://www.somade.com/是个很专业的技术社区,去那里找找吧,或许有你要的答案~
      

  7.   

    回复 wyb0026(小小) SplashForm关闭没有问题,而是主进程运行时,SplashForm不能刷新。
      

  8.   

    倒,这样就想放弃delphi.
    创建一个splash窗体,再创建一个数据模块,在数据模块中执行查询,并且更新splash窗体,查询完毕再创建main窗体,关闭splash
      

  9.   

    先创建SplashForm,完成后释放,然后再创建MAINFORM,不就可以了吗
    你要SplashForm执行什么都可以
      

  10.   

    回复: chwdong(chwdong) ,yinxd6112(自由的飞)
      我也希望是个简单问题,几句话就能解决,但是没有人告诉我怎么解决
    回复: chw_csdn_chw(chw) 
      数据模块中写不了更新splash窗体的代码希望我写的大家能看明白。
    类似功能的代码我看过,凑合着就是个简单问题,挑剔些就不是简单问题了。
      

  11.   

    不会用thread就说嘛其实这个问题很好解决的. 就是让你的splashform完全在线程中创建(这个是关键)和执行, 只要在线程的主循环中加上消息处理模块就可以了:
      while getmessage(....) do
      try
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      except
      end;
      

  12.   

    问题解决了,delphi多线程处理VCL有些麻烦。看看分数给谁:
      Idle_(阿呆) 说对了一句:不会用thread就说嘛
      其他诸位都是想当然,没有试过。