Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2012, 21:23   #1
GhossT
Новичок
Джуниор
 
Регистрация: 10.11.2012
Сообщений: 2
По умолчанию Отрисовка динамического StringGrid

Привет, недавно столкнулся с проблемой - при динамическом создании StringGrida на вкладке PageControl-a (вкладки тоже динамические) отрисовка цвета ячеек идет нормально, но если создать вторую вкладку со вторым StringGrid-om, то при переключении на первую вся отрисовка стирается, и остается Стринггрид уже без цветных ячеек (остается цветным только последний созданный).
Код:

Код:
type
  TForm3 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    ListView1: TListView;
    Image1: TImage;
    Procedure  ButClick(Sender: TObject);
    procedure ListView1DblClick(Sender: TObject);
    Procedure sGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
  private
  public
  end;

var
  Form3: TForm3;
  n,s,k:integer;
  TabSheet: array of TTabSheet;
  But:TBitBtn;
  Sgrid:TStringGrid;

Procedure  TForm3.ButClick(Sender: TObject);
var Active:Integer;
Begin
   with PageControl1 do
      Begin
         Active:=PageControl1.ActivePageIndex;
         Pages[Active].Destroy;
         PageControl1.ActivePage:=TabSheet[Active-1];
      End;
   SetLength(TabSheet,n-1);
end;

procedure TForm3.sGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
  I: Integer;
Begin;
     if sGrid.Cells[Acol,ARow]='5' then
  begin
    sgrid.Canvas.Brush.Color := $0077FD99;    {тут цвет}
    sgrid.Canvas.FillRect (Rect);
    sgrid.Canvas.TextRect (Rect, Rect.Left + 2, Rect.Top + 2, sgrid.Cells[ACol,ARow]);
  end;

  if sGrid.Cells[Acol,ARow]='4' then
  begin
    sgrid.Canvas.Brush.Color := $0077FAFD;    {тут цвет}
    sgrid.Canvas.FillRect (Rect);
    sgrid.Canvas.TextRect (Rect, Rect.Left + 2, Rect.Top + 2, sgrid.Cells[ACol,ARow]);
  end;

  if sGrid.Cells[Acol,ARow]='3' then
  begin
    sgrid.Canvas.Brush.Color := $00758AFF;    {тут цвет}
    sgrid.Canvas.FillRect (Rect);
    sgrid.Canvas.TextRect (Rect, Rect.Left + 2, Rect.Top + 2, sgrid.Cells[ACol,ARow]);
  end;
  SetBkMode(Handle, TRANSPARENT);
end;

procedure TForm3.ListView1DblClick(Sender: TObject);
   var
      BMP:TPNGImage;
      b:TBitMap;
      ItmIdx,i,j:Integer;
      Rect:TRect;
      Text:String;
      But:TBitBtn;
begin
  ItmIdx:=Listview1.ItemIndex;
  if ItmIdx=-1 then Exit;
  for I := 0 to n-1 do
    Begin
      if Tabsheet[i].Caption=Listview1.Items.Item[itmIdx].Caption+' '+ Listview1.Items.Item[itmidx].SubItems[0] then
      begin
       exit;
      end;

    End;

  {****Create TabSheet****}

  n:=Length(TabSheet)+1;
  SetLength(TabSheet,n);
  TabSheet[n-1]:=TTabSheet.Create(self); //создать вкладку, n-1 т.к. нумерация с 0
  TabSheet[n-1].Caption:=Listview1.Items.Item[itmIdx].Caption+' '+ Listview1.Items.Item[itmidx].SubItems[0];
  TabSheet[n-1].PageControl:=PageControl1;
  PageControl1.ActivePage:=TabSheet[n-1]; //сделать активной


  {****Create Button****}

  But:=TBitBtn.Create(Self);
  But.Parent:=TabSheet[n-1] ;
  But.left:=TabSheet[n-1].Width-45;
  But.Top:=10;
  But.OnClick:=ButClick;
  BMP:= TPNGImage.Create;
  B:=TBitMap.Create;
  BMP.LoadFromFile('C:\Users\Lexa\desktop\exit2.png');
  b.Assign(BMP);
  But.Glyph:=b;
  But.Width:=b.Width+1;
  But.Height:=But.Height+5;
  BMP.free;
  b.Free;

  {****Create List****}
  Sgrid:=TStringGrid.Create(Self);
  sGrid.Name:='sGrid'+Inttostr(n-1);
  Sgrid.Parent:=TabSheet[n-1];
  sGrid.OnDrawCell:=SGridDrawCell;
  Sgrid.Width:=Listview1.Width div 2 + 16;
  Sgrid.Height:=Listview1.Height div 2 + 89;
  Sgrid.Left:=Listview1.Left+160;
  Sgrid.Top:=Listview1.top+50;
  Sgrid.Visible:=True;
  Sgrid.ColCount:=7;
  SGrid.RowCount:=13;

  {****Add Cols&Rosw****}

  with sGrid do
     Begin
       Cols[1].Text:='I';
       Cols[2].Text:='II';
       Cols[3].Text:='III';
       Cols[4].Text:='IV';
       Cols[5].Text:='I+II';
       Cols[6].Text:='III+IV';
       Cols[7].Text:='YEAR';
       Rows[1].Text:='Русский язык';
       Rows[2].Text:='Литература';
       Rows[3].Text:='Обществознание';
       Rows[4].Text:='История';
       Rows[5].Text:='Физика';
       Rows[6].Text:='Химия';
       Rows[7].Text:='Биология';
       Rows[8].Text:='Физкультура';
       Rows[9].Text:='Информатика';
       Rows[10].Text:='Математика';
       Rows[11].Text:='Геометрия';
       Rows[12].Text:='Башкириский';
     End;

       sGrid.Cells[2,3]:='5';
       sGrid.Cells[2,5]:='3';
       sGrid.Cells[2,4]:='4';
       sGrid.Cells[3,3]:='5';
       sGrid.Cells[4,5]:='3';
       sGrid.Cells[5,4]:='4';

       for i := 0 to SGrid.Colcount-1 do
          Begin
            if i=0 then sGrid.ColWidths[i]:=91 Else sGrid.ColWidths[i]:=40
          End;

       for I := 0 to sgrid.Rowcount - 1 do
         Begin
           sGrid.RowHeights[i]:=20;
         End;
end;

end.
GhossT вне форума Ответить с цитированием
Старый 10.11.2012, 22:58   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я бы сперва попробовал перерисовку грида в конце последней процедуры - обработчика кнопки сделать (sGrid.Repaint). Если бы не помогло, я бы выдернул перерисовку из обработчика как такового, и создал свою функцию ( на основе выдернутого) и в обработчике просто поставил вызов этой функции, а в конец создающей просто двойной цикл вызывающий эту мою перерисовку, этакий ручной аналог Repaint. Чисто практически, можно вызывать и родной обработчик как процедуру, только надо будет параметры туда передать, примерно так:
Код:
sGridDrawCell(sGrid, i, j, sGrid.CellRect[i, j], []); // i, j счетчики циклов
phomm вне форума Ответить с цитированием
Старый 11.11.2012, 18:25   #3
GhossT
Новичок
Джуниор
 
Регистрация: 10.11.2012
Сообщений: 2
По умолчанию

Спасибо, я уже нашел решение. Надо было добавить в начале DrawCell
sGrid := Sender as TStringGrid;
GhossT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отрисовка легенды Алек JavaScript, Ajax 2 08.12.2011 16:38
отрисовка updown edik Компоненты Delphi 0 27.12.2009 12:39
отрисовка локации Juffin Общие вопросы Delphi 4 21.04.2009 14:26
Отрисовка компонентов Dr.Badnezz Компоненты Delphi 1 04.01.2009 16:50
Отрисовка CheckListBox. NikLik Компоненты Delphi 0 21.09.2008 21:58