AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Flackern beim Neuzeichnen der Komponente

Ein Thema von daschaos · begonnen am 13. Jul 2007 · letzter Beitrag vom 13. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
daschaos

Registriert seit: 23. Mai 2007
117 Beiträge
 
Delphi 2006 Professional
 
#1

Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:06
Hi!

Ich hab eine Komponente von TGraphicControl abgeleitet und möchte gerne meinen Zeichenvorgang ohne Flackern haben. Das Problem ist, dass TGraphicControl kein DoubleBuffered anbietet. Klar, die Form, also der Parent bietet mir das, das darf ich aber nich benutzen. Prinzipiell ist es ja kein Problem, dass dann quasi von Hand zu machen, dachte ich . Lege mir also immer ein global deklartiertes Bitmap am Anfang meiner Zeichenroutine an, dass ich jeweils mit der Größe meines zu zeichnenden Objekts initialisiere und auf dessen Canvas ich dann zeichnen lasse und am Ende über Canvas.Draw das Bitmap auf mein Canvas der Komponente zeichnen zu lassen. Funktioniert nur leider nich. Ich sehe zwar Teile davon, aber manches ist weiß überblendet. Meine Zeichneroutine ist vom Prinzip her folgendermaßen aufgebaut:

Delphi-Quellcode:
procedure PaintRect(ARect: TRect);
begin
  Bmp := TBitmap.Create;
  Bmp.Height := ARect.BottomRight.Y - ARect.TopLeft.Y;
  Bmp.Width := ARect.BottomRight.X - ARect.TopLeft.X;
  ...
  DrawOuterRect(ARect);
  Bmp.Free;
end;

procedure DrawOuterRect(ARect: TRect);
begin
  ...
  Bmp.Canvas.Rectangle(ARect);
  if(...) then
    DrawInnerRect(ARect)
  else
    DisplayRectProperties(ARect);
end;

procedure DrawInnerRect(ARect: TRect);
begin
  ...
  Bmp.Canvas.Rectangle(ARect);
  DisplayRectProperties(ARect);
end;

procedure DisplayRectProperties(ARect: TRect);
begin
  
  ...
  Canvas.Draw(ARect.TopLeft.X, ARect.TopLeft.Y, Bmp);
end;
Jetzt hab ich einfach jedes Vorkommen von Self.Canvas halt durch Bmp.Canvas ersetzt und eigentlich gehofft, es würde jetzt funktionieren.

Hab ich einen Denkfehler drin oder irgendwas übersehen, vergessen was ich noch machen müsste?
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:07
DoubleBuffered auf True!

Gruß oki

[Edit] Sorry, Titel gelesen, schnelle Antwort geschrieben, daneben gegriffen. Lesen kommt doch immer besser. Gruß oki [/Edit]
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:18
Und wenn Du statt von TGraphicControl von TCustomControl ableitest? Dann hättest Du auch DoubleBuffered zur Verfügung.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
daschaos

Registriert seit: 23. Mai 2007
117 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:21
Ich glaub mein Chef mag das nicht, also er hätte halt gerne, dass ich das so von Hand probiere und es wurmt mich ja jetzt auch, dass es nich läuft .
Mir ist gerade aufgefallen, dass ich ja alles zeichnen lassen will bevor ich aufs normale Canvas zeichne, ist ja auch der Sinn der Sache . Also lege ich das Bitmap im Konstruktor meiner Komponente an, weil sonst zeichnet er ja immer nur das eine Objekt anstatt alle. Aber jetzt sehe ich garnichts mehr . Hab einfach das Bmp.Create, Bmp.Free in den Konstruktor/Destruktor verschoben und die Größe des Bitmaps im Konstruktor auf die Größe meiner Komponente gesetzt.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:34
Zitat von daschaos:
Hab einfach das Bmp.Create, Bmp.Free in den Konstruktor/Destruktor verschoben und die Größe des Bitmaps im Konstruktor auf die Größe meiner Komponente gesetzt.
1. Ich hoffe dort steht TBitmap.Create und nicht Bmp.Create
2. Die Grösse der Komponente wird nach dem Konstruktor verändert durch Laden der Eigenschaft aus dem Formular. Entweder überschreibst du z.B. SetBounds um die Bitmapgrösse zu setzen oder du machst dies einfach im Paint als eine der ersten Handlungen.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:35
Bist Du Dir sicher, dass das so stimmt?
Zitat von daschaos:
Bmp.Canvas.Rectangle(ARect);
Du müsstest IMHO auf der Bitmap bei 0,0 mit dem Zeichnen beginnen und die Bitmap dann an den gewünschten Koordinaten auf den Canvas der Kompo pinseln.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#7

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:44
... du kannst lokal beim Zeichnen das Rechteck auf eine lokale Variable legen um dann diese auf 0, 0 zu biegen (OffsetRect(DeinRect, -DeinRect.Left, -DeinRect.Top);). Dann kannst du die restlichen Zeichenfunktionen zu lassen und ihm einfach nur die lokale TRect geben.

Auch geht dieses Canvas.Draw(ARect.TopLeft.X, ARect.TopLeft.Y, Bmp); lesbarer: Canvas.Draw(ARect.Left, ARect.Top, Bmp);
  Mit Zitat antworten Zitat
daschaos

Registriert seit: 23. Mai 2007
117 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 08:55
Erstmal, ja ich hab Bmp := TBitmap.Create gemacht, wollte mich beim Schreiben nur beeilen . Und ich hab jetzt die Größe im Paint Event gesetzt, jetzt macht er es schon fast richtig. Danke schonmal!!!! Juhu. Aber er hat jetzt noch einen weißen Rahmen, denke ja mal von der Bitmap, komisch...
  Mit Zitat antworten Zitat
daschaos

Registriert seit: 23. Mai 2007
117 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 09:38
Ich hab noch ein Property, bei dem man den Margin einstellen kann. Also muss ich ja das so deklarieren: Canvas.Draw(0+Margin,0+Margin,Bmp) und Bmp.Height := ClientHeight - Margin und Bmp.Width := ClientWidth - Margin.
Beim Zeichnen wird aber nur die Differenz links oben an den Rändern dem Margin-Wert entsprechend verkleinert oder vergrößert, unten macht er garnichts. Warum?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#10

Re: Flackern beim Neuzeichnen der Komponente

  Alt 13. Jul 2007, 11:11
Zitat von daschaos:
Ich hab noch ein Property, bei dem man den Margin einstellen kann. Also muss ich ja das so deklarieren: Canvas.Draw(0+Margin,0+Margin,Bmp) und Bmp.Height := ClientHeight - Margin und Bmp.Width := ClientWidth - Margin.
Beim Zeichnen wird aber nur die Differenz links oben an den Rändern dem Margin-Wert entsprechend verkleinert oder vergrößert, unten macht er garnichts. Warum?
1. 0+x -> da kannste die 0 einfach weglassen mit dem +
2. Zu deiner Frage: Dein Margin soll doch links und rechts wirken, also muss du bei der Breite des Bitmap zweimal Margin abziehen. Gleiches bei der Höhe: Oben und unten, also 2x margin.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:43 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