Форум программистов, компьютерный форум, киберфорум
Arigato
Войти
Регистрация
Восстановить пароль
Рейтинг: 4.50. Голосов: 2.

Объединение ячеек в шапке таблицы TStringGrid

Запись от Arigato размещена 21.06.2016 в 09:33

Столкнулся с необходимостью объединить ячейки в заголовке таблицы TStringGrid. Загуглив понял, что штатными средствами объединять нельзя. В итоге было найдено самое простое решение проблемы в лоб. Идея заключается в том, что мы будем вместо одного StringGrid использовать два: один для шапки, другой для самой таблицы. Вот что у нас должно получиться:

Нажмите на изображение для увеличения
Название: StringGrid.png
Просмотров: 3679
Размер:	10.4 Кб
ID:	3903

Краткая инструкция:

1. Размещаем на форме StringGrid1 для шапки и настраиваем его свойства:
ColCount - количество ячеек в шапке (в нашем примере 4);
RowCount - количество строк, ставим 2;
FixedRows - количество заголовочных строк, ставим 1;
FixedCols - количество заголовочных столбцов, ставим 0;
ScrollBars - отключаем полосы прокрутки, ставим ssNone;
Enabled - ставим False;
Ctrl3D - я поставлю False, чтобы получить простую таблицу, без псевдо-3D;
Height - высота таблицы, подбираем так, чтобы была видна только одна строка шапки, вторая строка должна оказаться невидимой.

2. Размещаем на форме StringGrid2 для основной таблицы и настраиваем свойства:
ColCount - количество столбцов (в примере 8);
RowCount - количество строк в таблице, не считая заголовочную (допустим, 10);
FixedRows - ставим 1;
FixedCols - ставим 0;
Ctrl3D - тоже самое, что и для заголовочной таблицы (в нашем случае False).

3. Выставляем ширину столбцов, обе таблицы размещаем на форме так, чтобы шапка оказалась над основной таблицей, подгоняем все размеры.

4. Для StringGrid2 с основной таблицей меняем свойства:
FixedRows - ставим 0;
FixedCols - количество заголовочных столбцов (поставим 1, но можно и 0).
Дело в том, что только при наличии заголовочной строки в редакторе формы мышкой можно настраивать ширину отдельных столбцов, поэтому мы сначала добавили такую строку, настроили размеры колонок, а теперь убираем ее.

5. Заполняем шапку данными, для этого на обработчик события OnShow формы вписываем следующий код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.FormShow(Sender: TObject);
var
  i: Integer;
begin
  with StringGrid1 do begin
    Cells[0,0] := ' №';
    Cells[1,0] := ' Ф.И.О.';
    Cells[2,0] := ' Баллы';
    Cells[3,0] := ' Итого';
  end;
  for i := 0 to StringGrid2.RowCount do
    StringGrid2.Cells[0,i] := ' ' + IntToStr(i+1);
end;
Во вложении готовый проект-пример:
Вложения
Тип файла: zip StringGrid.zip (2.5 Кб, 460 просмотров)
Размещено в Delphi
Показов 17070 Комментарии 11
Всего комментариев 11
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Дело в том что при смене "стиля" зазоры и линии между гридами изменятся и отображение может быть корявым.
    Так что советую это проверить.
    Запись от Avazart размещена 21.06.2016 в 14:01 Avazart вне форума
  2. Старый комментарий
    Аватар для SatanaXIII
    Ну это не интересно. Был бы хотя бы функционал сортировки/выделения столбцов, кратного изменения ширины столбцов. Хоть что-нибудь.
    Запись от SatanaXIII размещена 21.06.2016 в 14:42 SatanaXIII вне форума
  3. Старый комментарий
    Аватар для Arigato
    Это только идея, все можно дописать, таблицы можно связать и так далее. Но если надо быстро сделать таблицу с объединениями, то это самый простой и надежный способ.
    На счет стилей, то не должно бы ничего поплыть, высота и ширина задана в пикселях, рамочка между ячейками у таблицы в один пиксель.
    Запись от Arigato размещена 21.06.2016 в 22:59 Arigato вне форума
  4. Старый комментарий
    Аватар для Avazart
    Это 1 пиксель в вашей системе, как это будет выглядеть Win7 не очевидно.
    Плюс стоит проверить VCL-стили.

    И еще стоит приделать изменяемость размеров ширины колонок.
    Запись от Avazart размещена 22.06.2016 в 17:09 Avazart вне форума
  5. Старый комментарий
    Аватар для Arigato
    У меня и есть Win7
    Про ширину в предыдущем комментарии написал. Тут только идея. Связать таблицы не проблема, чтобы изменения ширины колонок в шапке меняли ширину и в основной таблице.
    Запись от Arigato размещена 22.06.2016 в 23:03 Arigato вне форума
  6. Старый комментарий
    Аватар для Avazart
    А это же Delphi7 я то думаю чего интерфейс убогий...
    Ну что ли манифест прикрутите.
    Запись от Avazart размещена 23.06.2016 в 15:55 Avazart вне форума
  7. Старый комментарий
    Аватар для Arigato
    Это у меня такой стиль в системе выставлен. Но на таблицу оно никак не влияет: https://yadi.sk/i/UZeeApB_skV7G
    Запись от Arigato размещена 24.06.2016 в 01:12 Arigato вне форума
  8. Старый комментарий
    Аватар для Avazart

    Не по теме:

    Цитата:
    Это у меня такой стиль в системе выставлен.
    Еще лучше )))



    Вы видели как в современной системе в современной IDE выглядит таблица? - заголовки рисуются градиентной заливкой.
    Запись от Avazart размещена 25.06.2016 в 13:09 Avazart вне форума
    Обновил(-а) Avazart 25.06.2016 в 13:12
  9. Старый комментарий
    Аватар для Arigato
    Ну будет там градиент, что это меняет?
    Запись от Arigato размещена 25.06.2016 в 19:09 Arigato вне форума
  10. Старый комментарий
    Аватар для DenNik
    а почему бы не объединить ячейки визуально путем перекрытия метода отрисовки.
    вот набросал код с созданием наследника таблицы в пределах проекта.
    происходит визуальное объединение ячеек с возможностью изменения ширины столбца, входящего в диапазон.
    единственный небольшой глюк вылазит, когда стиль таблицы равен gdsClassic.
    Кликните здесь для просмотра всего текста
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    
    unit Unit2;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls, Vcl.ExtCtrls;
     
    type
      // наследник таблицы
      TStringGrid = class(Vcl.Grids.TStringGrid)
      protected
        procedure DrawCell(ACol: Integer; ARow: Integer; ARect: TRect;
          AState: TGridDrawState); override;
      end;
     
      TForm2 = class(TForm)
        StringGrid1: TStringGrid;
        procedure FormCreate(Sender: TObject);
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm2.FormCreate(Sender: TObject);
    var
      i: byte;
    begin
      with StringGrid1 do
      begin
        Cells[0,0]:= '№ п/п';
        Cells[1,0]:= 'Ф.И.О.';
        Cells[7,0]:= 'Итого';
      end;
    end;
     
    { TStringGrid }
     
    procedure TStringGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
      AState: TGridDrawState);
    var
      NewRect: TRect;
      RLeft: integer;
      Text: string;
    begin
      if (gdFixed in AState) and (ACol = 6) then
      begin
        Text:= 'Баллы';
        // вычисляем объединенный Rect
        RLeft:= CellRect(2,0).Left;
        NewRect:= Bounds(RLeft,ARect.Top,CellRect(6,0).Right-RLeft,ARect.Height);
        // Рисуем стилем, установленным в винде в случае если стиль таблицы не равен gdsClassic
        DrawCellBackground(NewRect,FixedColor,AState,ACol,ARow);
        // здесь не знаю как иначе заставить текст рисоваться с отступом слева
        NewRect.Left:= NewRect.Left + 5;
        Canvas.TextRect(NewRect,Text,[tfLeft,tfSingleLine,tfVerticalCenter]);
      end else inherited;
    end;
     
    end.
    Запись от DenNik размещена 24.11.2016 в 12:24 DenNik вне форума
  11. Старый комментарий
    Аватар для Сергей 190
    Перетащил на StringGrid кнопку Button. Нормальная "ячейка" получилась.
    Запись от Сергей 190 размещена 24.11.2016 в 12:56 Сергей 190 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru