![]() |
Kopieren-Animation in Painbox zeichnen
Ich möchte gerne eine Animation wie in etwa die von Windows 10 in eine Paintbox zeichnen.
Leider habe ich von sowas soviel Ahnung wie von Steuererklärungen machen: gar keine. Wie kann ich solche Daten (der Einfachheit halber nur eine Information wie "MB pro Sekunde") in einer PaintBox darstellen, die sich auch noch dynamisch anpasst je nachdem was das Maximum ist und alte Einträge nach links rausschiebt, sodass neue rechts reinkommen können? Ich meine sowas hier ![]() |
AW: Kopieren-Animation in Painbox zeichnen
Zufälligerweise habe ich in den vergangenen Tagen etwas ähnliches gemacht: Traffic-Graph für Up- & Download. Zuerst solltest du dir Gedanken darüber machen, woher deine Werte für die Datenpunkte kommen, also wie du diese ermittelst und wie und wo du diese speicherst. Ich habe mich für ein dynamisches Array (was aus zwei Cardinals besteht) entschieden. Bei einem einzelnen Graphen wie in deinem Fall genügt wahrscheinlich ein Array of Integer.
Dann solltest du dir anschauen, wie man in eine Paintbox zeichnet. Wichtige Funktionen dafür sind ![]() ![]() ![]() ![]() ![]() Ich hoffe, das hilft dir für's Erste weiter :). Grüße Dalai |
AW: Kopieren-Animation in Painbox zeichnen
Meine Daten existieren bereits. Dafür habe ich eine einzige Variable denn es gibt nur einen einzigen interessanten Wert: Kopiergeschwindigkeit.
Es gibt noch mehr Werte, aber die sollen nicht dargestellt werden. Zitat:
Angenommen ein Wert liegt bei 5, der danach bei 7, dann entsteht eine ziemlich hässliche und kantige Anzeige. Vor dem Problem stand ich schon einmal und habs nicht wegbekommen. |
AW: Kopieren-Animation in Painbox zeichnen
Dann erkläre mal exakt, wo es klemmt.
Die flüssige Live-Darstellung funktioniert? Du willst nur noch die stufige Darstellung weg kriegen? Zeig doch mal einen Screenshot oder kurzes Video... |
AW: Kopieren-Animation in Painbox zeichnen
Zitat:
Delphi-Quellcode:
Selbst dafür bin ich zu doof.
Button2Click(Sender: TObject);
var val: Integer; begin val := 75; // Random(PaintBox1.Height); PaintBox1.Canvas.FillRect(ClientRect); PaintBox1.Canvas.MoveTo(0, PaintBox1.Height - val); PaintBox1.Canvas.LineTo(0, val); end; |
AW: Kopieren-Animation in Painbox zeichnen
Dann würde ich das Problem zerlegen.
1.) Thread und Bitmap bauen, so dass laufend Zufallswerte erzeugt werden, die flüssig gezeichnet und "gescrollt" werden können. 2.) Zoom dynamisch anpassen 3.) echte Werte statt Zufallswerte darstellen Grundsätzlich würde ich für die einzelnen Werte Striche nebeneinander zeichnen.
Delphi-Quellcode:
So zum Einstieg könnte das passen.
for I := 0 to Values.Count - 1 do
begin Value:=Values[X]; PaintBox1.Canvas.MoveTo(I, PaintBox1.Height - Value); PaintBox1.Canvas.LineTo(I, PaintBox1.Height); // bis unten zeichnen end; Die Anzahl der gesammelten Werte musst Du dann an die Breite der Paintbox anpassen und ältere Werte verwerfen. Ist etwas schwierig, etwas zu empfehlen, weil mir noch nicht klar ist, wo Du wirklich Hilfe brauchst. |
AW: Kopieren-Animation in Painbox zeichnen
Zitat:
Gerade kurz sowas hier getestet... funktioniert natürlich auch nicht.. wie immer bei mir
Delphi-Quellcode:
var
val: Integer; bmp: TBitmap; begin val := Random(bmp.Height); bmp := TBitmap.Create; bmp.Height := PaintBox1.Height; bmp.Width := PaintBox1.Width; bmp.Canvas.FillRect(ClientRect); bmp.Canvas.MoveTo(0, bmp.Height - val); bmp.Canvas.LineTo(0, bmp.Height); PaintBox1.Canvas.Draw(0, 0, bmp); |
AW: Kopieren-Animation in Painbox zeichnen
Hmm..
Und bei einer Paintbox wird im OnPaint gezeichnet und nicht in einem ButtonClick. Sonst würde die Anzeige verschwinden, wenn ein anderes Fenster darüber gezogen wird. ;) Oder in ButtonClick auf einem Bitmap zeichnen und dieses im OnPaint der PaintBox darauf kopieren.. |
AW: Kopieren-Animation in Painbox zeichnen
So wirklich funktioniert es nicht
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Timer1.Interval := 50; iPosX := 0; bmp := TBitmap.Create; bmp.Width := PaintBox1.Width; bmp.Height := PaintBox1.Height; end; procedure TForm1.Button2Click(Sender: TObject); begin Timer1.Enabled := not Timer1.Enabled; end; procedure TForm1.Timer1Timer(Sender: TObject); var val: Integer; begin Application.ProcessMessages; if iPosX >= PaintBox1.Width then Dec(iPosX); val := RandomRange(25, 45); bmp.Canvas.MoveTo(iPosX, bmp.Height - val); bmp.Canvas.LineTo(iPosX, bmp.Height); Inc(iPosX); PaintBox1.Repaint; end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin TPaintBox(Sender).Canvas.Draw(0, 0, bmp); end; |
AW: Kopieren-Animation in Painbox zeichnen
Was funktioniert denn nicht?
Nimm mal in der Timerbehandlung das Application.Processmessages raus. Das ist unnötig und kann Probleme verursachen. (Später wäre ein Thread statt einem Timer sicherlich sinnvoller.) Füge in dem Timer mal so etwas wie meine Schleife ein. Nach Deinem Code würde in dem Bitmap (so wie ich das sehe) nichts gescrollt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:35 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