Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.053 c
2-1168385732
AnEnd
2007-01-10 02:35
2007.01.28
Как быстро скопировать record ?


15-1168599776
Rouse_
2007-01-12 14:02
2007.01.28
Как правильно рисовать в MS Paint - е :)


2-1168501791
Apachi
2007-01-11 10:49
2007.01.28
сохранение результатов работы командной строки


15-1168183253
Подключаю бабушку
2007-01-07 18:20
2007.01.28
МТС gprs


15-1168090815
Lhbd
2007-01-06 16:40
2007.01.28
Выдрать драйвер...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский