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 ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie? (https://www.delphipraxis.net/197966-progressbar-mit-einer-verzoegerten-abnahme-des-wertes-nur-wie.html)

KodeZwerg 23. Sep 2018 10:40

ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
Hallo Gemeinde!

Vielleicht hat sich ja jemand mit so etwas schon mal beschäftigt weil ich hier irgendwie noch im Dunkeln tappe.
Ich habe eine ProgressBar ähnliche Komponente, aber als Beispiel reicht ne ProgressBar total aus.
-> Min 0 / Max 100
Was ich nun erreichen möchte ist folgendes, wenn die ProgressBar mittels Position einen Wert erhält der höher ist als der alte, soll die PB ganz normal schnell, also wie gewohnt, sofort auf Ihre Position gesetzt werden.
Wenn allerdings ein Wert reinkommt der geringer als der aktuelle ist, möchte ich das die PB nicht ruckartig auf den niedrigen Wert hüpft, sondern langsam runtergeht, analog sozusagen.
Wenn jedoch wieder ein höherer Wert reinkommt, da soll es digital, also sofort hoch hüpfen.
Und wenn gar kein neuer Wert reinkommt, soll die nach nach Richtung 0 wandern.

Hat da jemand schon mal was in der Richtung unternommen oder kann mir mit einem Tipp weiterhelfen wie man das erreichen kann?

Ich bin da für jeden Vorschlag, egal wie abgedreht, offen!


Danke fürs lesen.


Falls ihr euch Fragen sollten, wieso zum Henker will der Zwerg sowas blödes, was nicht exakt den Wert sofort darstellt, was ich erreichen möchte ist so etwas wie bei alten HiFi Verstärken verbaut war, Analoge VU-Meter.
Die schwingen ja eher zurück als das die sofort nen niedrigeren Wert haben, solch ein Effekt möchte ich erreichen.

blawen 23. Sep 2018 11:20

AW: ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
- Wie wäre es, den Wert einem Timer zu übergeben, welcher den Wert runterzählt?
- Oder der Timer zählt grundsätzlich den aktuellen Wert immer langsam runter, wenn ein höherer Wert anliegt wird dieser sofort ausgegeben ansonsten eben verzögert (VU Anzeigen funktionieren nach diesem Prinzip).

Delphi.Narium 23. Sep 2018 11:22

AW: ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
Mal schmutzig hingeschrieben:
Delphi-Quellcode:
if NeuePosition < ProgressBar.Position then begin
  for i := ProgressBar.Position DownTo ProgressBar.Position do begin
    ProgressBar.Position := i;
    Sleep(100);
  end;
end else begin
  ProgressBar.Position := NeuePosition;
end;

mjustin 23. Sep 2018 11:24

AW: ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
Das ist über einen Thread realisierbar. Die Werte werden dem Thread übergeben, dieser aktualisiert (natürlich per synchronize abgesichert) den Progressbar.
Der Thread errechnet bei sinkenden Werten mehrere Zwischenstufen, die dann z.B. im Abstand von hundert Millisekunden der Progressbar Position zugewiesen werden.
Ich würde einfach eine while not Terminated Schleife verwenden die bei jedem Durchlauf prüft, ob eine neue Position dargestellt werden soll, und andernfalls ein Sleep(100) ausführt.

KodeZwerg 23. Sep 2018 11:42

AW: ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
Danke an alle für Eure Tipps, mjustins Variante nutze ich bereits, momentan leider noch falsch da ich AVs bekomme.
Also war mein Grundgedanke gar nicht mal allzu abwegig, gut zu Wissen. Ich dachte ich mach es wieder viel zu kompliziert :)

Mein Grundgedanke war, so bald es ein Audiosignal gibt erstelle ich den Thread, lasse den solange laufen wie Audiosignal am machen ist und dann Thread löschen.

Ich werde daran nochmal anknüpfen bei Problemen, doch jetzt erst mal mein Thread so richten das der auch Werte schlucken kann und an Gui ohne AV wiedergibt.
Da mag ich mich mit alleine beschäftigen, damit ich mein Problem damit besser Verstehe, also bitte keine Ratschläge oder Codes dazu Posten, ich will ja was Lernen und nicht nur abschreiben :)

EWeiss 23. Sep 2018 12:40

AW: ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
Nebenbei du kannst auch meinen Slider dafür verwenden.
Der ist eine Kombination aus Slider und Progressbar.

Code gebe ich dir keinen den willst du ja nicht.

gruss

Schokohase 23. Sep 2018 12:58

AW: ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
Ich hätte da folgenden Vorschlag mit einem Timer
Delphi-Quellcode:
uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls,
  Vcl.ExtCtrls;

type
  TForm1 = class( TForm )
    ProgressBar1: TProgressBar;
    TrackBar1: TTrackBar;
    ProgressTimer: TTimer;
    procedure ProgressTimer_Timer( Sender: TObject );
    procedure TrackBar1_Change( Sender: TObject );
  private
    FProgressPosition: Integer;
    procedure SetProgressPosition( const Value: Integer );
  public
    property ProgressPosition: Integer read FProgressPosition write SetProgressPosition;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ProgressTimer_Timer( Sender: TObject );
begin
  if ProgressBar1.Position <= ProgressPosition
  then
    ProgressBar1.Position := ProgressPosition
  else
    ProgressBar1.Position := ProgressBar1.Position - 1;
end;

procedure TForm1.SetProgressPosition( const Value: Integer );
begin
  FProgressPosition := Value;
end;

procedure TForm1.TrackBar1_Change( Sender: TObject );
begin
  ProgressPosition := TrackBar1.Position;
end;
Ach ja, der
Delphi-Quellcode:
ProgressTimer
hat
Delphi-Quellcode:
Enabled := True
und
Delphi-Quellcode:
Interval := 10

KodeZwerg 23. Sep 2018 18:44

AW: ProgressBar mit einer verzögerten Abnahme des Wertes, nur wie?
 
Zitat:

Zitat von EWeiss (Beitrag 1413925)
Nebenbei du kannst auch meinen Slider dafür verwenden.
Der ist eine Kombination aus Slider und Progressbar.

Code gebe ich dir keinen den willst du ja nicht.

gruss

Ich benutze eine Komponente die mir im Grundzustand einen Kreis pinselt mit nem Zeiger, aber 360°, viel zu viel "rund".
Ich habe es bereits so weit abgeändert das es kein Kreis sondern wie bei echte VUs nur so 80/90° in etwa hat.
Also das Ausschläge der Nadel nur oben dargestellt werden und nicht Kreisrund.
Die Technik die dahinter steckt, ob nun ProgressBar Slider WhatEver bleibt ja die gleiche, von daher, kompatibel zu allem was Werte 0-100 kann.
Aber Danke für keinen Code, ich brauche da echt ne auszeit um drüber zu büffeln, nur kam mir heute was dazwischen und morgen wirds spät.

Ich schaue mir gleich noch Schokohase sein Grundgerüst an, ähnelt meinem quicky von gestern Nacht recht stark.

Sobald ich das fertig habe und jemand Interesse bekundet, pump ich Code hoch.


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