[Delphi] Gridlines flikkeren andere kleur bij repaint

Pagina: 1
Acties:
  • 263 views sinds 30-01-2008

Acties:
  • 0 Henk 'm!

  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Ik heb een StringGrid (TNldStringGrid) waarbij ik mijn gridlines een andere kleur heb gegeven dan grijs. (Dat is een van de features van een TNldStringGrid.)

Nu is mijn probleem dat mijn gridlines grijs gaan knipperen als ik Grid.Repaint aanroep. Dit gebeurt nogal vaak in mijn prog, en het ziet er niet uit.

Ik heb niet kunnen vinden waar ze grijs worden, maar hoe kan ik ervoor zorgen dat ze gewoon de originele kleur houden tijdens het repainten?

Acties:
  • 0 Henk 'm!

  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Hoe heb je de lijntjes een andere kleur gegeven? Draw je zelf de rect (en staat je grid op OwnerDraw)? En zo ja: in welk event draw je de rects, gewoon bij de onCellDraw of ergens anders?

Een andere (misschien wel belangrijkere) vraag: is het wel echt nodig je grid zo vaak opnieuw te laten tekenen? Misschien is er een andere oplossing voor je probleem te vinden. Misschien kun je de situatie wat duidelijker uitleggen?

My personal website


Acties:
  • 0 Henk 'm!

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Meestal is het een slecht idee om Repaint aan te roepen, want dat laat je soms onnodig tekenen wat flikekering op kan leveren. Gebruik liever Grid.Invalidate;

We adore chaos because we like to restore order - M.C. Escher


Acties:
  • 0 Henk 'm!

  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
De kleur wordt in mijn component zelf veranderd in de procedure DrawCell. Deze component heeft geen OwnerDraw-property (tenminste, geen published :))

Invalidate maakt het minder, maar lost het niet op. Het lijkt wel alsof ze minder lang grijs blijven. Ik heb alle open units (use debug dcu's) al gezocht naar clSilver maar kon niks boeiends vinden/patchen (wat sowieso nooit echt verstandig is...)

Ze zijn oorspronkelijk donkerblauw, en ik denk dat die grijze kleur komt van een rect die wordt getekend ter grootte van de hele oppervlakte van de TNldStringGrid, waaroverheen de cellen weer staan. Die gridlines worden waarschijnlijk pas later ingekleurd.

Interessante info?

Pel.

Acties:
  • 0 Henk 'm!

  • codebeat
  • Registratie: Januari 2010
  • Laatst online: 21-08 05:47
Probleem is dat het control een repaint message stuurt naar onderliggende controls, daardoor krijg je de flicker. Je hebt een repaint echter wel nodig, bijvoorbeeld als je het venster resized. Dus wat je kunt doen is tijdelijk de achtergrond refresh uit te schakelen. Dat kun je zo doen zonder een nieuwe unit te maken:

Bovenaan je form unit:

TNldStringGrid = class( NldStringGrid.TNldStringGrid )
protected
redrawDisabled : boolean;

// Avoid redraw flicker
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;

public
procedure flickerFreeRepaint();
end;

In implementation:
procedure TNldStringGrid.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
if( NOT redrawDisabled ) then
inherited
else Message.Result:=1; // Fake erase
end;

procedure TNldStringGrid.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
redrawDisabled:=true;
rePaint();
redrawDisabled:=false;
end;


In je code:
NldStringGrid1.flickerFreeRepaint();

Et viola.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 07-10 14:25

Creepy

Tactical Espionage Splatterer

Maar om daar nu een topic uit 2004 (!!) voor omhoog te duwen is ook weer wat overdreven...

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1

Dit topic is gesloten.