Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Как запустить событие "OnDrawCell" в StringGrid


Автор: Mersik 16.1.2007, 19:03
Полний нол просит помоши ! надо закрасит определенную ячеику в Stringgrid ! Почитал вроде собитием OnDrawCell ! но как его запустит собитиэ то ето smile  smile   smile  smile 

Автор: former 16.1.2007, 19:06
Пользуйся поиском. Вот например: http://www.terasoft.ru/ru/pages/texteditor.phtml

Добавлено @ 19:06 
Читай DRKB.

Автор: CatATonik 16.1.2007, 19:09
Оно само запустится, когда грид рисоваться будет. Рисоваться он тоже будет сам, т.ч. ничего делать не надо. Только обработчик OnDrawCell написать и все.

Автор: Mersik 16.1.2007, 19:09
А что ето за программа ? Мне если 4то в Делфи надо smile

Добавлено @ 19:20 
да я пишу туда

Код

rocedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   StringGrid1.rowcount :=255;
   StringGrid1.ColCount:=10;

 if  (Acol=2) and (Arow=2) then
  begin
    StringGrid1.Canvas.Brush.Color:=CLred;
    StringGrid1.Canvas.Font.Color:=ClGreen;
  end;

end;



и нол реакции ! 

Автор: Sunvas 16.1.2007, 20:10
Код

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
stringgrid1.Canvas.Brush.Color:=clred;
if (acol=3)and(arow=3) then stringgrid1.Canvas.Rectangle(rect);
stringgrid1.Canvas.Brush.Color:=clwhite;
end;

Автор: Mersik 16.1.2007, 20:11
Правелний ответ ! Замучался

Код

procedure TForm2.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   Form2.StringGrid1.rowcount :=255; // задаем размер ряд 
   Form2.StringGrid1.ColCount:=10;    // колона

 if  (Acol=1) and (Arow<>0) then  // для всей первой колонки исключая первий столбец 
  begin
    StringGrid1.Canvas.Brush.Color:=$FFCCFF;   // Краска ячеики
    StringGrid1.Canvas.Font.Color:=ClBlack;        // краска шрифта
    end;

    StringGrid1.Canvas.FillRect(rect);                                                                                //ЗАКРАСИТ
    StringGrid1.Canvas.TextOut(rect.Left+1,rect.Top+1,StringGrid1.Cells[Acol,Arow]);    // перепишет поверх свезей краски техт !

енд;

Автор: VaiMR 16.1.2007, 23:49
Вот еще наработки по данной теме:

Код

const mcol :array[0..3] of tcolor=($FAA6EA, // 0 цвет по-умолчанию
                                   $FADD8A, // 1 выделенная ячейка
                                   $AAFFAA, // 2 правильно заполненная ячейка
                                   $AFAAFF);// 3 неправильно заполненная ячейка
const mfont:array[0..3] of tcolor=($000000, // 0 цвет шрифта по-умолчанию
                                   $000000, // 1 выделенная ячейка
                                   $000000, // 2 правильно заполненная ячейка
                                   $000000);// 3 неправильно заполненная ячейка 
 type
  tstrcolor = class(TObject)
               public
                bkcolor  :TColor;
                fontcolor:tcolor;
              end; 
...

//-------------- создание класса с цветами ячеек таблицы -----------------------
//-------------- и очистка полей таблицы ---------------------------------------------
procedure strgridcolor(protocol: TStringGrid);
var i,j:integer;
begin
 with protocol do
  for i:=1 to ColCount-1 do
   for j:=1 to RowCount-1 do
    begin
     if (Objects[i,j])=nil
      then
       Objects[i,j]:=tstrcolor.Create;
     cells[j,i]:='';
     (Objects[i,j] as TStrColor).bkcolor:=mcol[0];
     (Objects[i,j] as TStrColor).fontcolor:=mfont[0];
    end;
end;
//------------------------------------------------------------------------------

//-------------- меняем цвет ячейки на нужный ----------------------------------
procedure setcolorcell(protocol:tstringgrid;ACol,ARow:Integer;flagcol:byte);
var rect:trect;
begin
 rect:=protocol.CellRect(acol,arow);
 with protocol.Canvas do
  begin
   case flagcol of
    0:   begin
          Brush.color:=(protocol.Objects[acol,arow] as TStrColor).bkcolor;
          Font.Color :=(protocol.Objects[acol,arow] as TStrColor).fontcolor;
         end;
    1:   begin
          Brush.color:=mcol[flagcol];
          Font.Color :=mfont[flagcol];
         end;
    2,3: begin
          Brush.color:=mcol[flagcol];
          Font.Color :=mfont[flagcol];
          (protocol.Objects[acol,arow] as TStrColor).bkcolor:=mcol[flagcol];
          (protocol.Objects[acol,arow] as TStrColor).fontcolor:=mfont[flagcol];
         end;
   end;
   FillRect(Rect);
   TextOut(Rect.Left+2,Rect.Top+2,protocol.Cells[ACol,ARow]);
  end;
end;
//------------------------------------------------------------------------------

//-------------- при перемещении по протоколу ----------------------------------
procedure Tworkwin.protocolDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 if (acol>0)and(arow>0)
  then
   begin
    setcolorcell(protocol,acol,arow,0);
    if arow<2
     then
      begin
       arow:=2;
       protocol.row:=2;
      end;
    if (gdFocused in State)or(gdselected in State)
     then
      setcolorcell(protocol,acol,arow,1)
   end;
end;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
var protocol: TStringGrid;

и при инициализации формы:
   strgridcolor(protocol); // создадуться обьекты для каждой ячейки, хранящие цвета

Автор: physic 21.6.2007, 22:18
в рантайм можно вызвать событие ondrawcell вот так: StringGrid1.Repaint;

Автор: Ant_ON 24.6.2007, 13:57
Mersik, VaiMR спасибо за примеры... Давно хотел разобраться с этим вопросом. 
Единственный "минус" - у меня не хватает постов, чтобы поставить "плюсы".  smile 

Автор: Alexeis 24.6.2007, 15:22
Цитата(Ant_ON @  24.6.2007,  13:57 Найти цитируемый пост)
Единственный "минус" - у меня не хватает постов, чтобы поставить "плюсы". 
 Поставил.

Автор: Ant_ON 25.6.2007, 15:34
Цитата(Alexeis @  24.6.2007,  15:22 Найти цитируемый пост)
Поставил. 
 
Спасибо за помощь smile

Автор: FireSnake 9.2.2009, 22:44
Прочитал эту тему так мне необходимо получить схожий результат. Необходимо реализовать что-то вроде такой процедуры Select(row), которая должна  выполнаять следующие - в таблице stringgrid выделялать всю строку с номером row. Изменил вышеописанную процедуру, но оно вообще перестало работать. 


Код

procedure TForm1.StrGr1DrawCell(Sender: TObject; ACol, ARow,{!!!}row{!!!}: Integer;
  Rect: TRect; State: TGridDrawState);
begin
   StrGr1.rowcount :=256; // çàäàåì ðàçìåð ðÿä
   StrGr1.ColCount:=10;    // êîëîíà

 if  (Arow=row) then  // äëÿ âñåé ïåðâîé êîëîíêè èñêëþ÷àÿ ïåðâèé ñòîëáåö
  begin
    StrGr1.Canvas.Brush.Color:=$FFCCFF;   // Êðàñêà ÿ÷åèêè
    StrGr1.Canvas.Font.Color:=ClBlack;        // êðàñêà øðèôòà
    end;

    StrGr1.Canvas.FillRect(rect);                                                                                //ÇÀÊÐÀÑÈÒ
    StrGr1.Canvas.TextOut(rect.Left+1,rect.Top+1,StrGr1.Cells[Acol,Arow]);    // ïåðåïèøåò ïîâåðõ ñâåçåé êðàñêè òåõò !


end;


Как правильно необходимо это реализовать? 

Автор: FireSnake 9.2.2009, 23:59
Сам разобрался. Сделал глобальную переменную а не через передачу в процедуру.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)