Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
1-1154879824
Vazelin
2006-08-06 19:57
2006.09.17
перехват закрытия окна


15-1156308822
Ega23
2006-08-23 08:53
2006.09.17
С Днём рождения! 23 августа


15-1156451817
Ketmar
2006-08-25 00:36
2006.09.17
что-то вроде туториала по написанию шелла


1-1154340156
abhtr
2006-07-31 14:02
2006.09.17
Как изменить меню "Вид" в OpenDialog


2-1156768006
ляляфа
2006-08-28 16:26
2006.09.17
клавиатура