![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тот же Stringgrid [D6]
Igor_Zal © (2006-11-30 11:27:00)Уважаемые Мастера.
Посмотрите пожалуйста пример рабочего кода для Stringgrid.
procedure TForm1.sgDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
const
WidthCellBorder = 3;
var
Clean:TRect;
begin
with sg.Canvas do
begin
if gdFocused in State then
begin
Brush.Color:=clblack;
FillRect(Rect);
Brush.Color:=clwindow;
Pen.Width:=WidthCellBorder;
pen.Color:=clblack;
Rectangle(Rect.Left,rect.Top,Rect.Right,Rect.Bottom);
Brush.Color:=clWindow;
Brush.Color:=$00CFA0A0;
if sg.FixedRows >0 then
FillRect(sg.CellRect(ACol,0));
if sg.FixedCols > 0 then
FillRect(sg.CellRect(0,ARow));
sg.Invalidate;
end else
begin
if gdSelected in State then
begin
Brush.Color:=$00CFA0A0;
FillRect(Rect);
Clean.Left:=sg.CellRect(sg.Selection.Left,sg.Selection.Top).Left;
Clean.Right:=sg.CellRect(sg.Selection.Right,sg.Selection.Top).Right;
Clean.Top:=sg.CellRect(sg.Selection.Left,sg.Selection.Top).Top;
Clean.Bottom:=sg.CellRect(sg.Selection.Left,sg.Selection.Bottom).Bottom;
Brush.Style := bsClear;
pen.Color:=clblack;
pen.Width:=WidthCellBorder;
Rectangle(Clean);
Brush.Color:=clWindow;
Pen.Color:=clWindow;
pen.Width:=1;
Brush.Color:=$00CFA0A0;
if sg.FixedRows >0 then
FillRect(sg.CellRect(0,ARow));
if sg.FixedCols > 0 then
FillRect(sg.CellRect(Acol,0));
sg.Invalidate;
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
sg.DoubleBuffered:=true;
end;
Память при этом исполнении расходуется мало,
но кода нажимаешь в Windows XP
CTL+ALT+Del в менеждере видно,
что у нашей программы (ЦП постоянно меняется)
В Excel такого нет (после выделения ЦП = 0), когда
выделяешь по такому же принципу.
Помогите решить такую проблему.
Заранее спасибо.
Leonid Troyanovsky (2006-12-01 13:48:00) [1]
> Igor_Zal (01.12.06 13:41) [8]
> Если можно покажите на примере.
http://rsdn.ru/Forum/Message.aspx?mid=631076&only=1
--
Regards, LVT.
Igor_Zal (2006-12-01 13:41:00) [2]Так в OnDrawCell sg и ориентируется на Sg.Selection, зачем закладывать
на TStringGrid.Selection или я что-то не понимаю.
Если можно покажите на примере.
ЮЮ (2006-12-01 13:22:00) [3]
> Значит пытаться перерисовать дипазон в OnSelectCell, даже
> если
> выделяется более чем одна ячейка.
Только код в OnDrawCell должен сразу закладываться на TStringGrid .Selection
Igor_Zal (2006-12-01 12:52:00) [4]Значит пытаться перерисовать дипазон в OnSelectCell, даже если
выделяется более чем одна ячейка. То есть, как я понял, Invalidate нужно
применить в этом месте?
ЮЮ (2006-12-01 12:38:00) [5]Поставь Invalidate в другой обработчит, в не в DrawCell. Туда - где надо принудительно вызвать перерисовку, ибо перерисовка требуется именно твоему гриду и не нужна стандартному.
Если использовать OnSelectCell - трудно сделать для дипазона, когда одна ячейка все получается.
Если этот обработчик вызывается при изменении области выделения. то там и ставь Invalidate. А отрисовка все-равно в OnDrawCell
Igor_Zal (2006-12-01 09:52:00) [6]А можно ли в данном случае обойтись без Invalidate?
Как тогда перерисоват диапазон с жирной линией по краям(как в Excel).
Если использовать OnSelectCell - трудно сделать для дипазона, когда одна ячейка все получается.
Помогите решить проблему.
Получается, чтомы перерисовываем ячейки дважды и идет постоянная нагрузка на уровень загруженности процесса.
Заранее спасибо.
icWasya (2006-11-30 12:26:00) [7]а зачем sg.Invalidate внутри sgDrawCell ??
Elen (2006-11-30 11:31:00) [8]
> Igor_Zal
А проблема то в чем? Что сильно меняется?
Elen (2006-11-30 11:31:00) [9]Удалено модератором
Примечание: дубль