Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/141: Рейтинг темы: голосов - 141, средняя оценка - 4.55
14 / 14 / 7
Регистрация: 21.06.2013
Сообщений: 163
Записей в блоге: 1
1

Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля

28.12.2015, 15:05. Показов 26659. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уважаемые эксперты Delphi!
На этом форуме встречается очень удобный код для подгонки ширины колонок DBGrid. К сожалению он работает только для TADODataSet.
Я попробовал его модифицировать. Убрал создание копии датасета. Вроде бы подгонка теперь работает без TADODataSet. Но есть сомнения в правильности того что сделал. Пожалуйста, если есть, выскажите свои замечания и предложения.
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
// Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля
procedure DBGridEx_SetColumnOnDataWidth(gr: TDBGrid);
var
  FieldWidth, i: integer; // Длина текущего значения поля (в пикселах)
  ds: TDataSet; // Датасет отображаемый в гриде (рабочий датасет)
  arMaxLength: array of integer; // Массив в котором хранятся длины колонок (в пикселах)
  fld: TField;
 
const
  defborder = 5; // Промежуток между ячейками грида
begin
  // Установить длину массива = к-ву колонок сетки
  SetLength(arMaxLength, gr.Columns.Count);
 
  // Заполнить массив исходными значениями длин колонок сетки
  // Исходная длина полей = длине наименования колонки
  for i := Low(arMaxLength) to High(arMaxLength) do
  begin
    // Установить фонт канвы = фонту строки заголовка колонки для корректного определения ширины теста
    gr.Canvas.Font := gr.Columns[i].Title.Font;
    arMaxLength[i] := gr.Canvas.TextWidth(gr.Columns[i].Title.Caption) + defborder;
  end;
 
  // Если датасет открыт - определить ширину колонок
  if (gr.DataSource <> nil) and (gr.DataSource.DataSet.Active) then
  begin
    ds := gr.DataSource.DataSet;  //Нужно ли потом делать ds.Free???????????????
    ds.DisableControls; // Блокируем Датасет
    ds.First;
    while not ds.eof do
    begin
      for i := Low(arMaxLength) to High(arMaxLength) do
      begin
        // Установить фонт канвы = фонту колонки для корректного определения ширины теста
        gr.Canvas.Font := gr.Columns[i].Font;
 
        // Определить максимальную длину значения в каждой колонке датасета
        fld := ds.FindField(gr.Columns[i].FieldName);
        FieldWidth := gr.Canvas.TextWidth(Trim(fld.DisplayText)) + defborder;
        if arMaxLength[i] < FieldWidth then
          arMaxLength[i] := FieldWidth;
      end;
      ds.Next;
    end;
    ds.First;
    ds.EnableControls;
  end;
 
  // Установить в гриде длины колонок
  for i := Low(arMaxLength) to High(arMaxLength) do
    gr.Columns[i].Width := arMaxLength[i];
  arMaxLength := nil;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2015, 15:05
Ответы с готовыми решениями:

Как пропорционально изменять ширину колонок DBGrid?
Спасибо, нашел. Удалил.

Подгонка ширины контейнера под длину текста
имеется &lt;h2&gt;...&lt;/h2&gt;. когда задаю фон контейнера заливается вся строка, а нужно чтобы только под...

Подгонка сайта под ширину экрана
Здравствуйте! Столкнулся с такой проблемой: сайт надо подогнать под любые размеры экранов, но...

Подгонка текста под ширину ячейки в dataGridView
Добра, форумчане. Вопрос : Возможно ли узнать не выходит ли строка по длине за пределы ширины...

21
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
28.12.2015, 15:18 2
Для этого есть свойства Width и зачем такой мазохизм я не понимаю
Миниатюры
Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля   Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля  
0
14 / 14 / 7
Регистрация: 21.06.2013
Сообщений: 163
Записей в блоге: 1
28.12.2015, 15:54  [ТС] 3
Цитата Сообщение от xxbesoxx Посмотреть сообщение
зачем такой мазохизм
DBGrid может выводить разные наборы данных с разной шириной колонок и разным их количеством. Поэтому бывает нужно программно настроить ширину колонок по содержимому.
Сторонние компоненты использовать то же нежелательно, по ряду причин.
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
28.12.2015, 16:18 4
Цитата Сообщение от GreyW Посмотреть сообщение
DBGrid может выводить разные наборы данных с разной шириной колонок и разным их количеством.
и что мешает описать по разному ? на пример так
Delphi
1
2
 DBGrid1.Columns[3].Width := 80; //ширина полей
 DBGrid1.Columns[3].Title.Caption := 'Имя столбцов'; //Имя стольбцов
Добавлено через 2 минуты
Цитата Сообщение от GreyW Посмотреть сообщение
Сторонние компоненты использовать то же нежелательно, по ряду причин.
Посмотреть в книгу не желательно ? или время нету ? С: .2013 Г. находитесь на форуме
0
14 / 14 / 7
Регистрация: 21.06.2013
Сообщений: 163
Записей в блоге: 1
28.12.2015, 16:53  [ТС] 5
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Посмотреть в книгу не желательно
Я попросил помощи, а Вы смеётесь. Желаю и Вам такого отношения к себе.
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
28.12.2015, 17:16 6
Цитата Сообщение от GreyW Посмотреть сообщение
Я попросил помощи
Ну копипастить не умейте ?
Цитата Сообщение от GreyW Посмотреть сообщение
Желаю и Вам такого отношения к себе.
НУ, НУ рассказывайте........... еще нечего пожелайте мне ?
0
14 / 14 / 7
Регистрация: 21.06.2013
Сообщений: 163
Записей в блоге: 1
28.12.2015, 22:38  [ТС] 7
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Delphi
1
2
DBGrid1.Columns[3].Width := 80; //ширина полей
*DBGrid1.Columns[3].Title.Caption := 'Имя столбцов'; //Имя стольбцов
Вы ширину 80 задаете во время написание кода, а нужно её задать во время выполнения программы, но сначала вычислить в соответствии с выводимыми данными. Как? Если не с помощью вышеуказанной процедуры.
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Ну копипастить не умейте ?
Не понял? Пакостить не умею?
Цитата Сообщение от xxbesoxx Посмотреть сообщение
НУ, НУ рассказывайте........... еще нечего пожелайте мне ?
Счастливого Нового года!

Подумайте... если не хотите или не знаете как ответить - лучше ничего не пишите.
Если пишите - то пишите по сути вопроса и аргументируйте.
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
28.12.2015, 23:03 8
Цитата Сообщение от GreyW Посмотреть сообщение
Вы ширину 80 задаете во время написание кода, а нужно её задать во время выполнения программы, но сначала вычислить в соответствии с выводимыми данными.
Предположим что из одного Query в БД выполняется запрос и на это БД есть несколько таблицы ... Запрос отправляем из компонент Memo1
Вы же знайте какой у вас таблицы на ваши БД да ? пишите для каждого запроса ширина каждого полей
Цитата Сообщение от GreyW Посмотреть сообщение
Подумайте... если не хотите или не знаете как ответить - лучше ничего не пишите.
От тебя пустой ля-ля и не какой попытка и наработка ...!!! только говнокод от куда то копировали Не охота писать для вас что то и СОМНЕВАЮСЬ что вы его перепасите
Цитата Сообщение от GreyW Посмотреть сообщение
Если пишите - то пишите по сути вопроса и аргументируйте.
Я тебя про "дед мороз" не рассказываю .! Если не дошло до тебя ...! попросите модераторов перенести тему на платный раздел - Фриланс : https://www.cyberforum.ru/order-program/ и там у меня появится желанные писать за тебя ...! Конечно если вы за это заплатите

Добавлено через 4 минуты
Цитата Сообщение от GreyW Посмотреть сообщение
Счастливого Нового года!
Уххх спасибо ... вам тоже
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,251
29.12.2015, 00:12 9
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Для этого есть свойства Width и зачем такой мазохизм я не понимаю
Вообще говоря алгоритм автоматического подбора ширины колонок гридов очень нужная и полезная штука. Учтите,например изменение размеров окна в процессе работы с приложением. Иногда хочется чтобы колонки влезали в грид все! Чтобы не надо было скроллировать грид мышкой по горизонтали. Иногда хочется чтобы текст в любой колонке был полностью показан.
P.S.
Вот только универсальный алгоритм ещё никто не написал.
1
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
29.12.2015, 03:21 10
Цитата Сообщение от northener Посмотреть сообщение
Вот только универсальный алгоритм ещё никто не написал.
northener доброе ночи ...! Чего , чего ? Не кто не писал да ?

1.
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
{$R *.dfm}
procedure MyGridSize(Grid: Tdbgrid);
const
  DEFBORDER = 10;
var
  temp, n: Integer;
  lmax: array [0..30] of Integer;
begin
  with Grid do
  begin
    Canvas.Font := Font;
    for n := 0 to Columns.Count - 1 do
      lmax[n] := Canvas.TextWidth(Fields[n].FieldName) + DEFBORDER;
    grid.DataSource.DataSet.First;
    while not grid.DataSource.DataSet.EOF do
    begin
      for n := 0 to Columns.Count - 1 do
      begin
        temp := Canvas.TextWidth(trim(Columns[n].Field.DisplayText)) + DEFBORDER;
        if temp > lmax[n] then lmax[n] := temp;
      end; {for}
      grid.DataSource.DataSet.Next;
    end;
    grid.DataSource.DataSet.First;
    for n := 0 to Columns.Count - 1 do
      if lmax[n] > 0 then
        Columns[n].Width := lmax[n];
  end;
end;
2. Вызов
Delphi
1
2
3
4
procedure TForm1.FormResize(Sender: TObject);
begin
  MyGridSize(DBGrid1);
end;
Вот так , это вам "новогодние подарки"
Миниатюры
Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля   Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля   Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля  

Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля   Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля   Подгонка ширины колонок DBGrid под максимальную ширину содержимого поля  

4
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
29.12.2015, 03:24 11
Цитата Сообщение от northener Посмотреть сообщение
Вообще говоря алгоритм автоматического подбора ширины колонок гридов очень нужная и полезная штука.
Ну да... задача очень сложное .... и не кто такой не писал Не обижайтесь
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,251
20.02.2016, 00:29 12
Вы, xxbesoxx, только прикоснулись к этой задаче, которая реально перед вами не возникала.
А если суммарная ширина колонок полученная из сумм максимальных ширин текста колонок превысит ширину грида?
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
20.02.2016, 01:01 13
Цитата Сообщение от northener Посмотреть сообщение
Вы, xxbesoxx, только прикоснулись к этой задаче,
Если вам так сильно интересно .! я давно не пользуюсь ваши стандартные DBGrid
Цитата Сообщение от northener Посмотреть сообщение
А если суммарная ширина колонок полученная из сумм максимальных ширин текста колонок превысит ширину грида?
Да, вы проверили и не получилось или в чем проблема ?
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,251
20.02.2016, 02:01 14
xxbesoxx, я не проверял. Ибо проверять нечего.
На кой ... мне проверять некое частное решение.
0
3584 / 2194 / 692
Регистрация: 29.05.2013
Сообщений: 9,368
23.02.2016, 13:38 15
Сама по себе идея верная, но вот беда в том, что нельзя его использовать для всего набора данных. Наборы бывают разных размеров и если его весь просматривать... В общем это все дело надо переносить в отрисовку грида и там работать только с отображаемым набором данных. Ну и конечно надо обрабатывать две ситуации, когда данные надо впихнуть в видимый грид и когда надо минимизировать колонки.
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
23.02.2016, 18:17 16
Цитата Сообщение от Пытливый Посмотреть сообщение
когда данные надо впихнуть в видимый грид и когда надо минимизировать колонки.
Ну что мешает вызвать это процедура кода вы делайте "впихнуть в видимый"
0
3584 / 2194 / 692
Регистрация: 29.05.2013
Сообщений: 9,368
26.02.2016, 01:04 17
Да беда в том, что в событии отрисовки вы не знаете ничего о видимой странице из набора данных которую использует в этот момент грид. Эта информация внутренняя и все что вам доступно, это одна текущая запись из набора.
0
пофигист широкого профиля
4732 / 3167 / 858
Регистрация: 15.07.2013
Сообщений: 18,251
26.02.2016, 01:27 18
Цитата Сообщение от xxbesoxx Посмотреть сообщение
Ну что мешает вызвать это процедура кода вы делайте "впихнуть в видимый"
Ничего, кроме разума. Если вся информация не влезает в "поле видимости", её нужно как-то урезать. Но только пользователь волен решать что и как можно урезать. Но никак не программа.
0
Эксперт Pascal/Delphi
1134 / 615 / 129
Регистрация: 13.02.2009
Сообщений: 3,553
28.02.2016, 02:10 19
Цитата Сообщение от northener Посмотреть сообщение
пользователь волен решать что и как можно урезать. Но никак не программа.
1) Название эти темы DBGrid под максимальную ширину содержимого поля
2) "урезать" причем тут это ?
Я думаю что тема надо било закрыть после #10 и все остальные пост уже лишние и надо удалить .! Это просто моя мнения
0
0 / 0 / 0
Регистрация: 03.07.2014
Сообщений: 23
29.09.2017, 09:16 20
xxbesoxx, идеальный код для моих нужд. very большое спасиб))

честно
не понимаю людей, которые пишут про то что даже не проверили . или пишут помогите и не понимают критики в следствии. агрессия и пр. тьфу.
0
29.09.2017, 09:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2017, 09:16
Помогаю со студенческими работами здесь

DBGrid: настроить ширину колонок в редакторе проекта
Не могу понять как в DBGrid настроить ширину колонок в редакторе проекта? В идеале конечно нужно...

DataGridView - как подогнать ширину таблицы под размер колонок
Имеется таблица с десятком колонок. Ширина колонок автоматически подгоняется по содержимому. После...

Автоматическое изменение ширины колонок в зависимости от ширины StringGrid
Здравствуйте, Уважаемые! Подскажите пожалуйста как написать процедуру, которая бы меняла ширину...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru