![]() |
For-Schleife mit Canvas umsetzten
Hallo,
ich hänge hier immernoch an meiner Skala, er Zeichnet mir einzelne Striche am Rand, aber ich bekomme es nicht hin, dass er mir von alleine die Skalenstriche am Rand mit dem selben Abstand zeichnet und diese angleicht, wenn ich den Abstand ändere. Ich hoffe diesmal kann mir jemand folgen ?
Delphi-Quellcode:
procedure THixBarGraph.Paint;
var R : TRect; // Bargraphrechteck vom Typ TRect i : double; // aufgespannter Wertebereich (Abstand zwischen den Skalenstrichen) Anz_Striche : Integer; // Skalenstriche Value : double; ValueMin : double; ValueMax : double; begin inherited; if (Parent = NIL) or not visible then Exit; Canvas.Brush.Color := FColor; Canvas.FillRect(Rect(0, 0, Width, Height)); // Hintergrund des Objektes als Rechteck Zeichnen case FKind of sbHorizontal : begin // horizontale Ausrichtung der Komponente R := Rect(OffsetUpper, // Bargraphrechteckes (Height - Barwidth) div 2, Width - OffsetLower, (Height + Barwidth) div 2); // Skalen zeichnen case FLabelingStyle of lbsLines : begin Canvas.Pen.Color := clBlack; for i := 0 to round(Anz_Striche+1) do Inc(Anz_Striche[i]); Canvas.MoveTo(round(OffsetUpper + i * LabelingGap), Height); Canvas.LineTo(round(OffsetUpper + i * LabelingGap), (Height + Barwidth) div 2); {*HIER SOLL ER, ABHÄNGIG VON DEM ABSTAND ZWISCHEN DEN SKALENSTRICHEN, DIESE ZEICHNEN*} end; |
AW: For-Schleife mit Canvas umsetzten
:shock:
Abgesehen davon, dass du es nicht schaffst, deinen Quellcode einfach mal zu zippen und als Anhang hochzuladen...nein, der Codeschnipsel ist furchtbar formatiert, es fehlen viele schließende
Delphi-Quellcode:
und wenn du einfach mal auf F9 drücken würdest, müsste auch dein Delphi6-Compiler dir mindestens zwei Fehler ausspucken!
end;
Die Schleifen-Variable i kann kein Double sein und Anz_Striche ist kein Array! Und wenn du in der Schleife per MoveTo und LineTo auf den Canvas rummalen willst, dann musst du das auch zur Schleife per
Delphi-Quellcode:
hinzufügen!
begin end;
EDIT: Ach ja...auch Screenshots vom Ist-Zustand und dem gewünschten Zustand wären super duper hilfreich! |
AW: For-Schleife mit Canvas umsetzten
ja Du hast Recht, dass es nicht schön ist, hab das auch nur rauskopiert aus dem kompletten Quelltext !
I habe ich schon als Integer deklariert (im C, kann man das so machen, wie ich das da hab, da muss man nicht unbedingt einen Array machen !), daher meine Frage ! Aber danke ersteinmal für deine Antwort ! |
AW: For-Schleife mit Canvas umsetzten
Zitat:
NEIN, kann man so nicht! Und du programmierst in Object Pascal / Delphi und nicht in C, also kannst du das nicht machen! Und ich sehe auch nicht, wozu du hier ein Array brauchst! Wo wird denn überhaupt Anz_Striche mit Inhalt befüllt? Ich hoffe, dass ist nichts Wichtiges für dein Studium was du innerhalb einer bestimmten Zeitspanne abgeben musst, denn du wurschelst an diesen Graphen ja schon seit Wochen rum, ohne zu Potte zu kommen. |
AW: For-Schleife mit Canvas umsetzten
Ich weiß nicht, wozu Du ein Array brauchst bzw. glaubst zu brauchen. Entweder ist die Anzahl der zu zeichnenden Striche vorgegeben oder der Abstand dieser zueinander. Je nachdem musst Du dann die jeweils andere Zahl berechnen und dann zeichnen. Angenommen, die Komponente ist 120 Pixel hoch und soll 21 Striche in vertikaler Richtung haben. Dann teilt man die 120 durch die 21 und rundet das Ergebnis, erhält somit den Abstand. Und den multipliziert man dann einfach mit der Schleifenvariablen, um die Y-Koordinate zu ermitteln. Bei sehr geringer Höhe und/oder sehr dichter Strichanzahl wird das Ergebnis wohl unbefriedigend ausfallen, aber das kann man auch zumindest eindämmen.
|
AW: For-Schleife mit Canvas umsetzten
Zur Frage kann ich nichts sagen, weil ich nicht verstehe, was Du willst und was nicht funktioniert. Wenn es um den Abstand der Striche geht, hat das wohl etwas mit deinem LabelingGap zu tun, aber es ist nicht ersichtlich, wo das herkommt.
Ergänzend zu den Anmerkungenen von TiGü:
Delphi-Quellcode:
Wieso round? Anz_Striche ist doch schon ein integer. Wenn man da 1 dazu addiert, bleibt es immer noch ein integer.
for i := 0 to round(Anz_Striche+1)
|
AW: For-Schleife mit Canvas umsetzten
Width/ Anz_Striche = LabelingGap
LabelingGap * Schleifenvariable = Koordinate, das habe ich alles berechnet, mir geht es nur darum, wie ich Canvas dazu bringe, dies in meine Komponente einzuzeichenen (mit einer For_Schleife). Danke für eure Hilfe, auch wenn ich hier immer so ein Wirrwar poste :oops: |
AW: For-Schleife mit Canvas umsetzten
Zitat:
Delphi-Quellcode:
for i := 0 to Anz_Striche - 1 do
begin Canvas.MoveTo(round(OffsetUpper + i * LabelingGap), Height); Canvas.LineTo(round(OffsetUpper + i * LabelingGap), (Height + Barwidth) div 2); end; |
AW: For-Schleife mit Canvas umsetzten
Du hast es doch bereits beschrieben :gruebel:. Vielleicht nochmal eine kurze Zusammenfassung: Du nimmst die Breite bzw. Höhe und teilst diese durch die Anzahl der Striche. Die daraus resultierende Fließkommazahl merkst Du Dir, gehst dann in einer Schleife von 1 bis Strichanzahl (oder 0 bis Strichanzahl - 1) durch, multiplizierst Deinen gemerkten Abstand mit der Schleifenvariablen und rundest das Ergebnis. Das ist dann Deine X- bzw. Y-Koordinate für Canvas.MoveTo und Canvas.LineTo.
|
AW: For-Schleife mit Canvas umsetzten
ja das ist soweit klar alles,
wenn ich es kompilieren lasse, flacker das Bild aber immer nur und es wird nie was gezeichnet :pale: das ist das Problem |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:01 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