Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   For-Schleife mit Canvas umsetzten (https://www.delphipraxis.net/177651-schleife-mit-canvas-umsetzten.html)

Chris211183 19. Nov 2013 09:23

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;

TiGü 19. Nov 2013 09:38

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:
end;
und wenn du einfach mal auf F9 drücken würdest, müsste auch dein Delphi6-Compiler dir mindestens zwei Fehler ausspucken!

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:
begin end;
hinzufügen!

EDIT: Ach ja...auch Screenshots vom Ist-Zustand und dem gewünschten Zustand wären super duper hilfreich!

Chris211183 19. Nov 2013 09:41

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 !

TiGü 19. Nov 2013 09:48

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Zitat von Chris211183 (Beitrag 1236524)
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 !

Deine einzige Frage im ersten Post lautet: "Ich hoffe diesmal kann mir jemand folgen ?"

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.

DeddyH 19. Nov 2013 09:49

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.

bcvs 19. Nov 2013 09:56

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:
for i := 0 to round(Anz_Striche+1)
Wieso round? Anz_Striche ist doch schon ein integer. Wenn man da 1 dazu addiert, bleibt es immer noch ein integer.

Chris211183 19. Nov 2013 10:07

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:

TiGü 19. Nov 2013 10:12

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Zitat von Chris211183 (Beitrag 1236531)
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).

Bitte lese ein paar grundlegene Tutorials!!!

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;

DeddyH 19. Nov 2013 10:15

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.

Chris211183 19. Nov 2013 10:40

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

Chris211183 19. Nov 2013 10:42

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Zitat von TiGü (Beitrag 1236532)
Zitat:

Zitat von Chris211183 (Beitrag 1236531)
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).

Bitte lese ein paar grundlegene Tutorials!!!

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;

Bin schon dabei !!!

DeddyH 19. Nov 2013 10:43

AW: For-Schleife mit Canvas umsetzten
 
Das deutet aber auf ein ganz anderes Problem hin. Du rufst nicht zufällig in der Paint-Methode ein Refresh, Update, Repaint oder Invalidate auf? Falls nicht, such doch mal im Code nach den o.a. Aufrufen, ich vermute, da ist einer an ungünstiger Stelle, so dass Deine Komponente sich ständig neu zeichnet.

baumina 19. Nov 2013 10:51

AW: For-Schleife mit Canvas umsetzten
 
Bist Du in der Zwischenzeit wieder davon abgekommen die Skala NEBEN deiner Anzeige zu zeichnen, wie in dieser Diskussion http://www.delphipraxis.net/177514-s...omponente.html im angehängten PDF-Bild zu sehen war, oder warum malst du nun doch INNERHALB deiner Anzeige rum?

Chris211183 19. Nov 2013 10:58

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Zitat von TiGü (Beitrag 1236526)
Zitat:

Zitat von Chris211183 (Beitrag 1236524)
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 !

Deine einzige Frage im ersten Post lautet: "Ich hoffe diesmal kann mir jemand folgen ?"

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.

Nein ist es nicht :stupid:, das wäre schlimm !!!

Blup 19. Nov 2013 12:16

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Zitat von Chris211183 (Beitrag 1236540)
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

Wenn das das Problem ist, warum steht das nicht gleich bei Eröffnung dieses Themas und in der Überschrift?
Was sollen wir mit wenigen aus dem Zusammenhang gerissenen Zeilen Code anfangen?

Es gibt massenhaft Beispiele und Tutorials zum Erstellen einer graphischen Komponente.
Hier z.B. auch ein Beispiel von mir: http://www.delphipraxis.net/939792-post2.html

Wenn du nicht in der Lage bist die Ursache deines Fehlers einzugrenzen, häng den kompletten Quelltext des Projekts an den Beitrag an.
Der sollte sich zumindest ohne Fehlermeldungen und Warnungen kompilieren lassen und lesbar formatiert sein.

Chris211183 20. Nov 2013 10:07

AW: For-Schleife mit Canvas umsetzten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang findet Ihr die .pas mit meinem Code,

das Problem liegt darin, dass die Skalierung nicht gezeichnet wird. Finde den Fehler selbst nicht !

DeddyH 20. Nov 2013 10:13

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Delphi-Quellcode:
for i := 0 to round(LabelingGap -1) do

Wozu die Anzahl der Striche angeben, wenn dann eine ganz andere Anzahl gezeichnet wird?

Chris211183 20. Nov 2013 10:21

AW: For-Schleife mit Canvas umsetzten
 
ja seh ich jetzt auch, brauch ich ja garnicht, dennoch zeichnet er nichts ! Die Anzahl der Striche ergeben sich ja aus dem Verhältnis von Breite und Abstand und der Laufvariablen...

DeddyH 20. Nov 2013 10:32

AW: For-Schleife mit Canvas umsetzten
 
Verstehe ich nicht. Willst Du eine fixe Strichanzahl mit variablem Abstand oder einen fixen Abstand mit variabler Strichanzahl? Andere Kombinationen erscheinen mir ziemlich sinnfrei.
[edit] Kleines Beispiel: ein Formular (TForm29 in diesem Fall), OnPaint und OnResize sind diese Methoden zugewiesen.
Delphi-Quellcode:
procedure TForm29.FormPaint(Sender: TObject);
const
  ANZ_STRICHE = 20;
var
  Abstand: double;
  i, X: integer;
begin
  Abstand := ClientWidth / (ANZ_STRICHE + 1);
  for i := 1 to ANZ_STRICHE do
    begin
      X := round(Abstand * i);
      Canvas.MoveTo(X, ClientHeight);
      Canvas.LineTo(X, ClientHeight - 20);
    end;
end;

procedure TForm29.FormResize(Sender: TObject);
begin
  Invalidate;
end;
Soll es ungefähr darauf hinauslaufen?[/edit]

TiGü 20. Nov 2013 10:46

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Zitat von Chris211183 (Beitrag 1236685)
...dennoch zeichnet er nichts !

Schreibe im Konstruktor bitte folgendes:
Delphi-Quellcode:
LabelingStyle := lbsLines;
Zur Zeit steht dort lbsLabels und das kann ja natürlich nicht funktionieren, weil das Zeichnen für FLabelingStyle = lbsLabels noch nicht implementiert ist!

Übrigens ist das die schlimmste Quelltext-Formatierung aller Zeiten!!!

TiGü 20. Nov 2013 10:50

AW: For-Schleife mit Canvas umsetzten
 
Ach ja, und falls du dich fragst, warum er immer wieder unten links anfängt mit zeichnen ("äääähhhm, es geht nicht!"), schau dir doch bitte genau an, wo du immer anfängst die Linie zu zeichnen!

Ein gutes Debugger-Tutorial wäre jetzt mal angesagt!

DeddyH 20. Nov 2013 10:54

AW: For-Schleife mit Canvas umsetzten
 
Hamwa doch: http://www.delphipraxis.net/41047-tu...ortgeschr.html

TiGü 20. Nov 2013 10:56

AW: For-Schleife mit Canvas umsetzten
 
Zitat:

Zitat von DeddyH (Beitrag 1236693)

Obacht, er muss es auch lesen und verstehen! :warn:

Chris211183 20. Nov 2013 11:00

AW: For-Schleife mit Canvas umsetzten
 
Danke euch, lese mir das gleich mal durch !

meine Quelltextformatierung finde ich für mich recht ok, macht doch jeder anders...

Ich gehe jetzt alles nochmal im Einzelnen durch, Alles wird Gut :thumb:

Sherlock 20. Nov 2013 12:43

AW: For-Schleife mit Canvas umsetzten
 
:warn:
Quelltexte wurden vor 30 Jahren vielleicht von jedem anders formatiert. Heutzutage unterscheidet sich die Formatierung innerhalb einer Sprachfamilie allenfalls marginal.
Es gibt Richtlinien, an die man sich besser hält, wenn man irgendwann einmal vor hat seinen Code anderen Leuten auch nur zu zeigen....von gemeinsamen Arbeiten mal ganz zu schweigen.


Sherlock


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