Begrüßungsbild

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Begrüßungsbild

Beitragvon haderlump » 9. Feb 2018, 14:25 Begrüßungsbild

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 ?
haderlump
 
Beiträge: 106
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

Beitragvon af0815 » 9. Feb 2018, 15:09 Re: Begrüßungsbild

Siehe Sourcen von Lazarus :D
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3499
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon af0815 » 9. Feb 2018, 15:44 Re: Begrüßungsbild

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).
af0815
 
Beiträge: 3499
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon Mathias » 9. Feb 2018, 18:49 Re: Begrüßungsbild

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 gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon af0815 » 9. Feb 2018, 21:50 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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3499
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon haderlump » 12. Feb 2018, 05:47 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
haderlump
 
Beiträge: 106
Registriert: 18. Jan 2013, 09:29
OS, Lazarus, FPC: Widows XP, Lazarus 1.6 | 
CPU-Target: Celeron
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried