Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   FreePascal Progressbar rückwärts? (https://www.delphipraxis.net/192373-progressbar-rueckwaerts.html)

Maurooon 12. Apr 2017 19:09

Delphi-Version: 5

Progressbar rückwärts?
 
Hey Leute,

ich würde gerne eine Art Tank für ein Spiel machen, der sich leert, wenn man Gas gibt. Wenn er leer ist, soll man sich nicht mehr bewegen können. Lässt sich sowas mit einer Progressbar lösen oder geht diese nicht rückwärts?

Hat jemand eine Idee wie ich einen Tank optisch realisieren kann, der nach sagen wir mal 10 Sekunden leer ist? Wenn das mit einer Progressbar gehen würde wäre das mega. Falls ja: kann man die Progressbar farblich noch anpassen?

Viele liebe Grüße

a.def 12. Apr 2017 19:10

AW: Progressbar rückwärts?
 
Nimm doch ein TGauge und einen Timer?

Maurooon 12. Apr 2017 19:18

AW: Progressbar rückwärts?
 
Zitat:

Zitat von a.def (Beitrag 1367415)
Nimm doch ein TGauge und einen Timer?

Ja genau so etwas habe ich mir vorgestellt. Wusste nur nicht, dass es TGauge gibt. Kannst du mir noch sagen, wie man das benutzt? LG

nahpets 12. Apr 2017 19:43

AW: Progressbar rückwärts?
 
Für so optische Spielereien nehme ich gerne die TQProgressBar
Bei ihr hat man mehrere Optionen für die Art der Darstellung, neben horizontal und vertikal gibt es noch Farbverläufe, anzeige der inaktiven Positionen. Man kann es ähnlich zu den LED-Anzeigen von den Kassettenrecordern aus vergangenen Zeiten machen ...

Funktioniert aber letztlich wie 'ne Progressbar. Min auf 0 setzen Max auf höchsten Füllstand, Position von Max langsam runter bis 0 setzen. Und schon hat man die gewünschte Tankleerung dargestellt.

'ne kleine "Vorschau" ist hier zu finden: TQProgressBar.PNG

a.def 12. Apr 2017 19:44

AW: Progressbar rückwärts?
 
z.B. so:
du packst eine TGauge auf dein Formular, einen TButton und einen TTimer.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 Timer1.Enabled := False;
 Timer1.Interval := 100;
 Gauge1.Kind := gkVerticalBar;
 Gauge1.MaxValue := 100;
 Gauge1.MinValue := 0;
 Gauge1.ShowText := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if not Timer1.Enabled then
  Gauge1.Progress := Gauge1.MaxValue;

 Timer1.Enabled := not Timer1.Enabled;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Application.ProcessMessages;

 if Gauge1.Progress = Gauge1.MinValue then
  Timer1.Enabled := False
 else
  Gauge1.Progress := Gauge1.Progress - 1;
end;
Edit:
statt TGauge kannst du auch das nehmen was nahpets schreibt. Aber vom Prinzip her (Timer) sollte es gleich sein.

himitsu 12. Apr 2017 20:36

AW: Progressbar rückwärts?
 
Natürlich geht eine Progressbar auch rückwärts ... man fängt einfach bei 100% an und zählt dann runter, wobei der Balken kürzer wird.

Aviator 12. Apr 2017 22:27

AW: Progressbar rückwärts?
 
Und für die Farben kann man dann noch TProgressBar.State verwenden. Hier ist man zwar auf 3 Farben beschränkt, aber das sollte für "voll", "mittel", und "(fast) leer" ja eigentlich reichen.

Maurooon 14. Apr 2017 13:29

AW: Progressbar rückwärts?
 
Zitat:

Zitat von Aviator (Beitrag 1367440)
Und für die Farben kann man dann noch TProgressBar.State verwenden. Hier ist man zwar auf 3 Farben beschränkt, aber das sollte für "voll", "mittel", und "(fast) leer" ja eigentlich reichen.

Wie genau funktioniert das?

a.def 14. Apr 2017 14:00

AW: Progressbar rückwärts?
 
Delphi-Quellcode:
ProgressBar1.State := pbsNormal;

ProgressBar1.State := pbsError;

ProgressBar1.State := pbsPaused;

Aviator 14. Apr 2017 14:00

AW: Progressbar rückwärts?
 
Voraussetzung ist, dass auf deiner Form eine ProgressBar vorhanden ist die den Namen pb1 besitzt und du über einen Timer die Position der ProgressBar setzt. Dann funktioniert das in etwa so:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  pb1.Position := pb1.Position - 1; // Hiermit wird der Wert der Position pro Durchlauf des Timers um 1 verringert.
  case pb1.Position of
    0..10: pb1.State := pbsError;
    11..30: pb1.State := pbsPaused;
    31..100: pb1.State := pbsNormal;
  end;
end;
Die Geschwindigkeit in der die ProgressBar gegen 0 gehen soll kannst du, entweder über das Interval des Timers oder über den Wert den du von der aktuellen Position subtrahierst, beschleunigen oder verlangsamen.

Das oben ist auch nur ein Beispiel wie man es lösen könnte. Alternativ kannst du auch wirklich eine TGauge benutzen, da du mit der komplett frei herumhantieren kannst.

Oder du benutzt z.B. eine TPaintBox und zeichnest dir die ProgressBar komplett selbst. Eine neue Komponente von einer bestehenden abzuleiten will ich dir jetzt mal nicht zumuten. :wink:

Maurooon 14. Apr 2017 14:11

AW: Progressbar rückwärts?
 
Zitat:

Zitat von Aviator (Beitrag 1367621)
Voraussetzung ist, dass auf deiner Form eine ProgressBar vorhanden ist die den Namen pb1 besitzt und du über einen Timer die Position der ProgressBar setzt. Dann funktioniert das in etwa so:

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  pb1.Position := pb1.Position - 1; // Hiermit wird der Wert der Position pro Durchlauf des Timers um 1 verringert.
  case pb1.Position of
    0..10: pb1.State := pbsError;
    11..30: pb1.State := pbsPaused;
    31..100: pb1.State := pbsNormal;
  end;
end;
Die Geschwindigkeit in der die ProgressBar gegen 0 gehen soll kannst du, entweder über das Interval des Timers oder über den Wert den du von der aktuellen Position subtrahierst, beschleunigen oder verlangsamen.

Das oben ist auch nur ein Beispiel wie man es lösen könnte. Alternativ kannst du auch wirklich eine TGauge benutzen, da du mit der komplett frei herumhantieren kannst.

Oder du benutzt z.B. eine TPaintBox und zeichnest dir die ProgressBar komplett selbst. Eine neue Komponente von einer bestehenden abzuleiten will ich dir jetzt mal nicht zumuten. :wink:

Mhmmm... ProgressBar.state scheint es bei Lazarus nicht zu geben

Maurooon 14. Apr 2017 14:56

AW: Progressbar rückwärts?
 
Muss ich dafür bei Lazarus was in die USES einfügen oder gibt es da eine andere Möglichkeit?

a.def 14. Apr 2017 17:42

AW: Progressbar rückwärts?
 
-- Ironie

Wer nutzt denn freiwillig Lazurus? :stupid:

Maurooon 14. Apr 2017 17:54

AW: Progressbar rückwärts?
 
Zitat:

Zitat von a.def (Beitrag 1367652)
-- Ironie

Wer nutzt denn freiwillig Lazurus? :stupid:

Ich arbeite an einem Schulprojekt und in der Schule benutzen wir gezwungenermaßen eben FreePascal. Wenn ich die Wahl hätte würde ich Delphi benutzen...

Hast du ne Idee?

himitsu 14. Apr 2017 18:14

AW: Progressbar rückwärts?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi (VLC) und Lazarus (LCL) kapseln die selbe Windows-Komponente.
Alles was nicht in der gekapselten Klasse implementiert wurde, das kann man auch selber aufrufen.

Was man natürlich alles in der zugehörigen Dokumentation (MSDN und Windows SDK bzw. Windows PSDK) nachlesen kann.
https://msdn.microsoft.com/en-us/lib.../bb760818.aspx
https://msdn.microsoft.com/de-de/lib.../bb760816.aspx

http://www.danielmoth.com/Blog/categ...ory,vista.aspx
http://www.danielmoth.com/Blog/Vista-ProgressBar.aspx

nahpets 14. Apr 2017 18:17

AW: Progressbar rückwärts?
 
TProgressBar gehört zu den Common Controls (Uses ComCtrls).

http://wiki.freepascal.org/Lazarus_Tutorial/de

Die Komponente aus der Komponetenpalette (Reiter Common Controls) auf's Formular pappen. Der Rest sollte dann eigentlich von selbst gehen.

Maurooon 20. Apr 2017 15:16

AW: Progressbar rückwärts?
 
Zitat:

Zitat von nahpets (Beitrag 1367658)
TProgressBar gehört zu den Common Controls (Uses ComCtrls).

http://wiki.freepascal.org/Lazarus_Tutorial/de

Die Komponente aus der Komponetenpalette (Reiter Common Controls) auf's Formular pappen. Der Rest sollte dann eigentlich von selbst gehen.

Das habe ich ja gemacht. Nur bekomme ich einen Error, wenn ich auf ProgressBar1.state zugriefen möchte. Meine Frage ist ob ich dafür noch etwas in den uses schreiben muss außer LCLType und windows und ComCtrls (wird ja automatisch gemacht) oder ob der Aufruf einfach anders heißt bei Lazaurs... ich brauche definitiv kein Tutorial für Lazarus...... :evil:

nahpets 20. Apr 2017 15:45

AW: Progressbar rückwärts?
 
Schau doch einfach mal in der ComCtrls nach, ob die TProgressbar überhaupt 'ne Eigenschaft State hat.

Wenn nein, kannst Du da auch nicht drauf zugreifen.

Maurooon 20. Apr 2017 15:57

AW: Progressbar rückwärts?
 
Zitat:

Zitat von nahpets (Beitrag 1368472)
Schau doch einfach mal in der ComCtrls nach, ob die TProgressbar überhaupt 'ne Eigenschaft State hat.

Wenn nein, kannst Du da auch nicht drauf zugreifen.

Finde dazu nichts. Deshalb frage ich ja ob es eine Alternative gibt.

haentschman 20. Apr 2017 17:03

AW: Progressbar rückwärts?
 
Hast du das gesehen? http://docwiki.embarcadero.com/Libra...gressBar.State :P

nahpets 20. Apr 2017 17:06

AW: Progressbar rückwärts?
 
Naja, nicht alles was in Delphi vorhanden ist, ist auch in FreePascal vorhanden.

Und hier haben wir offensichtlich einen Unterschied.

haentschman 20. Apr 2017 17:19

AW: Progressbar rückwärts?
 
...again what learned. :stupid: http://lazarus-ccr.sourceforge.net/d...ogressbar.html Ich nehme alles zurück.

himitsu 20. Apr 2017 18:13

AW: Progressbar rückwärts?
 
In Delphi hatte man das auch erst später eingebaut.


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