AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Delphi Tutorial: Splash Screens
Tutorial durchsuchen
Ansicht
Themen-Optionen

Tutorial: Splash Screens

Ein Tutorial von sakura · begonnen am 9. Sep 2003 · letzter Beitrag vom 31. Jan 2009
Antwort Antwort
Seite 9 von 10   « Erste     789 10      
Svenkan

Registriert seit: 10. Feb 2007
Ort: Bersenbrück
547 Beiträge
 
Delphi 7 Enterprise
 
#1

Re: Tutorial: Splash Screens

  Alt 2. Mai 2007, 15:41
3000

Nur sollten diese 3sec eigtl keine Ewigkeit dauern. ^^
Der OnClose-Befehl wird ja auch ausgeführt, aber das Fenster lässt sich einfach nicht schließen.
Also kommt der Befehl ja auch an. Es passiert nur einfach nichts. oO

/edit: Habe in die Prozedur 'SetInitializationDone' einen Labelwechsel mit eingebaut und merke grade, dass dieser nie vorgenommen wird.
Ich glaube jetzt mal, dass dort der Fehler liegt und deswegen 'CanClose' auf auf 'False' bleibt.

/edit2: Ich habs! Ich hab vergessen 'Application.CreateForm(TSplash, Splash);' rauszunehmen.
Sven Kannenberg
  Mit Zitat antworten Zitat
bacci

Registriert seit: 1. Feb 2008
6 Beiträge
 
#2

Re: Tutorial: Splash Screens

  Alt 6. Feb 2008, 23:39
[quote="Kernel32.DLL"]@DymonD

Jepp, so in etwa...

In der Delphi 5 Hilfe steht:
Delphi-Quellcode:
begin
  Application.Initialize;
  with TForm5.Create(nil) do
  try
    ProgressBar1.Max := 100;
    Show; // Startbildschirm mit ProgressBar anzeigen
    Update; // Anzeige von Form5 auslösen
    Application.CreateForm(TForm1, Form1);
    ProgressBar1.StepBy(25);
    Application.CreateForm(TForm2, Form2);
    ProgressBar1.StepBy(25);
    Application.CreateForm(TForm3, Form3);
    ProgressBar1.StepBy(25);
    Application.CreateForm(TForm4, Form4);

    ProgressBar1.StepBy(25);
  finally
    Free;
  end;
  Application.Run;
end.


[quote]

So ... leider ist mein Delphi wissen noch vieeeel zu wenig, ich hab das auch so versucht, aber hat nicht geklappt, die ProgressBar zeigt nichts an.
Habe mal die RzProgressbar versucht, auch da klappts nicht.

kann mir jemand sagen was ich schon wieder falsch mache, bzw vergessen habe ;-(

Mein dpr- file:

Delphi-Quellcode:
program Kundenverwaltung;

uses
  Forms,
  form_kunden in 'form_kunden.pas{kunden},
  main in 'main.pas{Master},
  form_mitarbeiter in 'form_mitarbeiter.pas{Mitarbeiter},
  form_artikel in 'form_artikel.pas{Artikel},
  form_auftragsverwaltung in 'form_auftragsverwaltung.pas{Auftragsverwaltung},
  form_bestellung in 'form_bestellung.pas{bestellung},
  form_rechnung in 'form_rechnung.pas{Rechnung},
  splash in 'splash.pas{Form1},
  form_alte_bestellung in 'form_alte_bestellung.pas{alte_bestellungen};

{$R *.res}

begin
 //


Form1 := TForm1.Create(Application);
  with TForm1.Create(nil) do
 try
RzProgressBar1.visible:=true;
RzProgressBar1.percent:=0;
  Form1.Show;
  Form1.Refresh;
  Application.Title := 'KAV - IDL stone solutions';
  Application.Initialize;
  Application.Title := 'IDL KAV';
  Application.CreateForm(TMaster, Master);
  Application.CreateForm(Tkunden, kunden);
RzProgressBar1.percent:=40;
  Application.CreateForm(Tbestellung, bestellung);
  Application.CreateForm(TRechnung, Rechnung);
RzProgressBar1.percent:=60;
  Application.CreateForm(Talte_bestellungen, alte_bestellungen);
  Application.CreateForm(TMitarbeiter, Mitarbeiter);
RzProgressBar1.percent:=80;
  Application.CreateForm(TArtikel, Artikel);
  Application.CreateForm(TAuftragsverwaltung, Auftragsverwaltung);
RzProgressBar1.percent:=100;
RzProgressBar1.visible:=false;

  Finally
// SplashScreen Fenster freigeben
 Form1.InitializationDone := True;
end;
// while form1 <> nil do
// Application.ProcessMessages;
  Application.Run;
end.

Danke für eure Mühe, aber nach 2 Tagen Google und Forum durchsuchen hab ich jetzt aufgegeben und frage dann doch ... ;-((
Wenn du denkst du hast Ihn drinne ...
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Tutorial: Splash Screens

  Alt 20. Mär 2008, 19:26
Zitat von bacci:
[...]

Delphi-Quellcode:
program Kundenverwaltung;

uses
  Forms,
  form_kunden in 'form_kunden.pas{kunden},
  main in 'main.pas{Master},
  form_mitarbeiter in 'form_mitarbeiter.pas{Mitarbeiter},
  form_artikel in 'form_artikel.pas{Artikel},
  form_auftragsverwaltung in 'form_auftragsverwaltung.pas{Auftragsverwaltung},
  form_bestellung in 'form_bestellung.pas{bestellung},
  form_rechnung in 'form_rechnung.pas{Rechnung},
  splash in 'splash.pas{Form1},
  form_alte_bestellung in 'form_alte_bestellung.pas{alte_bestellungen};

{$R *.res}

begin
 //


Form1 := TForm1.Create(Application);
  with TForm1.Create(nil) do
 try
RzProgressBar1.visible:=true;
RzProgressBar1.percent:=0;
  Form1.Show;
  Form1.Refresh;
  Application.Title := 'KAV - IDL stone solutions';
  Application.Initialize;
  Application.Title := 'IDL KAV';
  Application.CreateForm(TMaster, Master);
  Application.CreateForm(Tkunden, kunden);
RzProgressBar1.percent:=40;
  Application.CreateForm(Tbestellung, bestellung);
  Application.CreateForm(TRechnung, Rechnung);
RzProgressBar1.percent:=60;
  Application.CreateForm(Talte_bestellungen, alte_bestellungen);
  Application.CreateForm(TMitarbeiter, Mitarbeiter);
RzProgressBar1.percent:=80;
  Application.CreateForm(TArtikel, Artikel);
  Application.CreateForm(TAuftragsverwaltung, Auftragsverwaltung);
RzProgressBar1.percent:=100;
RzProgressBar1.visible:=false;

  Finally
// SplashScreen Fenster freigeben
 Form1.InitializationDone := True;
end;
// while form1 <> nil do
// Application.ProcessMessages;
  Application.Run;
end.

Danke für eure Mühe, aber nach 2 Tagen Google und Forum durchsuchen hab ich jetzt aufgegeben und frage dann doch ... ;-((
Is zwar schon etwas her.
Aber: Ich würde folgendes machen.
Erstmal solltest du verstehen, was "with" macht. Dann solltest du wissen, was ".Create" für auswirkungen hat, und dann ist es ganz einfach

Ich mach das mal ganz kurz:
Delphi-Quellcode:
Form1 := TForm1.Create(Application);
with Form1 do // Du arbeitest mit dem Objekt bzw. der Instanz "Form1" und nicht mit einem neuen Objekt!
  try
    // Fenster erstellen
    ...
    // Hier nun die Progressbar weitergehen lassen ^^
    RzProgressBar1.Percent := <0..100>
    // Und jedesmal NEUZEICHNEN
    RzProgressBar1.Repaint;

    // Und nochmal
    // Fenster erstellen
    ...
    // Hier nun die Progressbar weitergehen lassen ^^
    RzProgressBar1.Percent := <0..100>
    // Und jedesmal NEUZEICHNEN
    RzProgressBar1.Repaint;

    // Und nochmal
    // Fenster erstellen
    ...
    // Hier nun die Progressbar weitergehen lassen ^^
    RzProgressBar1.Percent := <0..100>
    // Und jedesmal NEUZEICHNEN
    RzProgressBar1.Repaint;

    // Bis alle Fenster erstellt wurden!
  finally
    InitializationDone := true; // Kein Form1 weil du ja schon sagst, dass er überall "Form1" davorsetzen soll (with <...> do)
  end;

Application.Done;
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
bacci

Registriert seit: 1. Feb 2008
6 Beiträge
 
#4

Re: Tutorial: Splash Screens

  Alt 20. Mär 2008, 21:45
Vielen Dank,

auch für die gute Erklärung, werde das die Tage mal ausprobieren.
Melde mich dann nochmal.
Ich hab da noch ein Problem und zwar möchte ich, bevor er das alle macht erst testen lassen ob die Datenbankverbindung da ist, diese ist Extern (MySQL) und wenn die Verbindung nicht da ist soll er das "sozusagen" mit einer Meldung bekanntgeben und das Programm dann gar nicht erst öffnen, da es ein haufen fehlermeldungen gibt wenn die Verbindung nicht steht.

Dazu schreibe ich aber noch genaueres, kann gerade nicht an meinen Notebook ran wo alles drauf ist ;-(


Special TXH an xZise
Wenn du denkst du hast Ihn drinne ...
  Mit Zitat antworten Zitat
Benutzerbild von Deltachaos
Deltachaos

Registriert seit: 20. Feb 2008
Ort: Berlin
195 Beiträge
 
Delphi 7 Personal
 
#5

Re: Tutorial: Splash Screens

  Alt 13. Mai 2008, 15:08
Ich glaube ich habe eine Möglichkeit die einfacher und schneller ist:

So geht's:

* Ein weiteres Formular erstellen. Dieses wird unser Splash Screen werden.
* Den Namen des Formulars z. B. in "SplashScreen" ändern. Dieser wird später noch verwendet.
* Diese Eigenschaften des Formulars ändern: BorderStyle auf bsNone und Position auf poScreenCenter
* Das Formular frei gestalten: Beschriftungen, Grafiken oder andere Komponenten hinzufügen.
* Im Menü: Projekt>>Optionen>>Formulare das Splash-Formular auf die rechte Seite bringen (als verfügbares/available Formular). Das Formular werden wir später nämlich dynamisch laden.
* Den Quelltext des Projekts (Hauptprogramm - nicht eine der Units!!!) anzeigen lassen. Dazu im Menü: Projekt>>Quellcode anschauen. Für Delphi kleiner Version 4: Ansicht>>Projekt-Quelltext.
* Folgenden Code nach der Begin-Anweisung einfügen:

SplashScreen := TSplashScreen.Create(Application);
SplashScreen.Show;
Application.Initialize; //diese Zeile existiert schon! - nicht noch mal rein
SplashScreen.Update;

* Nach der letzten Application.Create() und vor der Application.Run-Anweisung folgendes hinzufügen:

SplashScreen.Hide;
SplashScreen.Release;

* Das war's! Jetzt müsste der Splash Screen solange angezeigt werden, wie das Hauptformular lädt.
Und wenn man ihn für eine bestimmte Zeit anzeigen lassen möchte dann muss man nur in das Hauptforular an erster stelle ein sleep(3000); einfügen
Maximilian Ruta
  Mit Zitat antworten Zitat
Benutzerbild von MasterEvil
MasterEvil

Registriert seit: 12. Feb 2005
Ort: Hannover
234 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Tutorial: Splash Screens

  Alt 7. Jul 2008, 14:07
Hat auch jemand eine Lösung mti Delphi2007 und Application.MainFormOnTaskbar:=true?
Dort ist das Problem: wenn du MainFormOnTaskbar auf true stellst vor dem Application.Initialize, dann hat der SplashScreen keinen Taskbar-Eintrag. Stellt man MaiNFormOnTaskbar erst nach dem Anzeigen des SplashScreens auf true gibt es interessante Nebenwirkungen (zusätzlicher leerer Taskbar-Eintrag).
Gebe ich dem SplashScreen über CreateParams einen eigenen Taskbar-Eintrag und setze MainFormOnTaskbar wieder vor Initialize, dann kann es unter Vista passieren, dass es einen zweiten leeren Eintrag gibt ...
Dort schon jemand eine Möglichkeit gefunden?

Gruß,
Steffen
  Mit Zitat antworten Zitat
Benutzerbild von Cosamia
Cosamia

Registriert seit: 27. Feb 2007
Ort: Emmendingen
221 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Tutorial: Splash Screens

  Alt 4. Aug 2008, 08:53
Zitat von MasterEvil:
Hat auch jemand eine Lösung mti Delphi2007 und Application.MainFormOnTaskbar:=true?
Dort ist das Problem: wenn du MainFormOnTaskbar auf true stellst vor dem Application.Initialize, dann hat der SplashScreen keinen Taskbar-Eintrag. Stellt man MaiNFormOnTaskbar erst nach dem Anzeigen des SplashScreens auf true gibt es interessante Nebenwirkungen (zusätzlicher leerer Taskbar-Eintrag).
Gebe ich dem SplashScreen über CreateParams einen eigenen Taskbar-Eintrag und setze MainFormOnTaskbar wieder vor Initialize, dann kann es unter Vista passieren, dass es einen zweiten leeren Eintrag gibt ...
Dort schon jemand eine Möglichkeit gefunden?

Gruß,
Steffen
selbiges Problem habe ich auch. Delphi 2007 verhält sich da unter Vista etwas seltsam.
  Mit Zitat antworten Zitat
derula

Registriert seit: 16. Mär 2008
11 Beiträge
 
Delphi 7 Personal
 
#8

Re: Tutorial: Splash Screens

  Alt 26. Sep 2008, 03:25
Hi, keine Ahnung, ob das erwünscht ist, aber ich hätte ne Modifikation des Originaltutorials mit Fade-In /-Out. Und zwar wird dies über einen Thread gesteuert. Funktioniert, und es wird auch wie ich das sehen kann alles wieder ordnungsgemäß freigegeben.

DPR:
Delphi-Quellcode:
begin
  SplashForm := TSplashForm.Create(Application);
  try
    SplashForm.Show;
    SplashForm.Refresh;
    FadeThread := TFadeThread.Create(False);
    Application.Initialize;
    Application.CreateForm(TMainForm, MainForm);
  finally
    SplashForm.InitializationDone := True;
  end;
  Application.Run;
end.
SplashUnit.pas (bei mir):
Delphi-Quellcode:
type
  TSplashForm = class(TTntForm)
    SplashImage: TImage;
    SplashTimer: TTimer;
    CloseBtn: TTntButton;
    procedure SplashTimerTimer(Sender: TObject);
    procedure TntFormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure TntFormClose(Sender: TObject; var Action: TCloseAction);
  private
    FInitializationDone: Boolean;
    { Private declarations }
    procedure SetInitializationDone(const Value: Boolean);
  public
    { Public declarations }
    property InitializationDone: Boolean read FInitializationDone write SetInitializationDone;
  end;

type
  TFadeThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  public
    FadeActive: Boolean;
  end;

var
  SplashForm: TSplashForm;
  FadeThread: TFadeThread;

implementation

{$R *.DFM}

procedure TFadeThread.Execute;
begin
  FadeActive := True;
  while (SplashForm <> nil) and not Terminated do
  begin
    if not SplashForm.InitializationDone or SplashForm.SplashTimer.Enabled then
    begin
      //Fade-In
      if SplashForm.AlphaBlendValue < 255 then
        SplashForm.AlphaBlendValue := SplashForm.AlphaBlendValue + 17
      else
        FadeActive := False;
    end else
    begin
      //Fade-Out
      if SplashForm.AlphaBlendValue > 0 then
        SplashForm.AlphaBlendValue := SplashForm.AlphaBlendValue - 17
      else
      begin
        FadeActive := False;
        Terminate;
        SplashForm.Close;
      end;
    end;
    Sleep(40);
  end;
end;

procedure TSplashForm.SetInitializationDone(const Value: Boolean);
begin
  FInitializationDone := Value;
  Close;
end;

procedure TSplashForm.SplashTimerTimer(Sender: TObject);
begin
  SplashTimer.Enabled := False;
  FadeThread.FadeActive := True;
end;

procedure TSplashForm.TntFormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := FadeThread.Terminated;
end;

procedure TSplashForm.TntFormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  FadeThread := nil;
  Action := caFree;
  SplashForm := nil;
end;
Warum 17? Weil 17*15=255. ^^ Das Form muss natürlich vorher mit AlphaBlend := True bestückt werden.

In diesem Sinne: Viel Spaß (und gute Nacht *aufdieuhrseh*)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Tutorial: Splash Screens

  Alt 26. Sep 2008, 06:15
Naja, auf den ersten Blick ok. Auf den zweiten Blick sieht man das du im Thread auf ein VCL-Object zugreifst ohne den Zugriff zu syncronisieren. Dabei ist es mehr als wahrscheinlich das als Effekt davon später im Programm tolle Effekte auftreten.
Zudem verwendet dein Thread eine globale Variable um das Splashform zu finden. Wenn wir aber einmal bei Objecten sind macht es doch mehr sinn dem Thread gleich das Fenster mitzugeben um zu vermeiden das da irgendwann 2 Threads mal auf dem gleichen Fenster rumrödeln
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
derula

Registriert seit: 16. Mär 2008
11 Beiträge
 
Delphi 7 Personal
 
#10

Re: Tutorial: Splash Screens

  Alt 26. Sep 2008, 07:10
Zitat von SirThornberry:
Naja, auf den ersten Blick ok. Auf den zweiten Blick sieht man das du im Thread auf ein VCL-Object zugreifst ohne den Zugriff zu syncronisieren. Dabei ist es mehr als wahrscheinlich das als Effekt davon später im Programm tolle Effekte auftreten.
Hmm ja, naja das Problem ist halt, dass in der ersten Hälfte, während das Programm noch lädt, nichts von den Event-Handlern de Form bedient wird. Also zumindest hatte ich einen Timer drin, und mein Splash hat sich nicht eingefadet. Ich hab irgendwie das gefühl, wenn man das mit Synchronize macht, blendet sich das Ding erst ein wenn sich das Hauptfenster auch öffnet... liege ich falsch?

Zitat von SirThornberry:
Zudem verwendet dein Thread eine globale Variable um das Splashform zu finden. Wenn wir aber einmal bei Objecten sind macht es doch mehr sinn dem Thread gleich das Fenster mitzugeben um zu vermeiden das da irgendwann 2 Threads mal auf dem gleichen Fenster rumrödeln
Hm, wäre einen Versuch Wert. Danke für die Tipps!

Edit: Habs jetzt mal so ummodelliert... und wie vermutet blendet sich die Form erst ein, wenn das Programm eh fertig geladen hat...

Delphi-Quellcode:
begin
  FadeThread := TFadeThread.Create(False);
  try
    Application.Initialize;
    Application.CreateForm(TMainForm, MainForm);
  finally
    FadeThread.InitializationDone := True;
  end;
  Application.Run;
end.
Delphi-Quellcode:
type
  TSplashForm = class(TForm)
    SplashImage: TImage;
    SplashTimer: TTimer;
    CloseBtn: TButton;
    procedure SplashTimerTimer(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TFadeThread = class(TThread)
  private
    { Private-Deklarationen }
    FInitializationDone: Boolean;
    FSplashForm: TSplashForm;
    procedure CreateForm;
    procedure DoFade;
    procedure SetInitializationDone(const Value: Boolean);
  protected
    procedure Execute; override;
  public
    FadeActive: Boolean;
    property InitializationDone: Boolean read FInitializationDone write SetInitializationDone;
  end;

var
  FadeThread: TFadeThread;

implementation

{$R *.DFM}

procedure TFadeThread.CreateForm;
begin
  FSplashForm := TSplashForm.Create(Application);
  FSplashForm.Show;
  FSplashForm.Refresh;
end;

procedure TFadeThread.DoFade;
begin
  if not FInitializationDone or FSplashForm.SplashTimer.Enabled then
  begin
    //Fade-In
    if FSplashForm.AlphaBlendValue < 255 then
      FSplashForm.AlphaBlendValue := FSplashForm.AlphaBlendValue + 17
    else
      FadeActive := False;
  end else
  begin
    //Fade-Out
    if FSplashForm.AlphaBlendValue > 0 then
      FSplashForm.AlphaBlendValue := FSplashForm.AlphaBlendValue - 17
    else
    begin
      FadeActive := False;
      Terminate;
      FSplashForm.Close;
      FSplashForm := nil;
    end;
  end;
end;

procedure TFadeThread.Execute;
begin
  FadeActive := True;
  Synchronize(CreateForm);
  while (FSplashForm <> nil) and not Terminated do
  begin
    Synchronize(DoFade);
    Sleep(40);
  end;
end;

procedure TFadeThread.SetInitializationDone(const Value: Boolean);
begin
  FInitializationDone := Value;
end;

procedure TSplashForm.SplashTimerTimer(Sender: TObject);
begin
  SplashTimer.Enabled := False;
  FadeThread.FadeActive := True;
end;

procedure TSplashForm.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
  CanClose := FadeThread.Terminated;
end;

procedure TSplashForm.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
  FadeThread := nil;
  Action := caFree;
end;
Was mache ich falsch? Oder ist das Problem, dass meine Variante so gar nicht realisierbar ist? Ich hab hier einen anderen Thread verlinkt gefunden mit Fade-In, aber da wurde das ei OnAvtivate im selben Thread gemacht - was dazu führt, dass die Startzeit um die Fade-In-Zeit verlängert wird - aber ich wollte ja eigentlich zumindest die gefühlte Wartezeit verkürzen

Edit: Ich habe es jetzt mal wiefolgt gemacht: Die SplashForm wird in der DPR erzeugt und an den Thread zugewiesen (welcher erst nach der Zuweisung gestartet wird). Solange FInitializationDone noch auf false steht, wird ohne Synchronisierung gefadet, danach mit. Ich das in Ordnong? Oder nicht?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 9 von 10   « Erste     789 10      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz