Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.05.2010, 19:57
hardir hardir вне форума
Прохожий
 
Регистрация: 22.05.2010
Сообщения: 2
Репутация: 10
По умолчанию 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  
Старый 26.05.2010, 20:05
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Как вариант (черновой) :

Код:
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  
Старый 05.07.2010, 13:34
hardir hardir вне форума
Прохожий
 
Регистрация: 22.05.2010
Сообщения: 2
Репутация: 10
По умолчанию

Короче сам придумал:

Код:
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  
Старый 21.07.2010, 12:36
An_private An_private вне форума
Прохожий
 
Регистрация: 21.07.2010
Сообщения: 5
Репутация: 10
По умолчанию

Хотел воспользоваться советом и сделать подсветку красным неправильно введеных данных в 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  
Старый 21.07.2010, 13:48
An_private An_private вне форума
Прохожий
 
Регистрация: 21.07.2010
Сообщения: 5
Репутация: 10
По умолчанию

Хм. Что-то вообще странное. Никак не инициировать обновление StringGrid если этот самый StringGrid не в фокусе.
То есть если "раскраска" ячеек инициирована нажатием кнопки, например, то до перехода фокуса на stringgrid это не отобразится - никак
И ни repaint, ни update, ни refresh не помогают
Блин. Ничего не понимаю
Ответить с цитированием
  #6  
Старый 21.07.2010, 14:30
An_private An_private вне форума
Прохожий
 
Регистрация: 21.07.2010
Сообщения: 5
Репутация: 10
По умолчанию

Вроде разобрался - что глючит, но как это обойти - еще не понял. Ситуация следующая.
Если мы редактируем какую-то ячейку в StringGrid и не выходя из режима редактирования переносим фокус на какой-либо другой элемент (например нажимаем button), то происходит следующее - само редактирование ячейки происходит средствами Delphi, то есть OnDrawCell не вызывается (что логично). И когда StringGrid теряет фокус, то активная ячейка с точки зрения Delphi продолжает находиться в режиме редактирования, поэтому OnDrawCell для неё просто не вызывается Соответственно раскрасить её нельзя никакими силами...
Сейчас буду что-то придумывать, но что - пока не очень понимаю...
Ответить с цитированием
  #7  
Старый 21.07.2010, 16:00
An_private An_private вне форума
Прохожий
 
Регистрация: 21.07.2010
Сообщения: 5
Репутация: 10
По умолчанию

В общем выкрутился, но через ...
В событии OnEnter прописываю
StringGridPassport.EditorMode := true;
В событии OnExit:
StringGridPassport.EditorMode := false;
StringGridPassport.Refresh;

Соответственно на входе в stringgrid включается режим редактирования и всё нормально работает, а на выходе он выключается и после refresh все ячейки перерисовываются.
Блин, полдня на этот глюк потратил
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:31.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter