stringgrid - onDrawCell & Row

1 отговора 0 прегледа
#1

stringgrid - onDrawCell & Row

Привет,
ето какво се опитвам да направя и какви проблеми срещам:

Цел 1:
Искам да оцветявам клетките от реда с номер <grid.Row> в някакъв цвят.
Не искам да ползвам стандартното [goRowSelect] property - просто искам да изглежда, че реда е селектиран целия.
Така че ползвам OnDrawCell event-a за да си рисувам клетките както искам...

правя нещо такова в eventhandlera:
.....
if (ARow = grid.Row) then
begin
grid.canvas.brush.color := clInfoBk;
grid.canvas.FillRect(rect);
end;
.....

Проблем:
Когато селектирам друга клетка явно OnDrawCell се извиква само за досегашната селектирана и за новата селектирана - резултата е, че от досегашния селектиран ред само клетката, която е била селектирана се променя (рисува се с "нормален" цвят) и от новоизбрания ред само новата селектирана клетка се рисува в "селектиран" цвят... и става шарения в грида.
като кликна пак върху същата клетка и нещата се оправят.
Имам чувството, че някак си ondrawcell event-a "изостава" с едно селектиране


Цел 2:
Искам да "синхронизирам" 2 стринггрида.
т.е. като селектирам ред от единия да се селектира същия ред от другия (и в двете посоки).
Отново не искам да ползвам RowSelect property-то и си ги рисувам както искам.
опитвам се да използвам onselectcell() или както се казваше тоя event:

....
grid2.Row := grid1.Row;
....

Проблем:
Селектирането във втория грид пак "изостава" с един ход




Някакви идеи ?

Отговор
в отговор на longy #2

Re: stringgrid - onDrawCell &amp; Row

За първия въпрос : ето един пример как аз боядисвам целия ред :

type
TCustomDBGridCracker = class(TCustomDBGrid);

.........

with TCustomDBGridCracker(Sender) do begin
if not DM.adsSearch.FieldByName( 'Blocked' ).IsNull then
Canvas.Brush.Color := clRed
else
if ChechedProblems( DM.adsSearch.FieldByName( 'ID' ).AsInteger ) then
Canvas.Brush.Color := GetColor( DM.adsSearch.FieldByName( 'ID' ).AsInteger )
else
Canvas.Brush.Color := clWhite;

DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

if gdFocused in State then
with (Sender as TDBGrid).Canvas do
begin
Brush.Color := clNavy;
FillRect(Rect);
dbgSearch.Canvas.Font.Color := clHighlightText;
dbgSearch.Canvas.Font.Color := clYellow;
end;
// draw the standard text
dbgSearch.Canvas.TextRect (Rect, Rect.Left, Rect.Top, Column.Field.AsString);

това е за TDBGrid смятам лестно ще си го нагодиш като за себе си

Отговор