Hallo zusammen.
Die meisten Programme haben so einen schönen Begrüßungsbildschirm, also ein Bild das erscheint, während z.B. im Hintergrund die Initialisierungsarbeit erledigt wird.
So etwas hätte ich auch gerne realisiert. Ich habe also ein Image in die Anwendung eingebaut, Aber es macht erst auf, wenn alles schon erledigt ist.
Wie macht man so etwas Professionell ?
Begrüßungsbild
- af0815
- Lazarusforum e. V.
- Beiträge: 6216
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Begrüßungsbild
Siehe Sourcen von Lazarus
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- af0815
- Lazarusforum e. V.
- Beiträge: 6216
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Begrüßungsbild
Leider geht das anfügen nicht mehr.
im Hauptformular zB. für einen Test
Das ganze Geheimnis ist, das sich das Splash selbst schliesst sobald die Applikation im Leerlauf (IDLE) ist. Da das Splash an die Applikation gebunden ist, braucht man sich auch niocht über das Aufräumen den Kopf zu zerbrechen. DIe Procedure SetSplashInfo ist nur ein Beispeil wie man mit dem Splash kommunizieren kann.
Andreas
Code: Alles auswählen
unit usplash;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls;
type
{ TfrmSplash }
TfrmSplash = class(TForm)
Label1: TLabel;
ProgressBar1: TProgressBar;
StatusBar1: TStatusBar;
procedure FormCreate(Sender: TObject);
private
FInitDone: Boolean;
procedure SetInitDone(AValue: Boolean);
public
procedure ApplicationOnIdle(Sender: TObject; var Done: boolean);
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure SetSplashInfo(Pos: integer; AnzeigeText: String; Verzoegerung: integer);
property InitDone:Boolean read FInitDone write SetInitDone;
end;
var
frmSplash: TfrmSplash;
function GetSplashForm:TfrmSplash;
implementation
{$R *.lfm}
{common routines}
function GetSplashForm:TfrmSplash;
begin
if not Assigned(frmSplash) then
Application.CreateForm(TfrmSplash, frmSplash);
Result := frmSplash;
end;
{ TfrmSplash }
procedure TfrmSplash.FormCreate(Sender: TObject);
begin
ShowOnTop;
end;
procedure TfrmSplash.SetInitDone(AValue: Boolean);
begin
if FInitDone=AValue then Exit;
FInitDone:=AValue;
end;
procedure TfrmSplash.ApplicationOnIdle(Sender: TObject; var Done: boolean);
begin
if FInitDone then
Hide;
end;
constructor TfrmSplash.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FInitDone:=True;
Application.AddOnIdleHandler(@ApplicationOnIdle);
end;
destructor TfrmSplash.Destroy;
begin
Application.RemoveOnIdleHandler(@ApplicationOnIdle);
inherited Destroy;
end;
procedure TfrmSplash.SetSplashInfo(Pos: integer; AnzeigeText: String;
Verzoegerung: integer);
begin
ProgressBar1.Position := Pos;
StatusBar1.SimpleText:= AnzeigeText;
Application.ProcessMessages;
sleep(Verzoegerung);
end;
initialization
frmSplash := nil;
// Splashform is bounded to the Application itself, so no free is needed
end.
im Hauptformular zB. für einen Test
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
begin
GetSplashForm.SetSplashInfo(0,'Start',1000);
Application.ProcessMessages;
GetSplashForm.SetSplashInfo(50,'Start',1000);
Application.ProcessMessages;
GetSplashForm.SetSplashInfo(1000,'Start',1000);
Application.ProcessMessages;
end;
Das ganze Geheimnis ist, das sich das Splash selbst schliesst sobald die Applikation im Leerlauf (IDLE) ist. Da das Splash an die Applikation gebunden ist, braucht man sich auch niocht über das Aufräumen den Kopf zu zerbrechen. DIe Procedure SetSplashInfo ist nur ein Beispeil wie man mit dem Splash kommunizieren kann.
Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 6207
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Begrüßungsbild
Ich habe mal rasch etwas probiert.
Das StartForm geht sehr schnell auf und es verschwindet, sobald das HauptForm kommt.
Code: Alles auswählen
var
StartForm: TForm;
begin
StartForm := TForm.CreateNew(nil);
StartForm.Show;
Application.Title := 'Niveau-Anzeiger';
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(THauptForm, HauptForm);
Application.CreateForm(TAnzeigerOptionenForm, AnzeigerOptionenForm);
StartForm.Free;
Application.Run;
end.
Das StartForm geht sehr schnell auf und es verschwindet, sobald das HauptForm kommt.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- af0815
- Lazarusforum e. V.
- Beiträge: 6216
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Begrüßungsbild
Es hängt auch davon ab, wie man mit dem Splash interagieren will. Ich verwende of das erste OnActivate des Hauptforms um die Applikation fertig hochzufahren. Da öffne ich dann die Datenbankverbindungen. Dabei halte ich den Benutzer am laufenden. Da ist aber das Application.Run bereits gestartet. Da muss der Splash aber noch laufen, deswegen ist die Version bei mir da recht angenehm, da sich der Splash erst selbst schliesst wenn die Applikation in den Idle (=Leerlauf) Zustand geht. Das ist aber auch Geschmackssache. Der Code von mir ist der Idee nach aus den Sourcen von Lazarus genommen.
Hinweis lt. hier http://forum.lazarus.freepascal.org/ind ... pic=7006.0 muss Application.Initialize; aufgerufen werden bevor eine Form erzeugt wird.
Hinweis lt. hier http://forum.lazarus.freepascal.org/ind ... pic=7006.0 muss Application.Initialize; aufgerufen werden bevor eine Form erzeugt wird.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 185
- Registriert: Fr 18. Jan 2013, 09:29
- OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
- CPU-Target: Celeron
Re: Begrüßungsbild
Danke für die Antworten.
Ich muss das erst mal durchgehen und verdauen. (nach Faschingsende)
Hier steht sehr viel Neues für mich.
Wenn ich nicht mehr durchblicke melde ch mich wieder.
Gruß Fritz
Ich muss das erst mal durchgehen und verdauen. (nach Faschingsende)
Hier steht sehr viel Neues für mich.
Wenn ich nicht mehr durchblicke melde ch mich wieder.
Gruß Fritz