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/)
-   -   ProgressBar mit Timer synchron (https://www.delphipraxis.net/72248-progressbar-mit-timer-synchron.html)

bonanza 27. Jun 2006 16:56


ProgressBar mit Timer synchron
 
Hi,

ich möchte eine ProgressBar mit einem Timer synchron laufen lassen...also z.b. alle 30 sek wird bei mir etwas ausgeführt und die PB soll eben anzeigen, wie "weit" der fortschritt ist.


Wie kann ich das machen ?

fLaSh11 27. Jun 2006 16:57

Re: ProgressBar mit Timer synchron
 
Delphi-Quellcode:
ProgressBar1.StepIt;
in Timer1.OnTimer schreiben

mkinzler 27. Jun 2006 16:59

Re: ProgressBar mit Timer synchron
 
Und einen Redraw des Selbigen veranlassen.

bonanza 27. Jun 2006 16:59

Re: ProgressBar mit Timer synchron
 
also mein Timer steht auf 30000 also 30 sek...wenn ich dann
Delphi-Quellcode:
ProgressBar1.StepIt;
in ONtimer reinschreibe, passiert garnix...

mkinzler 27. Jun 2006 17:01

Re: ProgressBar mit Timer synchron
 
Was hast du als Maximum gesetzt?

bonanza 27. Jun 2006 17:02

Re: ProgressBar mit Timer synchron
 
edit:// ach quatsch, das Interval des Timers also in diesem Fall 30000...

fLaSh11 27. Jun 2006 17:02

Re: ProgressBar mit Timer synchron
 
und ist der Timer auch eingeschaltet?

bonanza 27. Jun 2006 17:05

Re: ProgressBar mit Timer synchron
 
das ist der Code...hoffe mal, dass ich nix vergessen habe...
Delphi-Quellcode:
//...
procedure TForm1.Button1Click(Sender: TObject);

begin
akt_int := strtoint(edit1.text);
timer1.Enabled := true;
timer1.interval := (akt_int*1000);
Button1.Caption:= 'gestartet...mit'+edit1.text+' Sek.';
Application.ProcessMessages;
ProgressBar1.Enabled := true;
progressbar1.Min := 0;
progressbar1.Max := Timer1.Interval;
end;


procedure TForm1.Ontimer(Sender: TObject);
   
begin                    
ProgressBar1.StepIt;
end;
//....

mkinzler 27. Jun 2006 17:10

Re: ProgressBar mit Timer synchron
 
Delphi-Quellcode:
progressbar1.Max := Timer1.Interval;
Dann ist es ja Klar, du müßtest das Programm ewig Laufen lassen bevor du was siehst. (Alle 30 Sek ein Punkt ~ 1/1000)!.

Es fehlt auch der redraw der Progressbar:

Delphi-Quellcode:
procedure TForm1.Ontimer(Sender: TObject);
begin                    
    ProgressBar1.StepIt;
    ProgressBar1.Update;
end;

bonanza 27. Jun 2006 17:14

Re: ProgressBar mit Timer synchron
 
Delphi-Quellcode:
//...
procedure TForm1.Button1Click(Sender: TObject);

begin
akt_int := strtoint(edit1.text);
timer1.Enabled := true;
timer1.interval := (akt_int*1000);
Button1.Caption:= 'gestartet...mit'+edit1.text+' Sek.';
Application.ProcessMessages;
ProgressBar1.Enabled := true;
progressbar1.Min := 0;
progressbar1.Max := 30;
end;

procedure TForm1.Ontimer(Sender: TObject);
begin                    
    ProgressBar1.StepIt;
    ProgressBar1.Update;
end;
so funktioniert es aber auch net...der macht alle 30 sek knapp 1/3 oder so :-\
Wie kann ich das denn abhänig von der Timer1.Interval-Zeit ?
also, dass das immer passt, egal was man in Edit1.text eingibt ?

mkinzler 27. Jun 2006 17:18

Re: ProgressBar mit Timer synchron
 
Wie lang soll es den brauchen, bis der Balken voll ist?

bonanza 27. Jun 2006 17:22

Re: ProgressBar mit Timer synchron
 
ja genau, wenn der balken voll ist, soll der Timer abgelaufen sein.

mkinzler 27. Jun 2006 17:32

Re: ProgressBar mit Timer synchron
 
Das kannst du erreichen, wenn du das maximum auf 1 setzt. Dann macht aber ei Fortschrittsbalken wenig Sinn ;-). Oder du Verringerst das Intervall auf eine Zehntel und setzt Max auf 10;

Flare 27. Jun 2006 17:36

Re: ProgressBar mit Timer synchron
 
Eigentlich müsste er einen zweiten Timer einbauen, der in einem kleineren Intervall die Fortschrittanzeige antreibt, wobei der dann mit dem 1. Timer nicht wirklich synchron wäre (irgendwo schon). Liegt daran, dass man die aktuelle Position von einem Timer nicht abfragen kann.


Flare

jfheins 27. Jun 2006 17:43

Re: ProgressBar mit Timer synchron
 
Wie wärs mit eine Variable, die du im OnTimer auf % 10 prüfst - dann wird dein eigentliches OnTimer nur alle 10 Intervalle aufgerufen, du kannst aber bei jedem den Fortschrittsbalken aktualisieren ?

Delphi-Quellcode:
var i: Integer;

procedure TForm1.Ontimer(Sender: TObject);
begin
  if i mod 10 = 0 then
  begin
    // was machen
  end;
                   
    ProgressBar1.StepIt;
    ProgressBar1.Update;
end;

bonanza 27. Jun 2006 19:29

Re: ProgressBar mit Timer synchron
 
Ich versteh das net, wie ich das jetzt realisieren soll...

könnte mir vielleicht jemand ein passendes Beispiel geben, bei dem die beiden eben synchron laufen und die Prpogressbar "voll" ist, wenn der Timer abgelaufen ist.

vielen dank schonmal im voraus

mkinzler 27. Jun 2006 19:40

Re: ProgressBar mit Timer synchron
 
Soll der Timer später noch weitere Funktionen bekommen oder geht es wirklich nur um eine Verzögerung? Wenn er nur nur zur Verzögerung dient, würde ich es mit einem Timer machen sonst würde ich es wie jfheins vorgeschlagen hat machen.

bonanza 27. Jun 2006 19:55

Re: ProgressBar mit Timer synchron
 
der timer hat nur die funktion, zu zählen, bis die 30sek voll sind und die progressbar "anzutreiben". Wenn der Timer abgelaufen ist, wird aber noch eine andere funktion ausgeführt.

mkinzler 27. Jun 2006 20:00

Re: ProgressBar mit Timer synchron
 
Dann würde ich es so machen:

Delphi-Quellcode:
timer1.interval := (akt_int*100);
Button1.Caption:= 'gestartet...mit'+edit1.text+' Sek.';
Application.ProcessMessages;
ProgressBar1.Enabled := true;
progressbar1.Min := 0;
progressbar1.Max := 10;
Nun ist der Intervall des Timers 1/10 von der Wartezeit, d.h der Timer wird 10mal ausgelöst und da Max 10 ist, ist der Fortschrittsbalken am Ende angekommen.

bonanza 27. Jun 2006 20:03

Re: ProgressBar mit Timer synchron
 
also das funktioniert nicht....

wo soll denn das "stepit" hin ? eben wurde gesagt in "ontimer" aber ist das nicht viel zu spät ? denn der wird ja erst ausgelöst, wenn die 30sek abgelaufen sind.

mkinzler 27. Jun 2006 20:12

Re: ProgressBar mit Timer synchron
 
Deshalb hab ich ja den das Timer-Intervall auf 3 Sekunden gestellt.

xZise 27. Jun 2006 20:54

Re: ProgressBar mit Timer synchron
 
Also ich habe es damit gelöst, dass der Timer immer nur einen teil der eigentlichen Zeit brauch um das Ereignis auszulösen.

Bsp:
Code:
[*]Gesamtdauer : 10 Sekunden[*]Schritte (Fortschrittbalken) : 100
d.h. ich habe geschrieben, das das Intervall:
Delphi-Quellcode:
Timer.Intervall := (Gesamtdauer * 1000) / Schritte
d.h.

Delphi-Quellcode:
procedure TForm1.TimerTimer(Sender : TObject)
begin
  ProgessBar.Position := ProgressBar.Position + 1 //Ich kenne noch nicht Stepit, aber ist das das gleiche?
  if ProgessBar.Position = ProgressBar.Max {allternativ statt "ProgessBar.Max" auch "100" o.ä.} then
  begin
    Timer.Enabled := false;
    Showmessage('Essen ist fertig ^^');
    // ggf:
    //ProgessBar.Position := 0;
  end;
end;

DP-Maintenance 28. Jun 2006 10:35

DP-Maintenance
 
Dieses Thema wurde von "Phoenix" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Timer ist VCL, also *schieb* ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:18 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