Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Перемещение по DrawGrid   Найти похожие ветки 

 
Евгений Р.   (2007-07-10 22:02) [0]

Как при изменении текущей ячейки (col)  подсвечивать соответствующую ей ячейку в заголовочной строке другим цветом?


 
{RASkov} ©   (2007-07-10 23:47) [1]

http://delphimaster.net/view/1-1170495138/


 
Евгений Р.   (2007-07-10 23:52) [2]

Спасибо, но ссылка не работает!


 
{RASkov} ©   (2007-07-10 23:56) [3]

> [2] Евгений Р.   (10.07.07 23:52)

Там вобщето для стринггрида и не цветом а.... по другому :)

Ну думаю идея пойдет и для DrawGrida:
[2] RASkov   (04.02.07 06:41)
> [0] Medved_   (03.02.07 12:32)

Со StringGrid"ом задуманное вряд ли получится, нужно что нибудь другое искать.
Но если ячейка выделена одна может быть, и не так много их(ячеек) в гриде, то можно и так попробывать:

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var R: TRect;
procedure DownRect;
begin
 with StringGrid1.Canvas do begin
  Pen.Color:=clGray;
  MoveTo(R.Left+1, R.Top+1); LineTo(R.Right-1, R.Top+1);
  MoveTo(R.Left+1, R.Top+1); LineTo(R.Left+1, R.Bottom-1);
  Pen.Color:=clWhite;
  MoveTo(R.Right-1, R.Top+1); LineTo(R.Right-1, R.Bottom-1);
  MoveTo(R.Right-1, R.Bottom-1); LineTo(R.Left+1, R.Bottom-1);
 end;
end;
procedure UpRect;
begin
 with StringGrid1.Canvas do begin
  Pen.Color:=clWhite;
  MoveTo(R.Left+1, R.Top+1); LineTo(R.Right-1, R.Top+1);
  MoveTo(R.Left+1, R.Top+1); LineTo(R.Left+1, R.Bottom-1);
  Pen.Color:=clGray;
  MoveTo(R.Right-1, R.Top+1); LineTo(R.Right-1, R.Bottom-1);
  MoveTo(R.Right-1, R.Bottom-1); LineTo(R.Left+1, R.Bottom-1);
 end;
end;
var N: Integer;
begin
for N:=0 to StringGrid1.ColCount-1 do begin
 R:=StringGrid1.CellRect(N, 0);
 if N<>ACol then UpRect else DownRect;
end;
for N:=0 to StringGrid1.RowCount-1 do begin
 R:=StringGrid1.CellRect(0, N);
 if N<>ARow then UpRect else DownRect;
end;
end;
Хотя может кто и лучше, что придумает..

ЗЫ DefaultDrowing = True; Вообще все свойства StringGrid"а1 по умолчанию...


Там это был последний пост и... лучше вариантов не было. Может теперь будут :)


 
ЮЮ ©   (2007-07-11 03:57) [4]

Показывай свой OnDrawCell.


 
Евгений Р.   (2007-07-12 00:55) [5]

Построил по принципу {RASkov} . Вместо цикла делаю вызов UpRect для значения ACol и DownRect для Col.

procedure tBrnGrid_main.DrawTextCenter(txt: string; Rect: TRect);
  var x,y:integer;
Begin
  y:=rect.Top;
  x:=(rect.Left+rect.right) div 2 - canvas.TextWidth(txt) div 2;
  canvas.TextOut(x,y,txt);
end;{DrawTextCenter}

function tBrnGrid_main.SelectCell(ACol, ARow: Integer): Boolean;
 var R: TRect;
     nm:tBrnChees_nom;
begin
 result:=inherited SelectCell(ACol, ARow);
 r:=CellRect(ACol, 0);
 if  (r.left>0) then Begin
   canvas.Font.Color:=clBlue;
   canvas.brush.Color:=clBtnShadow;
   canvas.FillRect(r);
   nm:=tslNomShow.objects[aCol-1] as tBrnChees_nom;
   DrawTextCenter(str_li_ns(nm.nomer,4),R);
 End;{if}

 r:=CellRect(Col, 0);
 if (Col>0) and (col<>aCol) and (r.left>0) then Begin
   canvas.Font.Color:=clBlack;
   canvas.brush.Color:=clBtnFace;
   canvas.FillRect(r);
   nm:=tslNomShow.objects[Col-1] as tBrnChees_nom;
   DrawTextCenter(str_li_ns(nm.nomer,4),R);
 End;{if}

end;{SelectCell}



ТОлько ф-ция не отрабатывает при запуске, refresh и при скролинге таблицы.


 
ЮЮ ©   (2007-07-12 02:15) [6]

Код рисования ячейки должен быть в обработчике OnDrawCell, а никак не в OnSelectCell. Проведи над своим гридом формой другого приложения и убедись, что всю твою раскраску и форматирование "смыло".
Поэтому ф-ция не отрабатывает при запуске, refresh и при скролинге таблицы.


 
{RASkov} ©   (2007-07-12 08:40) [7]

А лучше сделать отдельный метод, который и вызывать и на OnDrawCell и на OnSelectCell....
Хотя я смотрю, что именно так вроде бы и сделано у автора (отдельным методом) и в Д5 может и нет параметра var CanSelect: Boolean....
просто вызывать его для фикс ячеек в OnDrawCell... Или tBrnGrid_main - это новый класс Грида?)
Я сейчас не помню, почему я прошлый раз сделал именно на OnSelectCell, видимо для уменьшения текста в посте :)


 
ЮЮ ©   (2007-07-12 11:44) [8]

> который и вызывать и на OnDrawCell и на OnSelectCell....

В этом нет смысла, т.к. OnDrawCell вызовется как для ечейки, потерявшей фокус, так и для получившей.


 
Евгений Р.   (2007-07-12 19:38) [9]


> т.к. OnDrawCell вызовется как для ечейки, потерявшей фокус,
>  так и для получившей.

Проблема была в том, что нужно перермсовать не ячейки, потерявшие и получившие фокус, а fixedRow ячейки соответствующих столбцов. Поэтому вызов и следовало делать из OnSelectCell. Тоже вызываю из OnDrawCell .


 
Евгений Р.   (2007-07-12 20:14) [10]

Вышло вот-так для строки и столбца:

procedure tBrnGrid_main.DrawDataHeader(row: integer; isSelected: boolean);
 var R: TRect;
begin
 r:=CellRect(0, row);
 if isSelected then Begin
   canvas.Font.Color:=clBlue;
   canvas.brush.Color:=clBtnShadow;
 End
 else Begin
   canvas.Font.Color:=clBlack;
   canvas.brush.Color:=clBtnFace;
 End;
 canvas.FillRect(r);
 DrawTextCenter(jDateToStrYY(DataFromRow(Row)),R);
end;

procedure tBrnGrid_main.DrawNomerHeader(col: integer; isSelected: boolean);
 var R: TRect;
     nm:tBrnChees_nom;
begin
 if (Col<1) or (Col>tslNomShow.Count) then exit;
 r:=CellRect(Col, 0);
 if r.Left=0 then exit;
 if isSelected then Begin
   canvas.Font.Color:=clBlue;
   canvas.brush.Color:=clBtnShadow;
 End
 else Begin
   canvas.Font.Color:=clBlack;
   canvas.brush.Color:=clBtnFace;
 End;
 canvas.FillRect(r);
 nm:=tslNomShow.objects[Col-1] as tBrnChees_nom;
 DrawTextCenter(str_li_ns(nm.nomer,4),R);
end;{DrawNomerHeader}

procedure tBrnGrid_main.DrawCell(Sender: TObject; ACol, ARow: Integer;Rect: TRect; State: TGridDrawState);
begin
 if (aCol=0) and (aRow=0) then Begin
    canvas.Font.Style:=[fsBold];
    DrawTextCenter("&#196;&#224;&#242;&#224;",Rect);
 End
 else if acol=0 then Begin
    DrawDataHeader(aRow,row=aRow);
 End
 else if aRow=0 then Begin
    DrawNomerHeader(aCol,col=aCol);
 End
 else DrawEl;
end;{DrawCell}

function tBrnGrid_main.SelectCell(ACol, ARow: Integer): Boolean;
begin
 result:=inherited SelectCell(ACol, ARow);

 DrawNomerHeader(aCol,true);
 if col<>aCol then DrawNomerHeader(Col,false);

 DrawDataHeader(aRow,true);
 if row<>aRow then DrawDataHeader(Row,false);

end;{SelectCell}



А будет ли приличным, если из .SelectCell вызывать DrawCell?


 
ЮЮ ©   (2007-07-13 03:36) [11]

> А будет ли приличным, если из .SelectCell вызывать DrawCell?


В любом методе "прилично" просто намекнуть, что требуется перерисовать определенную яцейку/столбец/строку/весь грид, а грид должен намек реализовать вызовом метода DrawCell, которой, наконец, вызовет OnDFrawCell. Вызывать OnDrawCell в OnSelectCell так же прилично, как рвать гланды через ж... - в принципе можно, но 1) требуется лишние телодвижения (вычисления CellRect) 2) дублируется код.

Метод "намека" - Innvalidate. Но это для всех ячеек грида. При желании можно использовать более "нацеленные" TCustomGrid-а: InvalidateCell/InvalidateRow/InvalidateCol


 
Евгений Р.   (2007-07-13 12:55) [12]

function tBrnGrid_main.SelectCell(ACol, ARow: Integer): Boolean;
begin
 result:=inherited SelectCell(ACol, ARow);
 if result then Begin
     if col<>aCol then Begin
       InvalidateCell(aCol,0);
       InvalidateCell(Col,0);
     End;
     if row<>aRow then Begin
       InvalidateCell(0,aRow);
       InvalidateCell(0,Row);
     End;
 End;{if result}
end;{SelectCell}


Действительно лучше, чем в [3]. Работает чище. И теперь все доп.процедуры (типа DrawDataHeader из [10]) можно запихнуть внутрь DrawCell.
Жалко только, что ValidateCell находится в protected.
Ну и параллельно несколько вопросов:
Чем отличаются InvalidateGrid от Invalidate от Refresh?
Для чего нужен InvalidateEditor?


 
ЮЮ ©   (2007-07-13 12:59) [13]

> Жалко только, что ValidateCell находится в protected.


У тебя, насколько можно понять по обилию inherited, наследник грида, так что для твоих методом можешь считать их Public.


> Чем отличаются InvalidateGrid от Invalidate от Refresh?
> Для чего нужен InvalidateEditor?

Код VCL разве закрыли?


 
Евгений Р.   (2007-07-13 13:22) [14]


> У тебя, насколько можно понять по обилию inherited, наследник
> грида, так что для твоих методом можешь считать их Public.
>

Но это не единственный dbGrid у меня.


> Код VCL разве закрыли?


Все равно спасибо!



Страницы: 1 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
15-1184164445
Mr. D.
2007-07-11 18:34
2007.08.12
Невероятно медленная обработка пикселей


11-1166391653
[e]Bu$ter
2006-12-18 00:40
2007.08.12
Вызов CHM справки из MessageBox


2-1184854326
kyro
2007-07-19 18:12
2007.08.12
Можно ли в дбшрид дважды загрузить данные


9-1157737951
аматор
2006-09-08 21:52
2007.08.12
Низкий ФПС


11-1150264932
MZUser
2006-06-14 10:02
2007.08.12
Создание DLL