Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > StringGrid


Автор: Digo 12.10.2004, 17:10
У меня на форме несколько StringGrid - ов и в каждом подсвечено по одной ячейке. Они используются для вывода и поэтому подсветка портит внешний вид. Можно ли убрать это выделение. Спасибо.

Автор: x77 12.10.2004, 17:33
штатными средствами - нельзя. извратами - можно, но, мне кажется, не нужно. если в гридах используется всего одна ячейка, то какой вообще смысл использовать гриды? может, стоит подыскать чего попроще, Label, Panel, PaintBox в конце-концов.
Добавлено @ 17:38
Pakshin A. S., коллега, вы бредите smile.gif

здесь проблема не в отрисовке ячейки. вместо всего, что вы написали достаточно убрать из StringGrid1.Options goDrawFocusSelected - эффект будет тот же.

здесь проблема в самой винде, которая при потере контролом фокуса выделяет его цветом. в некоторых контролах это обходится установкой свойства HideSelection, но в StringGrid'е такого свойства просто нет.

протесть сам свой код на двух гридах. на одном он будет работать, а на двух в момент смены активного контрола опять появится выделение.
Добавлено @ 17:40
эк оно проглючило adv/wow.gif

Автор: Pakshin A. S. 12.10.2004, 17:33
Создаем событие OnDrawCell
Код

var
Col:integer absolute ACol;
Row: integer absolute ARow;
Buf: array[byte] of char;
begin
if (gdFixed in State) then Exit;
with StringGrid1 do begin
 Canvas.Font:=Font;
 Canvas.Font.Color:=clWindowText;
 Canvas.Brush.Color:=clWindow;
 canvas.FillRect(Rect);
 StrPCopy(buf, Clls[ACol, ARow]);
 DrawText(canvas.Handle, Buf, -1, Rect, DT_SENGLELINE or DT_VCENTER or DT_NOCLIP or DT_LEFT);
end;
end;

Автор: Pakshin A. S. 12.10.2004, 18:43
Цитата(x77 @ 12.10.2004, 18:33)
эк оно проглючило 

Меня?
Может, но этот код небходим: при Options goDrawFocusSelected;=false при появлении формы первая ячейка будет выделенной!!! Мой код убирает её выделение...

Автор: x77 12.10.2004, 18:53
Pakshin A. S., да нет, проглючило форум. посмотри на время постингов, я писал после тебя, а сообщения легли до тебя.

не будет она выделенной. а вот при потере фокуса - станет выделенной, хоть с твоим кодом, хоть без него.

Автор: Pakshin A. S. 12.10.2004, 18:58
Цитата(x77 @ 12.10.2004, 19:53)
проглючило форум.

А, по-моему, всё в порядке: после первого поста не прошло десять минут...

Автор: Digo 12.10.2004, 20:43
x77 - я гирдами пользуюсь потому что нужно много данных выводить.
StringGrid1.Options goDrawFocusSelected:=false у меня стоит по умолчанию, конечно если таблица активна выделение пропадает, но от этого не легче sad.gif

Pakshin A. S. В твоем коде выводится ошибка на StrPCopy(buf, Clls[ACol, ARow]); Это наверное Cells?
и в DT_SENGLELINE наверно DT_SINGLELINE... На одной выделение пропадает на 2 и более нет.

Автор: Pakshin A. S. 12.10.2004, 20:51
Верно, просто спешил... sad.gif

Автор: x77 12.10.2004, 21:03
Digo, а если взять тот же TListView?

Автор: p0s0l 12.10.2004, 22:46
Цитата
На одной выделение пропадает на 2 и более нет.
Странно, но код Pakshin A. S. у меня с несколькими гридами нормально работает, только надо DefaultDrawing := false у всех гридов...

Автор: p0s0l 12.10.2004, 23:15
Ан нет, поспешил я smile.gif - там его дорабатывать надо...
Можно так попробовать:
Код

procedure MyProc(S : TStringGrid);
var gr : TGridRect;
begin
 FillChar (gr, SizeOf(gr), -1);
 S.Selection := gr;
end;

procedure TForm1.StringGrid1Exit(Sender: TObject);
begin
 MyProc (Sender as TStringGrid);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 MyProc (StringGrid1);
 MyProc (StringGrid2);
...
end;
Т.е. вешаем на OnExit обработчик (единый для всех гридов) и в OnCreate формы убираем выделение...

Чуть не забыл:
goRangeSelect = False,
goDrawFocusSlected = False,
goRowSelect = False

Автор: Digo 13.10.2004, 19:39
Спасибо всем за помощь thumbs-up.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)