Announcement

Collapse
No announcement yet.

Flackern bei einer PaintBox

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Flackern bei einer PaintBox

    Ich habe eine PaintBox erstellt, die aus einer Datenbank Informationen holt und diese graphisch darstellt (benötigt ca. 1.5 sec für die Darstellung).<br>
    Wenn ich die Größe des Formulares ändere, dann flackert die PaintBox.<br>
    Kann man die OnPaint-Funktion der PaintBox solange unterdrücken, wie die Maustaste gedrückt ist (Formulargröße andern), oder gibt es eine andere Möglichkeit ?

  • #2
    Hi

    Im übergeordneten Form die Messages wm_EnterSizeMove und wm_ExitSizeMove abfangen. In der ersten wird ein privates Field TForm.FLockPaint incrementiert und in der zweiten Message wird decrementiert. Im OnPaint der PainBox kann nun TForm.FLockPaint auf NULL abgefragt werden.

    Gruß Hage

    Comment


    • #3
      Hallo Gunnar,<br>ich habe es mir abgewöhnt direkt auf die TPaintbox.Canvas zu zeichnen. Ich zeiche erst alles auf eine TBitmap und schiebe diese anschließend mit BitBlt auf die TPaintBox.Canvas. <br>Jens Schuman

      Comment


      • #4
        Hi

        @Jens, na dann kannst'e ja gleich auf die TPaintBox verzichten und ein TImage stattdessen nutzen.

        Gruß Hage

        Comment


        • #5
          Moin Hagen,<br>nein, ich kann nicht auf TPaintbox verzichten. TImage verbraucht mehr Resourcen als TPaintbox. Es läuft ungefähr so:<br>
          <pre><font size="1" face="Verdana">
          procedure TForm1.FormPaint(Sender: TObject);
          var
          Bmp : TBitmap;
          begin
          Bmp:=TBitmap.Create;
          Try
          PaintOnInternalBitmap(Bmp.Canvas)
          BitBlt(PaintBox1.Canvas.Handle,0,0,PaintBox1.Width ,PaintBox1.Height,
          Bmp.Canvas.Handle,0,0,SRCCOPY);
          Finally
          Bmp.Free; // !!!!
          end;
          end;
          </font></pre>
          <br>Jens Schuman

          Comment


          • #6
            Danke für die Tips. Die Variante von Hagen ist wahrscheinlich das, was ich brauche. Könntest du mir mit ein paar Zeilen Quelltext auf die Sprünge helfen, da ich mit der Ereignisprogrammierung noch nicht bewandert bin

            Comment


            • #7
              Hi

              Die Variante vom Jens ist eigentlich besser. Nimm ein TImage Image1 auf das Form, setll die richtige Größe ein.

              <pre>

              procedure TForm1.FormCreate(Sender: TObject);
              begin
              Image1.Picture.Bitmap.Width := Image1.Width;
              Image1.Picture.Bitmap.Height := Image1.Height;
              end;<br>

              // nun, die Zeichenroutine in Bitmap.Canvas
              procedure TForm1.PaintImage;
              begin
              with Image1.Picture.Bitmap.Canvas do
              begin
              // hier Dein Code so wie er für die paintBox gilt
              end;
              end;

              </pre>

              Gruß Hage

              Comment


              • #8
                @Jens, wie kommst Du darauf das TImage mehr Resourcen verbraucht ??
                Du brauchst ein VCL Object, entweder TImage oder TPaintBox und Du brauchst jeweils in der gleichen Dimension ein TBitmap Object. Entweder Dein privates TBitmap für die TPainBox oder das TBitmap das dem TImage.Picture zugewiesen ist. Der Resourceverbrauch sollte nur minimal unterschiedlich sein. Dafür erledigt TImage das OnPaint() in der TPaintBox, was für Anfänger schon ein Problem sein kann. Ich persönlich würde auch Deinen Weg vorziehen und paar Zeilen mehr reinhacken, aber für einen Beginner ist TImage die bessere Wahl.

                Gruß Hage

                Comment


                • #9
                  Hallo Hagen,<br>das mit TImage habe ich gelesen. Dort wurde geschrieben, des es erheblich mehr Resourcen benötigt als eine TPaintbox. Das habe ich ungeprüft geglaubt.<br>Das vorherige Zeichnen auf eine interne Bitmap kommt aus meiner Erfahrung mit TGraphicControl Nachfahren. Ich habe mir Komponeten gemacht, die ständig aktualisiert werden. Wenn man bei solchen Komponenten direkt auf die TCanvas zeichnet, sieht die Sache ziemlich bescheuert aus. Daraus folgt auch, das ich bei TPaintbox rein reflexmäßig an TBitmap denke.<br>Jens Schuman

                  Comment

                  Working...
                  X