Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.28;
Скачать: CL | DM;

Вниз

Тот же 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.052 c
2-1168473975
AnEnd
2007-01-11 03:06
2007.01.28
Как быстро скопировать record ?


4-1158337668
maxistent
2006-09-15 20:27
2007.01.28
Информация о процессе


15-1168112286
DRG
2007-01-06 22:38
2007.01.28
Game Prelauncher


1-1165036767
allrussia
2006-12-02 08:19
2007.01.28
Как в Memo при наведении мыши на слово оно выделялось цветом


2-1168103287
vegarulez
2007-01-06 20:08
2007.01.28
Как обартится к элементу с порядковым номером в виде переменной?