Begrüßungsbild

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
haderlump
Beiträge: 185
Registriert: Fr 18. Jan 2013, 09:29
OS, Lazarus, FPC: Windows 10, Windows XP, Lazarus 1.6
CPU-Target: Celeron

Begrüßungsbild

Beitrag von haderlump »

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 ?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
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

Beitrag von af0815 »

Siehe Sourcen von Lazarus :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
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

Beitrag von af0815 »

Leider geht das anfügen nicht mehr.

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).

Mathias
Beiträge: 6143
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Begrüßungsbild

Beitrag von Mathias »

Ich habe mal rasch etwas probiert.

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6197
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

Beitrag von af0815 »

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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

haderlump
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

Beitrag von haderlump »

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

Antworten