С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
3 / 2 / 3
Регистрация: 11.08.2016
Сообщений: 90

Не обновляется колонка в DBGrid

08.08.2018, 18:06. Показов 1601. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, народ.
Подскажите пожалуйста.
Есть у меня dbgrid, вывожу туда из бд таблицу. И надо мне автоматом подгонять ширину столбцов по длине текста.
Вот есть такой код (находится в обработчике нажатия treeview) :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    case 0:
    {
            zapros = "Select *from NB_for_light_tasks";
            ADOQuery1->Active=true;
            //Подсчет длинны
            int max,inp;
            ADOQuery1->First();
            for(int i=0; i<ADOQuery1->RecordCount; i++)
            {
                inp=ADOQuery1->FieldByName("Производитель")->AsString.Length();
                if(inp>max) max=inp;
                ADOQuery1->Next();
            }
            DBGrid1->Columns->Items[1]->Width=max;
            max=0; inp=0;
            break;
    }
Вообщем таким образом ширина колонки не меняется.
Но, заметил такую вещь:
Если после задания ширины колонки, вывести ShowMessage с любым содержимым, то ширина нормально задается, все работает.
Refresh() AdoQuery и DBGrid не помогает.
В чем может быть загвоздка?

Добавлено через 18 минут
Заметил сейчас, что если вместо max подставить просто число, то работает..
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.08.2018, 18:06
Ответы с готовыми решениями:

В БД обновляется вся колонка вместо одной записи
Пишу изменение в БД, потом обновляю саму БД: DataGridView1.Rows(mesh).Cells(0).Value = &quot;Удалить&quot; COMMAND.CommandText...

Не обновляется DBGrid
Почему то не обновляется DBGrid после добавления новых записей из отдельной формы Вот код var t:boolean; begin ...

DBGrid не обновляется
Ребят, чего-то не могу разобраться в чем может быть проблема. На второй форме создан DBGrid, в свойствах которого прописан DataSource (в...

5
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
08.08.2018, 18:30
Лучший ответ Сообщение было отмечено DriFT как решение

Решение

Доброго.
Не увидел где у вас идет сам запрос к БД.
Для того что бы нормально вычислялся max, необходимо задать ему начальное значение.
Не выводите в цикле по лимиту RecordCount. Драйвера по умолчанию принимают по 50 значений, просто очень часто запрос возращается очень быстро значения и если БД локально, то ошибок может и не быть. Но как только Вы начнете использовать удаленную БД, и запрос должен быть вернуть свыше 1000 строк, появятся проблемы.
1
3 / 2 / 3
Регистрация: 11.08.2016
Сообщений: 90
08.08.2018, 18:34  [ТС]
Запрос вынес через дефайн:
C++
1
#define zapros ADOQuery1->SQL->Text
Задал 0, все работает, спасибо огромное. Если не сложно, объясни пожалуйста, почему так.

А что тогда лучше использовать вместо RecordCount?
Спасибо.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
08.08.2018, 18:49
Цитата Сообщение от DriFT Посмотреть сообщение
#define zapros ADOQuery1->SQL->Text
Очень странный маневр, определять запрос через #define . Подозреваю, что это будет влиять на производительность в худшую сторону.


Цитата Сообщение от DriFT Посмотреть сообщение
Задал 0, все работает, спасибо огромное. Если не сложно, объясни пожалуйста, почему так.
Если Вы обявляете переменную типа int, и не задаете ей начальное значение. То программа ей обявит или максимальное значение, или подставит какое либо из памяти (при определеных условиях).

Цитата Сообщение от DriFT Посмотреть сообщение
А что тогда лучше использовать вместо RecordCount?
Просто это значение вычисляемое, в зависемости сколько строк пришло, представте, что Вам надо выбрать миллион строк, а БД находится на удаленом сервер....вот тут и начнутся проблемы.

Самое правильно поступить так
C++
1
2
3
4
5
6
7
        ADOQuery1->First();
        while (!ADOQuery1->Eof)
        {
                   inp=ADOQuery1->FieldByName("Производитель")->AsString.Length();
                    if(inp>max) max=inp;
                  ADOQuery1->Next();
        }

Но можно, к примеру получить сразу конечное значение через команду

C++
1
ADOQuery1->Last();
, тогда RecordCount, будет соответсвовать действительности. но это лишние "телодвижения" для выборки.
1
3 / 2 / 3
Регистрация: 11.08.2016
Сообщений: 90
08.08.2018, 19:46  [ТС]
Спасибо, за обьяснение. Думал что переменной автоматом выдается 0.
А если например таких запросов 30штук, все равно лучше их прописать, чем через define?
Цитата Сообщение от Dinkin Посмотреть сообщение
Очень странный маневр, определять запрос через #define . Подозреваю, что это будет влиять на производительность в худшую сторону.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,142
Записей в блоге: 3
08.08.2018, 20:22
Да, луче каждый разделать запрос или отдельно функцию для этого написать.

Добавлено через 8 минут
Да и потом, пока у вас запрос на выборку, а если вставка или обновление, ....а что если захотите параметры передавать...у Вас будут сложности после.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2018, 20:22
Помогаю со студенческими работами здесь

Не обновляется dbgrid после добавления или удаления записи
procedure TAddDealer.OKBtnClick(Sender: TObject); begin DataModule2.ADOdealers.Append; ...

Не обновляется DBGrid при внесении изменений в Adotable содержащий MasterSourse для таблиы, отображающейся на данной ВИGrid
Здравствуйте. Вопрос следующий: Есть СУБД недоделанная. Организация: TADOConnection --&gt;TADOTable--&gt;TDataSourse&lt;-&gt;DBGrid 2...

2 колонки, где 1 колонка 2 строки, и 2-я колонка 1 строка высотой первой колонки
вот есть такая табличка &lt;table border=&quot;1&quot;&gt; &lt;tr&gt; &lt;td rowspan=&quot;2&quot;&gt;big column&lt;/td&gt; ...

Часто на 8-ке не обновляется (или криво обновляется) индекс вида после
Часто на 8-ке не обновляется (или криво обновляется) индекс вида после рефреша дизайна. Такого в 6-ке не было точно. Сервак 8-ой криво...

Каждые 2 секунды формируется ответ с сервера и div обновляется. Как подвесить к нему событие, если он обновляется?
Посоветуйте, как поступить? Есть небольшой div, в котором выводится список файлов на сервере (ajax'ом каждые 2 секунды). Мне нужно...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru