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

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

Проблема с процедурой OnDrawCell [D7, XP]


nickmas ©   (2005-11-29 03:40:00) 

Есть процедура TForm1.StringGrid1DrawCell, которая занимается раскраской StringGrid-а.
 Далее динамически создается StringGrid2 и к нему прикручивается это процедура: StringGrid2.OnDrawCell:=StringGrid1.OnDrawCell;

  Теперь суть проблемы: В StringGrid2 дублируются значения из StringGrid1. И эта проблема возникла из-за подключения процедуры OnDrawCell. А нужно, чтобы StringGrid2 отображал свои собственные значения.

 Если кто знает - подскажите!


nickmas   (2005-11-29 08:31:00) [1]

Ясно, спасибо - над этим поработаю.


MBo   (2005-11-29 08:29:00) [2]

Sender - объект, компонент, инициировавший событие.
Поскольку у тебя это один из гридов, то можно сразу получить и использовать TStringGrid(Sender), а не указывать в коде конкретный грид.


nickmas   (2005-11-29 08:16:00) [3]

Да... Это уже невнимательность...
 
 Спасибо за подсказку.

 А что там на счет Sender, и чем плох FindComponent? Дело в том, что я с этим первый раз работаю и был бы признателен за любой полезный совет.


MBo   (2005-11-29 07:57:00) [4]

Не смущает вот эта строка?

Canvas.TextOut(Rect.Left+6,Rect.Top+2, StringGrid1.Cells[ACol,ARow]);

Используй Sender, и заодно избавься от использования FindComponent


nickmas   (2005-11-29 07:47:00) [5]

Вот сам обработчик:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
const
 clPaleBlue = TColor(clSkyBlue);
 clPaleCream = TColor(clCream);
begin
 if (PageControl1.ActivePageIndex=0) then
   with FindComponent('StringGrid'+IntToStr(PageControl1.ActivePageIndex+1)) as TStringGrid do
     begin
       if (gdFocused in State) then
         begin
           Canvas.Brush.Color:=clNavy;
           Canvas.Font.Color:=clWhite;
         end
       else
         begin
           if (ARow>=Range11) and (ARow<=Range12) then
             Canvas.Brush.Color:=clSkyBlue;
           if (ARow>=Range21) and (ARow<=Range22) then
             Canvas.Brush.Color:=clCream;
           if (ARow>=Range31) and (ARow<=Range32) then
             Canvas.Brush.Color:=clMoneyGreen;
         end;
       if (ACol>0) and (ARow>0) then
         begin
           Canvas.FillRect(Rect);
           Canvas.TextOut(Rect.Left+6,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
         end;
     end;
 
 if (PageControl1.ActivePageIndex>0) then
   with Form3 do
     with FindComponent('StringGrid'+IntToStr(PageControl1.ActivePageIndex+1)) as TStringGrid do
       begin
         if (gdFocused in State) then
           begin
             Canvas.Brush.Color:=clNavy;
             Canvas.Font.Color:=clWhite;
           end
         else
           begin
             if (ARow>=Range11) and (ARow<=Range12) then
               Canvas.Brush.Color:=clSkyBlue;
             if (ARow>=Range21) and (ARow<=Range22) then
               Canvas.Brush.Color:=clCream;
             if (ARow>=Range31) and (ARow<=Range32) then
               Canvas.Brush.Color:=clMoneyGreen;
           end;
         if (ACol>0) and (ARow>0) then
           begin
             Canvas.FillRect(Rect);
             Canvas.TextOut(Rect.Left+6,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
           end;
       end;
end;


nickmas   (2005-11-29 07:46:00) [6]

Вот сам обработчик:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
const
 clPaleBlue = TColor(clSkyBlue);
 clPaleCream = TColor(clCream);
begin
 if (PageControl1.ActivePageIndex=0) then
   with FindComponent('StringGrid'+IntToStr(PageControl1.ActivePageIndex+1)) as TStringGrid do
     begin
       if (gdFocused in State) then
         begin
           Canvas.Brush.Color:=clNavy;
           Canvas.Font.Color:=clWhite;
         end
       else
         begin
           if (ARow>=Range11) and (ARow<=Range12) then
             Canvas.Brush.Color:=clSkyBlue;
           if (ARow>=Range21) and (ARow<=Range22) then
             Canvas.Brush.Color:=clCream;
           if (ARow>=Range31) and (ARow<=Range32) then
             Canvas.Brush.Color:=clMoneyGreen;
         end;
       if (ACol>0) and (ARow>0) then
         begin
           Canvas.FillRect(Rect);
           Canvas.TextOut(Rect.Left+6,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
         end;
     end;
 
 if (PageControl1.ActivePageIndex>0) then
   with Form3 do
     with FindComponent('StringGrid'+IntToStr(PageControl1.ActivePageIndex+1)) as TStringGrid do
       begin
         if (gdFocused in State) then
           begin
             Canvas.Brush.Color:=clNavy;
             Canvas.Font.Color:=clWhite;
           end
         else
           begin
             if (ARow>=Range11) and (ARow<=Range12) then
               Canvas.Brush.Color:=clSkyBlue;
             if (ARow>=Range21) and (ARow<=Range22) then
               Canvas.Brush.Color:=clCream;
             if (ARow>=Range31) and (ARow<=Range32) then
               Canvas.Brush.Color:=clMoneyGreen;
           end;
         if (ACol>0) and (ARow>0) then
           begin
             Canvas.FillRect(Rect);
             Canvas.TextOut(Rect.Left+6,Rect.Top+2,StringGrid1.Cells[ACol,ARow]);
           end;
       end;
end;

А теперь какие идеи?


MBo   (2005-11-29 07:29:00) [7]

Решает проблему правильный обработчик OnDrawCell.
Раз ты свой не привел - и говорить пока не о чем.


nickmas   (2005-11-29 07:22:00) [8]

Понятно, но это не решает проблему.


Германн   (2005-11-29 04:05:00) [9]

2 nickmas   (29.11.05 03:40)  
>Есть процедура TForm1.StringGrid1DrawCell, которая занимается раскраской >StringGrid-а.

Формально сия процедура должна заниматься не только "раскраской", но и полным отображением "всей информации" для данной ячейки данного грида.


Наверх

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