Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Многострочные ячейки в StringGrid :-))


Автор: Partizan 23.01.04, 16:37
Не знал как писать в несколько строк в StringGrid прочитал на вашем сайте
"Многострочные ячейки в StringGrid " там конечно всего 2 строки пишуться, но главоне идея!
Спасибо за неё, Теперь выкладываю как писал из form6.Memo1 во вторую (с нуля) колонку StringGrid,
N строк :
Да и еще кстати если писать в соседние колонки текст с другим количеством строк то StringGrid моргает
т.к. перерисовыя одни ячейки меняются другие и procedure TForm6.StringGrid1DrawCell вечно срабатывала,
поэтому я печатаю пустые строки.
Все привязано к форме Form6 патамуша в проекте толпища фор и просто запутаться по возникшим вопросам
пишите PartizanDimon@yandex.ru Всегда рад помоч чем смогу ;-)

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure TForm6.Button2Click(Sender: TObject);  // кнопка по которой  всё срабатывает собссно
      var str: string ; i,l :integer;
    begin
      str:=''; i:=0;
      while form6.StringGrid1.Cells[2,i]<>'' do
        begin
          inc(i);
        end;
        if i = form6.StringGrid1.RowCount then form6.StringGrid1.RowCount:=form6.StringGrid1.RowCount+1;
    Gl:=i;           //Gl  глобальная переменная                        
    form6.StringGrid1.Cells[0,i]:=RivetToBottomStr(IntToStr(i),'|',form6.Memo1.Lines.Count);
    form6.StringGrid1.Cells[1,i]:= RivetToBottomStr(DateToStr(form6.DateTimePicker1.Date) ,'|',form6.Memo1.Lines.Count);
      l:=0;
      while Memo1.Lines.Count > l do
        begin
          str:= str + Memo1.Lines.Strings[l]+'|' ; inc(l);
        end;
    form6.StringGrid1.Cells[2,i]:=str;
    form6.StringGrid1.Cells[3,i]:= RivetToBottomStr(form6.Edit1.Text,'|',form6.Memo1.Lines.Count);
    form6.Caption :=str + IntToStr(form6.Memo1.Lines.Count);
    end;
     
     
    procedure TForm6.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    var
       MainLine:string;
       Line1: string;
       Line2: string;
       hGrid: TStringGrid;
       i,q:integer;
    begin
     
      hGrid:= (Sender as TStringGrid);
      MainLine:=hGrid.Cells[ACol, ARow];
      hGrid.Canvas.FillRect(Rect);
     
        q:=GetQuantityChar(MainLine, '|');
        if (q<>0) and (ARow=Gl)
          then begin hGrid.RowHeights[Gl] := 15*q ; end;   // 15 - высота строчки запросто можно сделать переменной
        if q=1 then   begin hGrid.Canvas.TextOut(Rect.Left, Rect.Top,  CutButtomStr(MainLine,1));  exit; end;
      for i :=1 to q-1 do
      begin
     
        begin
          Line1 :=GetICellFromRowStr(MainLine,i-1);
          Line2 :=GetICellFromRowStr(MainLine,i);
        end;
     
        hGrid.Canvas.TextOut(Rect.Left, Rect.Top+{StrHigth}15*(i-1)  , Line1);
        hGrid.Canvas.TextOut(Rect.Left, Rect.Top+{StrHigth}15*i , Line2);
     
       end;
    end;


Также использовал самодописанные функции :

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function GetICellFromRowStr(str:string; i:integer ):string ; // Возвращает значение i-й ячейки строки с разделителем '|'
    //Ячейка - в смысле подстрока между двумя разделителями "|"
    var k,j,q,w,stickcount: integer; strr:string[255]; ch:char;
    begin
      stickcount:=0;  k :=0; strr:= '';
      if length(str)=0 then begin  result:='000'; exit; end;
      if GetQuantityChar(str ,'|') = 1 then begin  result:='111'; exit; end;
     
      while stickcount <> i do
        begin
          inc(k);
          if str[k]= '|' then inc(stickcount);
        end;
         q:=k+1;
         inc(k);
       while str[k] <> '|' do
       begin inc(k); end;
          w:=k-1;
        for k := q to w do
        begin
          strr:=strr+str[k];
        end ;
        result:=Strr;
    end;
     
    function  RivetToBottomStr(str:string; ch:char; i:byte):string;// Добавляет i разделителей , задаваемых ch
    var k : byte;
    begin
      for k :=1 to i do
        str:=str + ch ;
        result := str;
    end;

Админами модераторам : Сразу извеняюсь что запостил такой большой кусок кода ,
просто не знал куда его прислать,чтобы его выложили где положено :-/ при наличии
свободного времени просьба объяснить мне как в дальнейшем делать ;-) чтобы всем было хорошо
надеюсь на сотрудничество ;-)(мыло в начале поста)
Молодцы! очень полезный сайт!

M
Используй форматирование кода! Невозможно ж ничего понять

Автор: basil_cat 07.09.19, 13:44
Сначала поясни где код: GetQuantityChar()

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