Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизТот же Stringgrid Найти похожие ветки
← →
Igor_Zal (2006-11-30 11:27) [0]Уважаемые Мастера.
Посмотрите пожалуйста пример рабочего кода для 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), когда
выделяешь по такому же принципу.
Помогите решить такую проблему.
Заранее спасибо.
← →
Elen © (2006-11-30 11:31) [1]
> Igor_Zal
А проблема то в чем? Что сильно меняется?
← →
Elen © (2006-11-30 11:31) [2]Удалено модератором
Примечание: дубль
← →
icWasya © (2006-11-30 12:26) [3]а зачем sg.Invalidate внутри sgDrawCell ??
← →
Igor_Zal (2006-12-01 09:52) [4]А можно ли в данном случае обойтись без Invalidate?
Как тогда перерисоват диапазон с жирной линией по краям(как в Excel).
Если использовать OnSelectCell - трудно сделать для дипазона, когда одна ячейка все получается.
Помогите решить проблему.
Получается, чтомы перерисовываем ячейки дважды и идет постоянная нагрузка на уровень загруженности процесса.
Заранее спасибо.
← →
ЮЮ © (2006-12-01 12:38) [5]Поставь Invalidate в другой обработчит, в не в DrawCell. Туда - где надо принудительно вызвать перерисовку, ибо перерисовка требуется именно твоему гриду и не нужна стандартному.
Если использовать OnSelectCell - трудно сделать для дипазона, когда одна ячейка все получается.
Если этот обработчик вызывается при изменении области выделения. то там и ставь Invalidate. А отрисовка все-равно в OnDrawCell
← →
Igor_Zal (2006-12-01 12:52) [6]Значит пытаться перерисовать дипазон в OnSelectCell, даже если
выделяется более чем одна ячейка. То есть, как я понял, Invalidate нужно
применить в этом месте?
← →
ЮЮ © (2006-12-01 13:22) [7]
> Значит пытаться перерисовать дипазон в OnSelectCell, даже
> если
> выделяется более чем одна ячейка.
Только код в OnDrawCell должен сразу закладываться на TStringGrid.Selection
← →
Igor_Zal (2006-12-01 13:41) [8]Так в OnDrawCell sg и ориентируется на Sg.Selection, зачем закладывать
на TStringGrid.Selection или я что-то не понимаю.
Если можно покажите на примере.
← →
Leonid Troyanovsky © (2006-12-01 13:48) [9]
> Igor_Zal (01.12.06 13:41) [8]
> Если можно покажите на примере.
http://rsdn.ru/Forum/Message.aspx?mid=631076&only=1
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c