понедельник, 31 января 2011 г.

Delphi компонет StringGrid, событие onSelectCell

   Сегодня возник вопрос: Как узнать текущую выбранную строку в списке StringGrid. Это делается с помощью следующего кода:
StringGrid1.ARow 
   Теперь усложним задачу, у нас есть список StringGrid, в зависимости от выбранного элемента в StringGrid и соответственно значения в ячейке устанавливается соответствующий переключатель в RadioGroup. (Рис.1)
Рис.1 

 Решение: В компоненте StringGrid для события onSelectCell есть процедура обработки и установки переключателя в RadioGroup. Проблема в том что если кликать мышкой в списке StringGrid - все отлично работает и обрабатывается корректно. Если же перемещаться по списку с помощью курсора - событие onSelectCell наступает раньше, чем устанавливается значение в StringGrid1.ARow.
   Решение проблемы нашел на одном из зарубежных форумов. Для заметки привожу в своем блоге:
Устанавливаем свойство onRowSelect в false. Если вам нужно чтобы строка была выделенной - пишем на событие onDrawCell следующий код :
if gdFixed in State then Exit;
  if ARow=TStringGrid(Sender).Row then
  begin
    TStringGrid(Sender).canvas.Brush.color:=clBlue;
    TStringGrid(Sender).canvas.Font.Color:=clWhite;
    TStringGrid(Sender).canvas.TextRect(Rect,Rect.Left +2,Rect.Top+2,TStringGrid(Sender).Cells[ACol,ARow])
  end
  else
  begin
    TStringGrid(Sender).canvas.Brush.color:=TStringGrid(Sender).Color;
    TStringGrid(Sender).canvas.TextRect(Rect,Rect.Left +2,Rect.Top+2,TStringGrid(Sender).Cells[ACol,ARow])
end;
   Если нужно - можно изменить цвет отображения выделенной строки.
Теперь нам нужно дописать для компонента StringGrid на событие onSelectCell следующий код:
var
   SaveEvent:TSelectCellEvent;
begin
if ARow<>TStringGrid(Sender).Row then
begin
   SaveEvent:=TStringGrid(Sender).OnSelectCell;
   TStringGrid(Sender).OnSelectCell:=Nil;
   TStringGrid(Sender).Row:=ARow;
   CanSelect:=False;
   TStringGrid(Sender).Refresh;
   TStringGrid(Sender).OnSelectCell:=SaveEvent;
end;  

4 комментария:

Юля комментирует...

А как сделали, чтобы при перемещении по ячейкам в СтрингГрид менялись и пункты в РадиоГруп ??
Как это сделать в SelectCell ?

androschuk комментирует...

На событие onSelectCell (StringGrid-a) нужно написать обработчик. Выделенная строка находится в ARow

Андрей комментирует...

Хорошо было бы соурс получить

androschuk комментирует...

исходник до этого момента к сожалению не сохранился.