Entwickler-Ecke

Dateizugriff - SplashScreen und ProgressBar-Problem.. ;)


Terra23 - Mo 01.09.08 15:36
Titel: SplashScreen und ProgressBar-Problem.. ;)
Hi!

Ich habe mit Hilfe der Suche herausgefunden, wie ich einen SplashScreen in mein Programm einbauen kann. Darauf befindet sich ein Timer, der im OnTimer-Ereignis das ProgressBar (das oder der?) um 1 erhöht.

Nun kommt mein Problem:

Es tut sich dort rein gar nix und der SplashScreen verschwindet, bevor auch nur irgendwas mit dem ProgressBar passiert ist.

Was mache ich falsch?

Die bisherigen Suchergebnisse haben mich nicht wirklich vorangebracht.

Bisher sieht meine DPR so aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
program DeckButler;

uses
  Forms,
  DeckButler_Unit in 'DeckButler_Unit.pas' {Form1},
  MutexConfig in 'MutexConfig.pas',
  Sammlungen_Unit in 'Sammlungen_Unit.pas' {Form2},
  Splash_Unit in 'DB-Bilder\Splash_Unit.pas' {SplashForm};

{$R *.res}

begin

  /// SplashScreen erstellen
  SplashForm:=TSplashForm.Create(Application);

  Try
  /// SplashScreen anzeigen
  SplashForm.Show;
  SplashForm.Update;

  Application.Initialize;
  Application.Title := 'DeckButler 2.0 BETA';
  Application.HelpFile := 'D:\Alex\Delphi\Neue Projekte\DeckButler\DeckButler.chm';
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);


  /// SplashScreen ausblenden
  If SplashForm.ProgressBar1.Position=100
  Then SplashForm.Hide;

  Finally
  /// SplashScreen freigeben
  SplashForm.Free;
  End;
  Application.Run;
end.


Hinzu kommt halt, dass ich nicht weiß, ob ich evtl. in der DPR was verändern muss oder so. Würde ich hier z.B. ein Sleep einbauen (was mein Delphi mit ner Fehlermeldung verweigert), dann steht doch IMHO das gesamte Programm, oder? Also somit auch der SplashScreen.

Wäre nett, wenn mir jemand mal auf die Sprünge helfen würde. Ich brauche nur nen Denkanstoß, der mich weiterbringt, keinen vorgekauten Code zum kopieren und einfügen.

MfG

Terra

PS: Ich weiß, die Lesbarkeit meines Codes ist furchtbar. Ich hab's von der Schule her so gelernt und ich muss miur erstmal die Lesbarkeit einimpfen lassen.


Gausi - Mo 01.09.08 15:44

Wenn du eine Fortschrittsanzeige im Splashscrren haben willst, würde ich das über ein paar Zwischenzeilen im Code von MainForm.Create machen. Eine Prozent-genaue Anzeige macht da eh keinen Sinn, von daher reicht es imho aus, wenn man da ab und zu Sachen ausgeben lässt wie "Einstellungen geladen", "verarbeite Einstellungen...", "Lade Daten...", etc.

btw.: Das ist ganz böse: ;-)

Delphi-Quelltext
1:
Application.HelpFile := 'D:\Alex\Delphi\Neue Projekte\DeckButler\DeckButler.chm';                    


Terra23 - Mo 01.09.08 16:03

Warum im Create-Ereignis der Main-Form? Die ist ja zu diesem Zeitpunkt noch gar nicht sichtbar, weil der SplashScreen "davor" ist.

Das mit der Hilfe-Datei habe ich entfernt, zumal die Hilfe-Datei ja gar nicht mehr exisitert. Warum ist das böse? Weil dieser Pfad nur bei mir existiert???

Terra


Hidden - Mo 01.09.08 16:10

user profile iconTerra23 hat folgendes geschrieben:
Weil dieser Pfad nur bei mir existiert?

Du hast es erraten ;)

Nimm lieber so 'was:

Delphi-Quelltext
1:
2:
Application.HelpFile := ExtractFilePath(ParamStr(0)) + 'DeckButler.chm';
//nimmt den Ordner, in dem sich die .exe befindet und wählt darin eine Datei namens 'DeckButler.chm' als HelpFile aus


mfG,


Terra23 - Mo 01.09.08 16:15

OK, aber das hilft mir trotzdem nicht bei meinem ProgressBar-Problem.

Der bewegt sich nicht und der SplashScreen verschwindet vorher.

Terra


Gausi - Mo 01.09.08 16:38

Du erzeugst zuerst den Splashscreen und zeigst ihn an. Dann kommt der Rest, der wohl etwas länger dauert. Damit es dem User nicht langweilig wird, soll dabei der Splashscreen einen Fortschritt anzeigen, oder habe ich da was falsch verstanden?

Deine Methode funktioniert nicht, weil die Timer Message nicht verarbeitet wird, während die lange Create-Methode der Hauptform arbeitet. Wenn in dieser aber so etwas steht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
macheinbissel;
SplashScreen.Label1.Caption := 'Ein bissel was getan...';
Machnocheinbissel;
SplashScreen.Label1.Caption := 'Noch ein bissel was getan...';
Machnochmehr;
SplashScreen.Label1.Caption := 'Fast fertig...';


Dann sollte das funktionieren. Anstelle des Labels kann man natürlich auch ein Progressbar manuell hochfahren. Evtl. muss man auch das Neuzeichnen veranlassen mit SplashScreen.Update; oder so ähnlich.


Terra23 - Mo 01.09.08 16:59

Danke, Gausi.

Hab's inzwischen nach einigem hin und her herausgefunden und es klappt so, wie ich es mir vorgestellt habe.

Gruß,

Terra