Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Тот же 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]

Удалено модератором
Примечание: дубль


Наверх

Титульная страница Поиск, карта сайта Написать письмо