![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неправильная отрисовка 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