Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Frage zu TPaintBox (https://www.delphipraxis.net/85643-frage-zu-tpaintbox.html)

Elicia 2. Feb 2007 16:14


Frage zu TPaintBox
 
Hi,

wollte in einer PaintBox ein Gitter zeichnen mit 'PaintBox. Canvas' - funktionierte auch, bis ich drauf kam, daß ich statt des Punkts ein Komma gemacht habe - also auf PaintBox, Canvas zugriff!
Als ich das Komma aber in Punkt änderte, funtionierte das Zeichnen aber nicht mehr so, wie von mir gewollt - es wurde nur ein Teil des Gitters stark vergrößert gezeichnet.

Hat vielleicht jemand eine Erklärung für dieses 'komische' Verhalten?
Ich kann mir auch nicht erklären, warum der Compiler das Komma nicht beanstandet hat - ich hab Programmieren aus Büchern gelernt, vielleicht ist da etwas an mir vorübergegangen...

Besten Dank schon mal im voraus - und ein großes Lob auf dieses tolle Forum - hat mir schon bei manchem Problemchen geholfen!

Elicia

shmia 2. Feb 2007 17:08

Re: Frage zu TPaintBox
 
Es gibt nur eine richtige Schreibweise: Paintbox1.Canvas wie man sieht ohne Leerzeichen um den Punkt.
Das Zeichnen des Gittes muss grundsätzlich im Event OnPaint stattfinden und an keiner anderen Stelle im Code.
Hier ist der Code für ein paar senkrechte Linien als Vorlage:
Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
   pcanvas : TCanvas; // Hilfsvariable
   i : Integer;
begin
   // Canvas der Paintbox besorgen
   pcanvas := (sender as TPaintbox).Canvas;

   pcanvas.pen.color := clRed;  

   for i := 0 to 20 do
   begin
      pcanvas.MoveTo(i*10,0);
      pcanvas.LineTo(i*10, 200);
   end;
   // pcanvas wird NICHT freigeben
end;

Elicia 3. Feb 2007 09:14

Re: Frage zu TPaintBox
 
Hi,
erstmal danke für deine Antwort!
Ich weiß schon, wie man auf PaintBox zugreift - allerdings braucht man m.E. keine Hilfsvariable für PaintBox.Canvas.

Hier der Quelltext, der mir Rätsel aufgibt und für den ich keine schlüssige Erklärung finde...

Delphi-Quellcode:
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
  X,Y,W,H,X1,Y1: Integer;
begin
{bei Interesse bitte einfach mal testen - mit Komma erscheint das Gitter
wie beabsichtigt - ersetzt man das Komma durch den korrekten Punkt wird es stark
vergrößert und dadurch nur ein Teil dargestellt!!!}
  with PaintBox1,Canvas do    //das ist die Fragen aufwerfende Stelle
  begin
    W := (Width-2) div 3;
    H := (Height-2) div 3;
    X1 := Width mod W div 2;
    Y1 := Height mod H div 2;
    FillRect(ClientRect);
    Pen.Color := clMaroon;
    Brush.Style := bsClear;
    for Y := 0 to 2 do
      for X := 0 to 2 do
        Rectangle(X1+X*W, Y1+Y*H, X1+X*W + W+1, Y1+Y*H + H+1);
  end;
end;
Vielleicht weiß ja jemand eine Antwort drauf!

Elicia

Hawkeye219 3. Feb 2007 09:58

Re: Frage zu TPaintBox
 
Hallo Elicia,

das Problem ist die WITH-Anweisung. Bei "with PaintBox1, Canvas" beziehen sich die Angaben Width, Height und ClientRect auf die PaintBox, bei "with PaintBox1.Canvas" auf das Formular, da die PaintBox nicht "geöffnet" wurde.

Gruß Hawkeye

Elicia 3. Feb 2007 11:10

Re: Frage zu TPaintBox
 
Hallo Hawkeye,

danke für die Antwort :) - das leuchtet ein und ich bin wieder ein wenig klüger!
Gruß,
Elicia


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