Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Свой цвет в фокусированной ячейке


Автор: December 2.6.2004, 03:54
Greetings All!
Пытаюсь сделать подсветку в дбгриде. Использую EhLib, но это не важно - методы кастомгридовские.
В чём суть: когда я изменяю цвет шрифта, то в выделенной мышкой ячейке, которая закрашена синим, чёрные буквы не слишком хорошо смотрятся. Как бы сделать так, чтобы в закрашенных ячейках буквы были, к примеру, зелёные?
Код такой:
Код

Stated:=Query1.FieldByName('Заявлено').AsFloat;
       Actual:=Query1.FieldByName('Поступило').AsFloat;
       if Stated<>Actual then DBGridEh1.Canvas.Font.Color:=HighlightColor
                else {if (state=[gdSelected]) or (state=[gdFocused])
                             then DBGridEh1.Canvas.Font.Color:=clGreen else}
                        DBGridEh1.Canvas.Font.Color:=clWindowText;
       DBGridEh1.DefaultDrawColumnCell(Rect,DataCol,Column,State);

Свои попытки добиться результата я закомментил.

Автор: <Spawn> 2.6.2004, 05:29
Попробуй использовать Canvas.TextOut. Перед вызовом данного метода установи нужный цвет в свойстве Font.Color.

Автор: December 2.6.2004, 12:16
Забыл сказать: это исполняется в OnDrawColumnCell
<Spawn>
Попробую, но имхо, это ход через анус.

Автор: <Spawn> 2.6.2004, 16:18
December А под дургому и вряд ли получится, только если использовать чисто АПИ, либо компоненты, в которых есть методы для реализации твоей затей, но они все равно будут, скорее всего юзать АПИ.

Автор: December 3.6.2004, 00:37
<Spawn>
Фишка в том, что у события есть параметр State, в котором (как уверяет хелп) лежит состояние ячейки - фокус/не фокус и т.п. Я думаю, что именно этот механизм надо использовать.

Автор: Unregistered 3.6.2004, 02:57
может вот так подойдет?

Код

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
 DataCol: Integer; Column: TColumn; State: TGridDrawState);
var ARect0,ARect1:Trect;
function GetCellRect(ADatacol:integer):TRect;
begin
 Result:=TFakeGrid(Sender).CellRect(ADataCol+1,TFakeGrid(Sender).Row);
end;
begin
 with TDBGrid(Sender) do
 begin
 ARect0:=GetCellRect(0);
 ARect1:=GetCellRect(1);
 if (gdSelected in State) or (gdFocused in State) then
 begin
   if Columns[0].Field.AsString<>Columns[1].Field.AsString then
   begin
    Canvas.Font.Color:=clLime;
    Canvas.TextRect(ARect0,ARect0.Left,ARect0.Top,Columns[0].Field.AsString);
    Canvas.Font.Color:=clRed;
    Canvas.TextRect(ARect1,ARect1.Left,ARect1.Top,Columns[1].Field.AsString);
   end
   else
   begin
    Canvas.Font.Color:=clgreen;
    Canvas.TextRect(ARect0,ARect0.Left,ARect0.Top,Columns[0].Field.AsString);
    Canvas.Font.Color:=clGreen;
    Canvas.TextRect(ARect1,ARect1.Left,ARect1.Top,Columns[1].Field.AsString);
   end;
 end;
 end;
end;

В GetCellRect передается индекс колонки которую будешь красить. Соответственно у меня здесь сравниваются данные по колонкам 0 и 1.

Автор: Unregistered 3.6.2004, 02:59
Забыл:
type
TFakeGrid=class(TCustomgrid)
end;

Автор: December 3.6.2004, 10:53
Thanks! Попробую.

Автор: Medved 5.6.2004, 22:16
Тип 1:
Код

         if (Rect.Top = dbg1.CellRect(dbg1.Col,dbg1.Row).Top) and (not (gdFocused in State) or not dbg1.Focused)
           then begin
             dbg1.Canvas.Brush.Color := clBlack;
             dbg1.Canvas.Font.Color := clWhite;
           end;
         dbg1.DefaultDrawColumnCell(Rect,DataCol,Column,State);


Тип 2:
Код

       with Sender as TDBGridEh
         do begin
           if gdSelected in State
             then begin
               Canvas.Brush.Color:= clBlack;
               Canvas.FillRect(Rect);
               Canvas.Font.Color:= clWhite;
               Canvas.TextRect(Rect,Rect.Left+2,Rect.Top+1,Column.DisplayText);
             end;
         end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)