![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Как закрасить первую ячейку текущей строки? Т.е. необходимо реализовать нечто подобное как в 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 все ячейки перерисовываются. Блин, полдня на этот глюк потратил ![]() |