Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi progressbar problem/gauge (https://www.delphipraxis.net/144264-progressbar-problem-gauge.html)

painrestricter 3. Dez 2009 17:07


progressbar problem/gauge
 
Hallo,

kam gerade auf die idee mir einen kleinen wecker (eher countdowner) zu schreiben, weil ich immer meine pizza anbrennen lasse :shock:

klappt eig alles, nur wollte ich den fortschritt, also das zählen der sekunden noch festhalten, zb in einer progressbar (ich hab sgauge genommen, weil da so schön die prozent drinnen stehen ^^)

nur schaff ich das irgendwie nicht, dass die sekunden/millisekunden in der progressbar angezeigt werden.

weiterhin ist zu erwähnen, dass ich noch nie mit progressbars gearbeitet habe.

Delphi-Quellcode:
var
  Form1: TForm1;
  zeit, ms : integer;

implementation

{$R *.dfm}

procedure TForm1.sButton2Click(Sender: TObject);
begin
messagedlg('blabla', mtinformation, mbokcancel, 0);
end;

procedure TForm1.sButton1Click(Sender: TObject);
var i : integer;
begin
zeit := strtointdef(sedit1.text, 1);
if sedit1.text = '' then begin
  sedit1.text := '1';
 end;
ms := zeit * 60 * 1000;
timer1.Interval := ms;
sgauge1.MinValue := 0;
sgauge1.MaxValue := ms;
for i := 1 to 100 do begin
 sgauge1.progress := sgauge1.Progress +1 ;
end;
Timer1.Enabled := true;
Showmessage('Countdown beginnt, alarm in ' + inttostr(zeit) + ' minute/n');

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin
 for i := 1 to 100 do begin
   windows.Beep(1000,100)
 end;
sedit1.Clear;
end;

end.
#

danke

shmia 3. Dez 2009 17:56

Re: progressbar problem/gauge
 
Du kannst mein Countdown Programm als Startpunkt verwenden und für deine Zwecke umbauen.

painrestricter 4. Dez 2009 15:40

Re: progressbar problem/gauge
 
naja hat mir jetzt nicht richtig geholfen, die progressbar funktioniert immer noch nicht ( bzw immer noch falsch)

Whatever 4. Dez 2009 16:09

Re: progressbar problem/gauge
 
Hallo,
guck dir deinen Quelltext nochmal an...
So wie er jetzt ist, wird .Progres des Gauges unabhängig vom .MaxValue um 100 erhöht. Dies geschieht bevor der Countdown begonnen hat. Bei einem Gauge gibt MaxValue den Wert für 100% an. Bei 10 Minuten wären 100% also 600000(ms) und so ist es kein Wunder das Du nichts von deinem Progress siehst(,da Du ja bedingungslos um 100 erhöhst)...
Siehst Du den Fehler?
Grüße

painrestricter 4. Dez 2009 17:34

Re: progressbar problem/gauge
 
ja, ich seh ihn, aber bin am verzweifeln wie man ihn beseitigen kann

ist doch eigentlich ganz leicht, nur leider scheiterts gerade bei mir an der logik

Whatever 4. Dez 2009 18:32

Re: progressbar problem/gauge
 
Ganz genau eigentlich ist es ganz leicht, also möchte ich die Lösung aus dir rauskitzeln :-D
Wo scheiterts denn genau? Welcher Schritt ist nicht klar?

painrestricter 4. Dez 2009 18:56

Re: progressbar problem/gauge
 
naja ich muss doch irgendwie den timer mit der progress bar synchronisieren oder?
start wert ist 0, max wert ist ms, also die millisekunden, die der countdown runterzählt

aber was ich auch versuche, sobald ich den start btn drücke, schießt die progressbar auf 100%

Whatever 4. Dez 2009 19:12

Re: progressbar problem/gauge
 
sprichst Du das Gauge immernoch mit der for-Schleife an? Wenn ja dann dann mach doch sowas hier.
Delphi-Quellcode:
for i:= 1 to Gauge1.MaxValue do
  begin
    Gauge1.Progress:= Gauge1.Progress +1;
    Sleep(1);
  end;
Eine Alternative ist natürlich noch, den Gauge.Progress über den Timer zu verändern. Hierzu müsste dann der Timer in kleineren Intervalles ausgeführt werden und abfragen wann das Gauge voll ist.
(Dass das Gauge auf Max schießt liegt daran, dass die Schleife so schnell abgearbeitet wird, dass keine Zeit bleibt das Ergebnis anzuzeigen. Kleine unterbrechungen ruft Application.ProcessMessages hervor.)

wicht 4. Dez 2009 19:16

Re: progressbar problem/gauge
 
Ich versuchs mal.. aber nur weil mir langweilig ist, da ich auf eventuelle Antworten auf meinen Thread warte... :-D

Delphi-Quellcode:
procedure TForm1.sButton1Click(Sender: TObject);
var i : integer;
begin
  zeit := strtointdef(sedit1.text, 1);
  if sedit1.text = '' then begin
    sedit1.text := '1';
  end;
  ms := zeit * 60 * 1000;
  // Das Intervall bestimmt, in welchen Abständen der Timer aufgerufen wird.
  // Also nehmen wir 1000ms = 1sek
  // Die Schleife war hier völlig über, weil sie nichts anderes gemacht
  // hat, als sgauge1.Position auf 100 zu setzen (wenn Position 0 war).
  timer1.Interval := 1000;
  sgauge1.Position := 0;
  sgauge1.MinValue := 0;
  sgauge1.MaxValue := ms;
  Timer1.Enabled := true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Timer1.Enabled := false;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
begin
  // Und hier wird der Progress eben erhöht.
  // Warum sollte hier 100 mal gebeept werden?
  sgauge1.progress := sgauge1.progress + 1000;
  if sgauge1.progress = sgauge1.max then
  begin
    // Wenn Ende erreicht, piepen
    windows.beep(1000, 100);
  end;
end;
Hui, der rote Kasten... Whatevers Beispiel wäre auch okay, wenn das Timer-Intervall auf 1000 stehen würde, man auf Gauge1.Progress 1000 addieren würde und man Sleep(1000) benutzen würde. Das liegt daran, weil du hier mit Millisekunden hantierst - warum eigentlich?

HTH - und weil Freitag ist und ein Bierchen drin ist keine Garantie auf Richtigkeit, ausserdem ist alles ungetestet.


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