Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Erbitte Hilfe bei MarqueeProgressBar !! (https://www.delphipraxis.net/95934-erbitte-hilfe-bei-marqueeprogressbar.html)

Störtebeker 16. Jul 2007 12:23


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:
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.
das wäre der code, wobei nes sich bei Form5 um die SplashScreen Form handelt.

scrat1979 16. Jul 2007 12:32

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Hallo!

Hilfe eventuell ein Application.ProcessMessages weiter??

Delphi-Quellcode:
Application.CreateForm(TForm4, Form4);
MarqueeProgressBar1.StepBy(25);
Application.ProcessMessages;
SCRaT

Störtebeker 16. Jul 2007 12:35

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.

Luckie 16. Jul 2007 12:36

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Ruf mal nach
Delphi-Quellcode:
MarqueeProgressBar1.StepBy(25);
ein
Delphi-Quellcode:
MarqueeProgressBar1.Refresh
auf.

Störtebeker 16. Jul 2007 12:40

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?

KrasserChecker 16. Jul 2007 13:28

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.

Störtebeker 16. Jul 2007 13:40

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.

Matze 16. Jul 2007 13:44

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Bei Sleep() friert das ganze Programm ein. Nutze stattdessen lieber DelayDelay.

Störtebeker 16. Jul 2007 14:07

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Und wo baue ich dieses Delay ein ??

Apollonius 16. Jul 2007 14:17

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Statt sleep.

Störtebeker 16. Jul 2007 14:22

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:

Störtebeker 16. Jul 2007 14:26

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Sollte ich vielleicht noch dazu sagen, dass die Eigenschaft Sleep jeweils unter "FormCreate" steht?

Matze 16. Jul 2007 14:27

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Klick doch meinen Link an. Da stehen ein paar Delay-Funktionen.

Apollonius 16. Jul 2007 14:29

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?

Störtebeker 16. Jul 2007 14:54

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
meinst du so:

Delphi-Quellcode:

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.
programm startet zwar aber leider nicht der gewünschte effekt.
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.

Störtebeker 16. Jul 2007 15:10

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.

Apollonius 16. Jul 2007 15:13

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Letzteres. Und wo vorher im Code Sleep(xxx) stand, muss jetzt delay(xxx) stehen.

KrasserChecker 16. Jul 2007 15:47

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.

Prototypjack 16. Jul 2007 16:21

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:

Luckie 16. Jul 2007 16:24

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Und eine künstliche Verzögerung halte ich auch nicht für sehr seriös.

Störtebeker 16. Jul 2007 16:45

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.

KrasserChecker 16. Jul 2007 16:52

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Du darfst den Splashscreen natürlich NICHT gleich vor dem Application.Run freigeben.
Sondern erst später:

Delphi-Quellcode:
Splash := TSplash.Create(nil);
try
  Splash.Show;

  // andere Formulare erzeugen

  Application.Run;
finally
  Splash.Free;
end;
Noch besser wäre es sogar, wenn auf dem Splashscreen (wenn der Progressbar voll ist) sowas hier gemacht wird:

"Splash.Close;"
"Hauptfenster.Show"

Störtebeker 16. Jul 2007 17:10

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:

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.
und er kommt, wenn ich auf dem Main Formular auf den Button gehe, der das Programm schließen soll mit einer "AccessViolation"

KrasserChecker 16. Jul 2007 17:23

Re: Erbitte Hilfe bei MarqueeProgressBar !!
 
Delphi-Quellcode:
Form5.free;
Form5.close; // Splash Form
Wird wohl kaum funktionieren. Du kannst ein Formular ja schlecht noch schliessen, wenn Du den Speicher schon freigegeben hast. ;)

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;

Störtebeker 16. Jul 2007 17:56

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

Hafish 16. Jul 2007 19:30

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^^

Störtebeker 16. Jul 2007 19:53

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 17:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz