Управление выделением и задание цвета строк в StringGrid

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Управление выделением и задание цвета строк в StringGrid

Сообщение alien308 »

Как сделать, чтобы в StringGrid выделялась не отдельная ячейка, а вся строка таблицы? Как установить цвет выделения и отдельной строки? И последнее, как осуществить программное выделение?
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Рисовать самому в событии StringGridSpDrawCell.

Пример 1.

Код: Выделить всё

procedure TFrmBorzh.StringGridSpDrawCell(Sender: TObject; aCol, aRow: Integer;
  aRect: TRect; aState: TGridDrawState);
begin
 if (ARow>0) and (StrToIntEmpty(SDASp.Cells[9, aRow]) in [10,11,12]) then
 begin
  with  StringGridSp.Canvas do
  begin
   StringGridSp.Canvas.FillRect(aRect);
   StringGridSp.Canvas.Font.Color := clRed;
   SetBkMode(Handle, TRANSPARENT);
   if  aCol in [1,2,4] then
   begin
    aRect.Left:=aRect.Left-3;
    DrawText(StringGridSp.Canvas.Handle, pchar(Utf8ToAnsi(StringGridSp.Cells[ACol, ARow])), -1, aRect, DT_SINGLELINE OR DT_VCENTER OR DT_CENTER);
   end;
   if  aCol in [0] then
   begin
    aRect.Left:=aRect.Left+3;
    DrawText(Handle, pchar(Utf8ToAnsi(StringGridSp.Cells[ACol, ARow])), -1, aRect, DT_SINGLELINE OR DT_VCENTER OR DT_LEFT);
   end;
   if  aCol in [3,5,6] then
   begin
    aRect.Right:=aRect.Right-4;
    DrawText(Handle, pchar(Utf8ToAnsi(StringGridSp.Cells[ACol, ARow])), -1, aRect, DT_SINGLELINE OR DT_VCENTER OR DT_RIGHT);
   end;
  end;
 end;
end;   


Пример 2.

Код: Выделить всё

procedure TFrmPhase030.StringGrid2DrawCell(Sender: TObject; aCol,
  aRow: Integer; aRect: TRect; aState: TGridDrawState);
Const   //сдесь определяем Ваш цвет. Так же можно использовать
         //цвета по умолчанию.
clPaleGreen = TColor($CCFFCC);
clPaleRed =   TColor($CCCCFF);
begin
//Если ячейка получает фокус, то нам надо закрасить её другими цветами
{if (gdFocused in aState) then begin
  StringGrid2.Canvas.Brush.Color := clBlack;
  StringGrid2.Canvas.Font.Color := clGreen;
end
else} //Если же ячейка теряет фокус, то закрашиваем её красным и зелёным
{ if ACol = 2   //Вторая колонка будет зелёной , другие - ячейки красными

   then StringGrid2.Canvas.Brush.color := clPaleGreen

   else StringGrid2.canvas.brush.Color := clPaleRed; }
//Теперь закрасим ячейки, но только, если ячейка не Title- Row/Column
//Естевственно это завит от того, есть у Вас title-Row/Columns или нет.
If (ACol=1) and (ARow>0) and
   (UTF8Copy({UTF8UpperCase}UpSymbols(StringGrid2.Cells[1,aRow]),1,7)='НЕ ВИЗН') then
begin
   //Закрашиваем бэкграунд
  StringGrid2.canvas.fillRect(aRect);
  //Закрашиваем текст (Text). Также здесь можно добавить выравнивание и т.д..
  StringGrid2.Canvas.Font.Color := clRed;
  StringGrid2.canvas.TextOut(aRect.Left+3,aRect.Top+2,StringGrid2.Cells[ACol,ARow]);
end;
end;   
alien308
новенький
Сообщения: 18
Зарегистрирован: 25.08.2012 09:37:47

Сообщение alien308 »

Спасибо, разбираюсь. А это где нибудь описано, кроме исходника grids.pas? 11163 строки и ни одного комментария.
Аватара пользователя
GAMER
энтузиаст
Сообщения: 627
Зарегистрирован: 06.08.2008 13:41:07
Откуда: Ужгород-Днепр, Украина
Контактная информация:

Сообщение GAMER »

Я это находил в инете, подправлял под себя.
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

alien308 писал(а):Как сделать, чтобы в StringGrid выделялась не отдельная ячейка, а вся строка таблицы?

Код: Выделить всё

StringGrid.Options := StringGrid.Options + [goRowSelect];

alien308 писал(а):Как установить цвет выделения?

Код: Выделить всё

StringGrid.SelectedColor := MyColor;

alien308 писал(а):как осуществить программное выделение?

Код: Выделить всё

StringGrid.Row := RowNumber;
Ответить