![]() |
Erbitte Hilfe bei MarqueeProgressBar !!
Ich verwende für meinen SplashScreen eine MarqueeProgressBar, das Problem ist nur, dass sie sich im Minutentakt einen Schritt weiter bewegt und nicht flüssig läuft, wie man das von Windows XP kennt. :(
Delphi-Quellcode:
das wäre der code, wobei nes sich bei Form5 um die SplashScreen Form handelt.
program Project4;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas' {Form3}, Unit4 in 'Unit4.pas' {Form4}, SplashScreen in 'SplashScreen.pas' {Form5}; {$R *.res} begin Application.Initialize; Form5 := TForm5.Create(Application); with TForm5.Create(nil) do try Form5.Show; Form5.Update; MarqueeProgressBar1.Max := 100; Show; // Startbildschirm mit ProgressBar anzeigen Update; // Anzeige von Form5 auslösen Application.Initialize; Application.Title := 'Project4'; Application.CreateForm(TForm4, Form4); MarqueeProgressBar1.StepBy(25); Application.CreateForm(TForm1, Form1); MarqueeProgressBar1.StepBy(25); Application.CreateForm(TForm3, Form3); MarqueeProgressBar1.StepBy(25); Application.CreateForm(TForm2, Form2); MarqueeProgressBar1.StepBy(25); Finally free; Form5.visible :=false; end; Application.Run; end. |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Hallo!
Hilfe eventuell ein Application.ProcessMessages weiter??
Delphi-Quellcode:
SCRaT
Application.CreateForm(TForm4, Form4);
MarqueeProgressBar1.StepBy(25); Application.ProcessMessages; |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Ne, leider hat das nicht geholfen.
Code sieht jetzt so aus, und bringt leider auch keine Hilfe:
Delphi-Quellcode:
program Project4;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas' {Form3}, Unit4 in 'Unit4.pas' {Form4}, SplashScreen in 'SplashScreen.pas' {Form5}; {$R *.res} begin Application.Initialize; Form5 := TForm5.Create(Application); with TForm5.Create(nil) do try Form5.Show; Form5.Update; MarqueeProgressBar1.Max := 100; Show; // Startbildschirm mit ProgressBar anzeigen Update; // Anzeige von Form5 auslösen Application.Initialize; Application.Title := 'Project4'; Application.CreateForm(TForm4, Form4); MarqueeProgressBar1.StepBy(25); Application.ProcessMessages; Application.CreateForm(TForm1, Form1); MarqueeProgressBar1.StepBy(25); Application.ProcessMessages; Application.CreateForm(TForm3, Form3); MarqueeProgressBar1.StepBy(25); Application.ProcessMessages; Application.CreateForm(TForm2, Form2); MarqueeProgressBar1.StepBy(25); Application.ProcessMessages; Finally free; Form5.visible :=false; end; Application.Run; end. |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Ruf mal nach
Delphi-Quellcode:
ein
MarqueeProgressBar1.StepBy(25);
Delphi-Quellcode:
auf.
MarqueeProgressBar1.Refresh
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
:( Ne, hat leider auch nichts gebracht.
:?: Kann es vielleicht sein, dass ich die restlichen Formen schon ganz anders aufrufen muss? |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Hallo,
dauert das Erstellen der anderen Formulare so lange? Wenn das "...CreateForm()" jedesmal so viel Zeit in Anspruch nimmt tut sich natürlich während dessen nichts im ProgressBar. Du setzt die Anzeige ja immer um 25 hoch. Das heißt aber nicht(!), daß die Anzeige dann autom. schön sanft den Fortschrittsbalken länger macht, sondern daß der Balken "ruckartig" (und vor allen sofort) verlängert wird. Vermutlich wirst Du das anders lösen müssen (Stichwort: Hintergrundthread). Allerdings ist dann dein Hauptproblem, daß Du nicht weißt, wie lange das erzeugen eines einzelnen Formulars dauert. |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Na die Formulare sind mit der Eigenschaft "sleep(2500);" versehen, damit der SplashScreen auch ein bisschen länger zu sehen ist.
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Bei Sleep() friert das ganze Programm ein. Nutze stattdessen lieber
![]() |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Und wo baue ich dieses Delay ein ??
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Statt sleep.
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
wenn ich jetzt SLEEP einfach durch DELAY austausche, sagt er mir, dass DELAY ein undeclared identifier ist. Meine Frage nun, wo muss ich DELAY deklarieren? :oops:
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Sollte ich vielleicht noch dazu sagen, dass die Eigenschaft Sleep jeweils unter "FormCreate" steht?
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Klick doch meinen Link an. Da stehen ein paar Delay-Funktionen.
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
In eine deiner Units schreibst du unter "formx:TFormx;" den Prozedurkopf, wahrscheinlich "procedure delay(milliseconds:cardinal)" oder so ähnlich. In die Implementation schreibst du irgendwo, meintewegen direkt vor "end.", die gesamte Prozedur mit Prozedurkopf. In alle anderen Units, in denen delay verwendet wird, musst du die Unit, in der du delay deklariert hast, jetzt noch unter "uses" eintragen, also "uses windows, ..., MeineUnit;"
Hoffe geholfen zu haben Apollonius Edit: Eigenschaft sleep? |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
meinst du so:
Delphi-Quellcode:
programm startet zwar aber leider nicht der gewünschte effekt. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, WinXP, ExtCtrls, StdCtrls; type TForm1 = class(TForm) WinXP1: TWinXP; Panel1: TPanel; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Button1: TButton; Button2: TButton; Label6: TLabel; Label7: TLabel; Label8: TLabel; Label9: TLabel; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; procedure delay(milliseconds:integer); implementation uses Unit2, Unit4; {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); begin Form2.show; Form1.Hide; end; procedure TForm1.Button1Click(Sender: TObject); begin Form1.Hide; Form4.show; end; procedure delay(milliseconds:integer); begin delay(3500); end; end. Und bei deinem link, da blick ich nicht ganz durch die Codes durch. Das Problem jetzt ist, dass ich leider keine Möglichkeit habe das zu überprüfen, weil der SplashScreen nur kurz aufleuchtet und dann zum eigentlichen Programm übergeht. |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
oder eher so:
Delphi-Quellcode:
unit Unit4; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, WinXP, ExtCtrls, jpeg; type TForm4 = class(TForm) Panel1: TPanel; Edit2: TEdit; Edit1: TEdit; Button1: TButton; WinXP1: TWinXP; Label4: TLabel; Label6: TLabel; Label3: TLabel; Label1: TLabel; Label2: TLabel; Label5: TLabel; Label7: TLabel; Image1: TImage; Button2: TButton; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form4: TForm4; procedure delay(milliseconds:logint); implementation uses Unit1; {$R *.dfm} procedure TForm4.Button2Click(Sender: TObject); begin close; end; procedure TForm4.Button1Click(Sender: TObject); begin Form1.show; Form4.Hide; end; procedure delay(milliseconds:logint); var start,stop:logint; begin start := gettickcount; repeat stop := gettickcount; application.processmessages; until (stop - start ) >= seconds; end; end. |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Letzteres. Und wo vorher im Code Sleep(xxx) stand, muss jetzt delay(xxx) stehen.
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Warum eigentlich so umständlich?
Wann Du die Verzögerung sowieso auf jedem Formular "manuell" mit sleep machst, nur damit man den Splashscreen sieht, dann kannst Du doch auch einfach auf den Splashscreen einen timer legen, der schön brav den Progressbar füllt. Wenn der Progressbar voll ist schliesst Du dann den Splashscreen & zeigst statt dessen den Hauptbildschirm an. |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Memo an mich selbst: Sieh nach, ob der Beitrag über mehrere Seiten geht bevor du antwortest :wall:
Gruß, Max :mrgreen: |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Und eine künstliche Verzögerung halte ich auch nicht für sehr seriös.
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Estmal Thx. für eure tatkräftigen Ideen. Er kommt zwar nicht mit irgendwelchen Fehlern, jedoch ist es sowohl mit der DELAY-Variante als auch mit der TIMER-Variante so, dass der Splash nur noch kurz aufblitzt, und zum eigentlichen Program wechselt, wenn man da noch was "schrauben" könnte, wäre es denke ich fast perfekt.
|
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Du darfst den Splashscreen natürlich NICHT gleich vor dem Application.Run freigeben.
Sondern erst später:
Delphi-Quellcode:
Noch besser wäre es sogar, wenn auf dem Splashscreen (wenn der Progressbar voll ist) sowas hier gemacht wird:
Splash := TSplash.Create(nil);
try Splash.Show; // andere Formulare erzeugen Application.Run; finally Splash.Free; end; "Splash.Close;" "Hauptfenster.Show" |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Hat schon ein bisschen weiter geholfen. Nun ist das Problem, dass der SplashScreen aufblendet udn gleichzeitig das eigentliche Programm, also es blendet sich praktisch die Form, die erst nach dem SplashScreen kommen soll ebenfalls auf und schiebt sich in den Vordergrund.
Delphi-Quellcode:
und er kommt, wenn ich auf dem Main Formular auf den Button gehe, der das Programm schließen soll mit einer "AccessViolation"program Project4; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {Form2}, Unit3 in 'Unit3.pas' {Form3}, Unit4 in 'Unit4.pas' {Form4}, SplashScreen in 'SplashScreen.pas' {Form5}; {$R *.res} begin Application.Initialize; Form5 := TForm5.Create(Application); with TForm5.Create(nil)do try Form5.Show; Form5.Update; MarqueeProgressBar1.Max := 100; Show; // Startbildschirm mit ProgressBar anzeigen Update; // Anzeige von Form5 auslösen Application.Initialize; Application.Title := 'Project4'; Application.CreateForm(TForm4, Form4); MarqueeProgressBar1.StepBy(25); Application.CreateForm(TForm1, Form1); MarqueeProgressBar1.StepBy(25); Application.CreateForm(TForm3, Form3); MarqueeProgressBar1.StepBy(25); Application.CreateForm(TForm2, Form2); MarqueeProgressBar1.StepBy(25); Application.Run; Finally Form5.free; Form5.close; // Splash Form Form4.Show; // Main Form end; end. |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Delphi-Quellcode:
Wird wohl kaum funktionieren. Du kannst ein Formular ja schlecht noch schliessen, wenn Du den Speicher schon freigegeben hast. ;)
Form5.free;
Form5.close; // Splash Form Außerdem dachte ich auch eher an sowas hier auf dem Splash-Screen:
Delphi-Quellcode:
if ProgressBar.Percent = 100 then
begin Close; Application.Run; end; |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Das mit dem Speicher und dem Schließen leuchtet mir ein aber bei dem anderen muss ich leider sagen:
(Sry, aber :wiejetzt:) |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Ich versteh das nicht ganz, du scheinst ja gar keine MarqueeProgressBar zu verwenden, sondern eine normale :gruebel:
Wenn du eine MarqueeProgressBar verwendest brauchst du doch gar nicht von Position 0-100 zu kommen. Außerdem ist es wenig bis gar nicht zweckdienlich auf einem Splash Screen eine normale Progressbar anzuzeigen, denn wie schon gesagt weiß man ja nicht wann das Programm denn wirklich fertig ist. Wenn man bei einer Progressbar nicht abschätzen kann wie lange es noch dauert kann man sie sich sparen! Warum benutzt du die MarqueeProgressBar nicht einfach so wie sie vorgesehen ist? Einfach auf ein Formular, Timer dazu, der alle 50 ms die Bar eins erhöht und fertig. Und wenn du jetzt nicht irgendwelche Thread-Geschichten anfangen willst dann benutze doch einfach die Windows Threads: Pack den Splash Screen in ne eigene Exe, dann startest du die bei Programmstart (evtl mit Parameter) und vor dem Aufruf des Hauptformulars schließt du die Splash-Screen Exe wieder. Fertig. So hast du keine Probleme mit Refresh/Processmessage etc., da die exe alles selbst verwaltet. Ach so: Benutzt nie nie nie Sleep bei nem Splash Screen. Splash Screens sollen dem Benutzer bei längeren Programm-Starts zeigen dass noch was passiert und nicht dafür sorgen, dass der Programm Start länger dauert^^ |
Re: Erbitte Hilfe bei MarqueeProgressBar !!
Thx. für eure Hilfe, aber ich habe mich jetzt erstmal zumindest für den SplashScreen für die Variante entschieden, die man auch bei ADOBE Produkten im SplashScreen findet.
- Keine Progressbar sondern da wird dann praktisch in Worten angezeigt, was gerade geladen wird. - Das Label (was sich auf dem SplashScreen) wechselt dann halt immer mit jeder Form. z.b: Form1: Initialize... Form2: Reading fonts... - Komme ich ein bisschen besser mit zurecht. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:37 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 by Thomas Breitkreuz