Главная страница
    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.045 c
6-1156412329
AlexAlex
2006-08-24 13:38
2007.01.28
Ошибка при отмене печати из объекта TWebbrowser.


6-1156094923
Calibr
2006-08-20 21:28
2007.01.28
Как узнать IP-адрес компьютера?


1-1165088447
BOB16
2006-12-02 22:40
2007.01.28
Как убрать мое приложение с панели задач


15-1168255147
i-am-vladko
2007-01-08 14:19
2007.01.28
Статья "Написание оптимального кода под Delphi"


2-1168324543
Extar
2007-01-09 09:35
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский