|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
StringGrid красим ячейку текущей строки
Как закрасить первую ячейку текущей строки? Т.е. необходимо реализовать нечто подобное как в MS Excel. Т.е. я перемещаюсь по полю с пом. мыши или стрелок а в этот момент слева от текущей ячейки самая первая ячейка меняет свой цвет. Как сменить цвет текущей ячейки я знаю,
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (gdFocused in State) then begin StringGrid1.Canvas.Brush.Color := clBlack; StringGrid1.Canvas.Font.Color := clWhite; end end; а вот как это сделать с любой другой? |
#2
|
|||
|
|||
Как вариант (черновой) :
Код:
Const aColOld : integer = -1; aRowOld : integer = -1; ... ... procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); Var R : TRect; begin if aColOld>=0 then begin R := StringGrid1.CellRect(aColOld, 0); StringGrid1.Canvas.Brush.Color:=clBtnFace; StringGrid1.Canvas.FillRect(R); end; if aRowOld>=0 then begin R := StringGrid1.CellRect(0, aRowOld); StringGrid1.Canvas.Brush.Color:=clBtnFace; StringGrid1.Canvas.FillRect(R); end; R := StringGrid1.CellRect(ACol, 0); StringGrid1.Canvas.Brush.Color:=clYellow; StringGrid1.Canvas.FillRect(R); R := StringGrid1.CellRect(0, ARow); StringGrid1.Canvas.Brush.Color:=clYellow; StringGrid1.Canvas.FillRect(R); aRowOld:=aRow; aColOld:=aCol; end; |
#3
|
|||
|
|||
Короче сам придумал:
Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin if (((Acol=0)and(Mrow=Arow))or(Acol=Mcol))and((Arow=Mrow)or((Arow=0)and(MCol=Acol))) then begin StringGrid1.Canvas.Brush.Color := clSkyBlue; StringGrid1.Canvas.FillRect(Rect); StringGrid1.Canvas.TextOut(Rect.Left+2, Rect.Top+2, StringGrid1.Cells[ACol, ARow]); end; end; Mcol и Mrow берутся от сюда: Код:
procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); begin Mcol:=Acol; Mrow:=Arow; form1.StringGrid1.Repaint; end; Немного тормозит при перепрорисовке, но на пока прокатит. |
#4
|
|||
|
|||
Хотел воспользоваться советом и сделать подсветку красным неправильно введеных данных в StringGrid. И напоролся на странную проблему. Но, по порядку:
Для раскраски ячеек пишу следующее: Код:
procedure TFormMain.StringGridPLDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); begin with StringGridPL do begin Canvas.Brush.Color := PLColorsArray[ACol,ARow]; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]); end; end; Так как непосредственно по unselect'у ячейки никаких событий не происходит, то приходится отслеживать OnSelect и OnExit, ну тут всё работает - то есть процедура проверки отрабатывает когда надо - это я проверил. В чем состоит проблема. Если редактируешь ячейку с StringGrid, вводишь неправильное значение и переходишь на другой элемент управления (в моём случае на другую таблицу), то ячейка красным не подсвечивается. OnExit отрабатывает нормально, в массив цветов заносится clRed, но ячейка продолжает оставаться белой Пробовал вызывать в OnExit и Repaint и Update - результаты нулевые. То есть чтобы ячейка стала красной - надо сперва выбрать любую другую ячейку в той же таблице, а уже потом переходить на другую таблицу. Что это? Баг или фича? |
#5
|
|||
|
|||
Хм. Что-то вообще странное. Никак не инициировать обновление StringGrid если этот самый StringGrid не в фокусе.
То есть если "раскраска" ячеек инициирована нажатием кнопки, например, то до перехода фокуса на stringgrid это не отобразится - никак И ни repaint, ни update, ни refresh не помогают Блин. Ничего не понимаю |
#6
|
|||
|
|||
Вроде разобрался - что глючит, но как это обойти - еще не понял. Ситуация следующая.
Если мы редактируем какую-то ячейку в StringGrid и не выходя из режима редактирования переносим фокус на какой-либо другой элемент (например нажимаем button), то происходит следующее - само редактирование ячейки происходит средствами Delphi, то есть OnDrawCell не вызывается (что логично). И когда StringGrid теряет фокус, то активная ячейка с точки зрения Delphi продолжает находиться в режиме редактирования, поэтому OnDrawCell для неё просто не вызывается Соответственно раскрасить её нельзя никакими силами... Сейчас буду что-то придумывать, но что - пока не очень понимаю... |
#7
|
|||
|
|||
В общем выкрутился, но через ...
В событии OnEnter прописываю StringGridPassport.EditorMode := true; В событии OnExit: StringGridPassport.EditorMode := false; StringGridPassport.Refresh; Соответственно на входе в stringgrid включается режим редактирования и всё нормально работает, а на выходе он выключается и после refresh все ячейки перерисовываются. Блин, полдня на этот глюк потратил |