在Delphi中以编程方式创建启动画面

6
什么是在Delphi中实现启动屏幕的最佳方法?

3
别忘了考虑形式和位置,以及双屏显示器。 - Tobiasopdenbrouw
3个回答

9
创建一个表单,将其 FormStyle 设为 fsStayOnTop,将其边框样式设置为无,将其标题设置为空。这将创建一个没有顶部标题栏的表单。在表单上放置一个 TImage,并将您的位图加载到其中。
在表单上放置一个 TTimer(这将用于确保闪屏界面至少显示一段时间)。
以下是我在我的闪屏表单中使用的代码:
TSplashForm = class (TForm)
  Image1: TImage;
  CloseTimer: TTimer;
  procedure CloseTimerTimer(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  procedure FormDestroy(Sender: TObject);
private
  FStartTicks: integer;
  FOKToClose: boolean;
public
  property OKToClose: boolean read FOKToClose write FOKToClose;
end;

var
  SplashForm: TSplashForm;

在FormCreate事件中:
procedure TSplashForm.FormCreate(Sender: TObject);
begin
  FStartTicks := GetTickCount;
end;

procedure TSplashForm.CloseTimerTimer(Sender: TObject);
const
  CTimeout = 3000;
begin
  if (GetTickCount - FStartTicks > CTimeout) and OKToClose then
    Close;
end;

procedure TSplashForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TSplashForm.FormDestroy(Sender: TObject);
begin
  SplashForm := nil;
end;

在您的项目文件中,可以像这样进行操作:
begin

  SplashForm := TSplashForm.Create(nil)

  Application.Initialize;
  Application.Title := 'My Program';

  //create your forms, initialise database connections etc here
  Application.CreateForm(TForm1, Form1);

  if Assigned(SplashForm) then
    SplashForm.OkToClose := True;

  Application.Run;

end.

大部分代码都是我凭记忆写的,可能一开始并不能编译。


3
小提示:为了不干扰IDE中的调试,最好在窗体的OnCreate事件处理程序中设置FormStyle := fsStayOnTop;,但仅当未设置DebugHook时才这样做。否则,启动画面将会遮挡IDE的一些内容。如果你只有一个显示器进行调试,那么就比较倒霉了。 - mghie
3
更好的做法是去掉 "fsStayOnTop"。你的启动画面没有必要遮挡住我正在使用的其他应用程序,特别是当它停留在屏幕上的时间太长,让我感到无聊并切换到其他更有趣的应用程序时。 - Cosmin Prund
这也是真的...如果我能保证它在我的程序中始终处于其他窗口之上,我会这样做,但我建议客户如果他们真的非常关心的话使用/nosplash命令行选项。 - Nat
@Nat,GetTickCount64在哪个单元中声明?Delphi告诉我它未声明。 - ple103
1
@petersmileyface 你可以直接使用 GetTickCount... 它只是作为一个建议添加的... 但实际上并不需要它。 - Nat
显示剩余10条评论

0

这是我的做法:首先通过在项目中添加一个空表单来创建一个新的单元(文件->新建->表单),让我们称其为“闪屏”,将其(表单)边框样式设置为bsnone,并将其名称属性设置为“splashscreen”或您想要的任何名称,通过首先使用mspaint或其他工具设计图片然后将timage组件拖到表单上并通过它打开图像文件来设计它(表单),在单元的var部分添加以下行:“splashscreen:Tsplashscreen;(您可以使用任何名称)”,然后将此单元的名称添加到第一个单元的uses从句中,并将下面的代码添加到第一个单元的表单oncreate事件中:

  procedure TForm1.FormCreate(Sender: TObject);
    var
     splash :  Tsplashscreen;
   begin
     Splash := TSplashScreen.Create(Application);
     Splash.Show;
    Sleep(1000); //as long as you want screen to be displayed 1000 = 1 second
     Splash.Hide;
     Splash.Free;
    end;

6
从主线程中调用Sleep(whatever)是个不好的主意:你的GUI会冻结!试着在它正在睡眠的时候拖动其他窗口到你的启动屏幕上,你就会明白为什么了。使用定时器是更好的选择,因为消息处理至少可以继续进行,如果需要的话还可以重新绘制启动屏幕。 - Cosmin Prund

0

关于启动界面,技术上并没有太大难度,它只是一个弹出窗口然后消失的表单。因此,在Delphi中实现启动界面最好的方法是:找一位图形设计师为您绘制一个!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接