Текущий архив: 2006.09.17;
Скачать: CL | DM;
Вниз
Неправильная отрисовка TStringGrid Найти похожие ветки
← →
X9 © (2006-07-26 19:45) [0]Здравствуйте, форумчане.
Пытаюсь использовать в 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.
← →
ЮЮ © (2006-07-27 04:49) [1]
> Если постепенно "прогонять" программу отладчиком, то отрисовка
> проходит нормально (???), хотя форма не перекрывается ни
> одним другим окном.
А окна IDE уже и не окна?
Вставь StringGrid1.Repaint где нибудь в обработчике, изменяющем список, тот которыйif (ARow входит в список) then
← →
X9 © (2006-07-27 08:14) [2]Repaint происходит при выборе ячейки.
А при прогоне отладчиком над главной формой не находится НИ ОДНОГО окна, в т.ч. IDE.
← →
ЮЮ © (2006-07-27 08:21) [3]При выборе ячейки происходит Invalidate ячейки, теряющей фокус и принимающей фокус. Остальные не перерисовываюся - об этом говорит и то, что ячейки перерисовываются при проведении над ними окна
← →
X9 © (2006-07-27 12:01) [4]А как перерисовать плностью? Repaint не помогает.
← →
X9 © (2006-07-28 17:25) [5]Up
← →
Мефисто (2006-07-28 17:59) [6]
> X9 © (28.07.06 17:25) [5]
На королевстве дельфи была статья про "Цветной" или "Полосатый" DBGrid. По гугли или на самом королевстве поищи.
И не желательно игнорировать значение этой переменной для нормальной отрисовки с выделением ячеек: State: TGridDrawState
← →
X9 © (2006-07-29 18:17) [7]2 Мефисто
Нашёл эту статью в DelphiWorld. К сожалению, ничего нового для себя не узнал :(
Видимо, Вы невнимательно прочли мой вопрос. Я знаю, как закрашивать ячейки нужными цветами, но таблица неправильно перерисовывается при выборе ячейки. Если же попробовать всё то же самое под отладчиком, то всё работает нормально.
← →
GrayFace © (2006-07-30 05:58) [8]Тут лучше InvalidateRect. Еще в некоторых случаях неочевидного поведения помагает вызов Application.ProcessMessages.
← →
X9 © (2006-07-30 15:40) [9]Спасибо, попробую.
← →
X9 © (2006-07-31 19:26) [10]C неправильной отрисовкой разобрался, воткнув InvalidateGrid в TCustomDrawGrid.Select, создав свой компонент.
Теперь натолкнулся на другие грабли: не могу отловит нажатие клаиши Shift, ни в StringGrid.OnKeyDown, ни в Form.KeyDown, ни с помощью GetKeyState(VK_SHIFT) < 0.
Кто-нибудь знает, как победить?
← →
Плохиш © (2006-08-01 11:32) [11]
> X9 © (31.07.06 19:26) [10]
Я бы банально порекомендовал прочитать справку по OnKeyDown, особенно внимательно описание последнего передаваемого параметра.
← →
X9 © (2006-08-01 16:37) [12]
> Плохиш © (01.08.06 11:32) [11]
Я знаю о всех параметрах OnKeyDown, дело было не в этом. Просто при установленном флаге goRangeSelect не выполнялось условия GetKeyState(VK_SHIFT) < 0 и ssShift in ShiftState. Почему - не знаю, но без него всё работает.
Всем премного благодарен за ответы!
Страницы: 1 вся ветка
Текущий архив: 2006.09.17;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.076 c