Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Неправильная отрисовка TStringGrid [D7, WinXP]


X9 ©   (2006-07-26 19:45:00) 

Здравствуйте, форумчане.

Пытаюсь использовать в StringGrid собственное выделение, но натакливаюсь на глюки с прорисовкой. Мне необходимо, чтобы пользователь мог выделять только строки целиком, но не только одну строку или диапазон, а ещё и "врассыпную" (удерживая клавишу Control). Имеется список выделенных строк, элементы добавляются/удаляются по событию OnSelectCell, если выделение происхоит без нажатия управляющей клавиши, то список очищается и внего заносится только один элемент - выделенная строка, при этом параметр CanSelect устанавливаю в False, так как использую собственную отрисовку, затем вызываю метод StringGrid1.Repaint. DefaultDrawing = истина. Обработчик OnDrawCell выглядит примерно так:

procedure Form1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Longint; Rect: TRect;...);
begin
 with StringGrid1 do
   with Canvas do
   begin
     Brush.Color := clWhite;
     if (ARow входит в список) then
     begin
       Brush.Color := clHighlight;
       Font.Color := clWhite;
     end;
     FillRect(Rect);
     TextOut(Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]);
   end;
end;


Если выделить несколько строк, а затем выделить одну без нажатой клавиши Ctrl, то нарисованное выделение не пропадет.
В таблице 2 столбца, и если после выделения нескольких строк снять выделение с одной из них, щёлкнув при этом в области первого столбца, то заливка пропадет только в этой части строки, а в области вторго столбца - остаётся. Если же щёлкнуть в области второго столбца, то всё нормально рисуется. Если спровоцировать перерисовку таблицы, "пронеся" над ней другую форму или выдвинув данную форму за границы экрана, то происходит нормальная отрисовка, причём только в той области, над которой прошла форма. Если, например, чужая форма задела лишь пол-ячейки, то нормальная отрисовка будет только в этой половине.
Ощущение такое, как будто таблица не перерисовывается полностью, а перерисовывается лишь выделенная ячейка.

Если постепенно "прогонять" программу отладчиком, то отрисовка проходит нормально (???), хотя форма не перекрывается ни одним другим окном.

Заранее всем благодарен,
 с уважением, X9.


X9   (2006-08-01 16:37:00) [1]


> Плохиш ©   (01.08.06 11:32) [11]

Я знаю о всех параметрах OnKeyDown, дело было не в этом. Просто при установленном флаге goRangeSelect не выполнялось условия GetKeyState(VK_SHIFT) < 0 и ssShift in ShiftState. Почему - не знаю, но без него всё работает.

Всем премного благодарен за ответы!


Плохиш   (2006-08-01 11:32:00) [2]


> X9 ©   (31.07.06 19:26) [10]

Я бы банально порекомендовал прочитать справку по OnKeyDown, особенно внимательно описание последнего передаваемого параметра.


X9   (2006-07-31 19:26:00) [3]

C неправильной отрисовкой разобрался, воткнув InvalidateGrid в TCustomDrawGrid.Select, создав свой компонент.

Теперь натолкнулся на другие грабли: не могу отловит нажатие клаиши Shift, ни в StringGrid.OnKeyDown, ни в Form.KeyDown, ни с помощью GetKeyState(VK_SHIFT) < 0.

Кто-нибудь знает, как победить?


X9   (2006-07-30 15:40:00) [4]

Спасибо, попробую.


GrayFace   (2006-07-30 05:58:00) [5]

Тут лучше InvalidateRect. Еще в некоторых случаях неочевидного поведения помагает вызов Application.ProcessMessages.


X9   (2006-07-29 18:17:00) [6]

2 Мефисто
Нашёл эту статью в DelphiWorld. К сожалению, ничего нового для себя не узнал :(
Видимо, Вы невнимательно прочли мой вопрос. Я знаю, как закрашивать ячейки нужными цветами, но таблица неправильно перерисовывается при выборе ячейки. Если же попробовать всё то же самое под отладчиком, то всё работает нормально.


Мефисто   (2006-07-28 17:59:00) [7]


> X9 ©   (28.07.06 17:25) [5]


На королевстве дельфи была статья про "Цветной" или "Полосатый" DBGrid. По гугли или на самом королевстве поищи.

И не желательно игнорировать значение этой переменной для нормальной отрисовки с выделением ячеек: State: TGridDrawState


X9   (2006-07-28 17:25:00) [8]

Up


X9   (2006-07-27 12:01:00) [9]

А как перерисовать плностью? Repaint не помогает.


ЮЮ   (2006-07-27 08:21:00) [10]

При выборе ячейки происходит Invalidate ячейки, теряющей фокус и принимающей фокус. Остальные не перерисовываюся - об этом говорит и то, что ячейки перерисовываются при проведении над ними окна


X9   (2006-07-27 08:14:00) [11]

Repaint происходит при выборе ячейки.
А при прогоне отладчиком над главной формой не находится НИ ОДНОГО окна, в т.ч. IDE.


ЮЮ   (2006-07-27 04:49:00) [12]


> Если постепенно "прогонять" программу отладчиком, то отрисовка
> проходит нормально (???), хотя форма не перекрывается ни
> одним другим окном.


А окна IDE уже и не окна?

Вставь StringGrid1.Repaint где нибудь в обработчике, изменяющем список, тот который   if (ARow входит в список) then


Наверх

Титульная страница Поиск, карта сайта Написать письмо