C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ширина полей DBGrid
AleksP
Отправлено: 24.01.2007, 19:18


Дежурный стрелочник

Группа: Участник
Сообщений: 34



Есть таблица, созданная в Access, которая выводится в DBGrid через ADOTable. Требуется в обработчике событий OnCreate вычислить и установить значение ширины для каждого столбца DBGrid, чтобы в него полностью помещалось содержимое каждой ячейки. Как можно это сделать?

Отредактировано AleksP — 24.01.2007, 19:25
AVC
Отправлено: 25.01.2007, 10:13


Ветеран

Группа: Модератор
Сообщений: 1583



Пробежать по dataset'у и для каждого поля вычислить максимум
xl = grid->Canvas->TextWidth(str);
где str это текстовое представление значение данного поля данной записи
Это действительно очень нужно?
Gedeon
Отправлено: 25.01.2007, 12:56


Ветеран

Группа: Модератор
Сообщений: 1742



В DBGridEh есть такое свойство AutoFitColumnWidth его поставить в тру и делов.
AleksP
Отправлено: 25.01.2007, 15:34


Дежурный стрелочник

Группа: Участник
Сообщений: 34



To AVC: В таблице есть текстовые поля, размер содержимого которых заранее не известен. Изначально выставлен размер 255 символов. Ограничивать размер полей на стадии заполнения таблицы, а потом увеличивать по мере необходимости, не хотелось бы. Соответсвенно, при выводе таблицы в DBGRid у этих полей остается много свободного места.

To Gedeon: DBGridEh, насколько я понял, платная компонента... или можно найти бесплатную? smile.gif
AVC
Отправлено: 25.01.2007, 16:09


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (AleksP @ 25.01.2007, 14:34)
To AVC: В таблице есть текстовые поля, размер содержимого которых заранее не известен. Изначально выставлен размер 255 символов. Ограничивать размер полей на стадии заполнения таблицы, а потом увеличивать по мере необходимости, не хотелось бы. Соответсвенно, при выводе таблицы в DBGRid у этих полей остается много свободного места.

В этом случае я могу вам посоветовать поставить в ширину колонки наиболее приемлемое значение и разрешить пользователю изменять ширину (такая возможность изначально присутствует в гриде). Измененную ширину можно запоминать где то между сеансами и восстанавливать её при следующем сеансе.

А то можно попасть на такую ситуацию когда средняя длина поля — 20 символов а у одной записи она 200 — вот и придестя из-за одной паршивой овци дергать сетку право-лево для просмотра ушедших за границу сетки колонок.

PS.
Ширина колонки сетки ни коим образом не влияет на размер поля в базе.
Tantos
Отправлено: 25.01.2007, 16:22


Станционный диспетчер

Группа: Участник
Сообщений: 108



2 AleksP: Пакет EhLib стал платным начиная с версии 4.0. Последняя бесплатная версия — 3.6с. За подробностями — к olegenty. Он является одним из разработчиков данного пакета.
AleksP
Отправлено: 26.01.2007, 11:44


Дежурный стрелочник

Группа: Участник
Сообщений: 34



QUOTE (AVC @ 25.01.2007, 16:09)
Измененную ширину можно запоминать где то между сеансами и восстанавливать её при следующем сеансе.

Не совсем понятно, как можно это реализовать.

QUOTE (AVC @ 25.01.2007, 16:09)
А то можно попасть на такую ситуацию когда средняя длина поля — 20 символов а у одной записи она 200

Данные более менее однородные, поэтому хотелось бы запрограммировать перебор DataSet.

В чем может быть причина, что на следующий код:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
DBGrid1->DataSource->DataSet->First();
}

появляется сообщение?

user posted image
AVC
Отправлено: 26.01.2007, 12:04


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Не совсем понятно, как можно это реализовать

Например сохранять ширины колонок в ини файле

QUOTE

В чем может быть причина, что на следующий код:

К этому моменты могут быть не все связи правильно настроены и/или не все запросы открыты.

Лично я для разгона обычно цепляюсь OnPaint. примерно так
private: bool FIsFirstPaint;
В конструкторе FIsFirstPaint = false;
в FormPaint
if (!FIsFirstPaint) return;
FIsFirstPaint = false;
...
Проблемы только если окно создается но не показывается, но это настолько редкая ситуация ...
AleksP
Отправлено: 26.01.2007, 13:58


Дежурный стрелочник

Группа: Участник
Сообщений: 34



To AVC: Не могли бы Вы привести пример кода или отправить по почте?
AVC
Отправлено: 26.01.2007, 14:31


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Не могли бы Вы привести пример кода

Кода чего? (для решения чего?)
AleksP
Отправлено: 26.01.2007, 18:14


Дежурный стрелочник

Группа: Участник
Сообщений: 34



QUOTE (AVC @ 26.01.2007, 12:04)
Лично я для разгона обычно цепляюсь OnPaint. примерно так
private: bool FIsFirstPaint;
В конструкторе FIsFirstPaint = false;
в FormPaint
if (!FIsFirstPaint) return;
FIsFirstPaint = false;

Кода этого участка или всего перебора строк DataSource, если не затруднит?

Отредактировано AleksP — 26.01.2007, 18:15
AVC
Отправлено: 26.01.2007, 18:32


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (AleksP @ 26.01.2007, 17:14)
Кода этого участка или всего перебора строк DataSource, если не затруднит?

Код этого участка перед вами практически весь.

Код перебора строк DataSet
for (ds->First(); !ds->Eof; ds->Next())
...;

Но это не или. Это два независимых кода. smile.gif
nawok78
Отправлено: 29.01.2007, 15:44


Станционный диспетчер

Группа: Участник
Сообщений: 115



QUOTE
В чем может быть причина, что на следующий код:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
DBGrid1->DataSource->DataSet->First();
}

появляется сообщение?


поставь на строчку breackpoint мышкой на против строки в сером (defaul) поле . появится красный кружок строка станет красной

при запуске прога остановится на этой строке

А ТЕПЕРЬ СМОТРИ КТО ИЗ НИХ NULL:
DBGrid1,
DBGrid1->DataSource,
DBGrid1->DataSource->DataSet
AVC
Отправлено: 29.01.2007, 16:24


Ветеран

Группа: Модератор
Сообщений: 1583



Более вероятна ситуация когда в обработчике события dataset/datasource/... используется что то, до чего у конструктора еще "руки не дошли".
nawok78
Отправлено: 29.01.2007, 16:50


Станционный диспетчер

Группа: Участник
Сообщений: 115



"Раз руки не дошли" значит там NULL biggrin.gif
Насколько я знаю OnCreate вызывается сразу же по окончании действий прописанных в конструкторе....
или перед cool.gif ?

Отредактировано nawok78 — 29.01.2007, 16:52
AVC
Отправлено: 29.01.2007, 17:54


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (nawok78 @ 29.01.2007, 15:50)
"Раз руки не дошли" значит там NULL  biggrin.gif

Не обязательно. Там может быть все что угодно.

Допустим в обработчике события OnDataChange код работает с каким либо динамическим объектом А, который создается в конструкторе класса формы. Но так как открытие набора данных происходит до того как как выполнится конструктор формы то возможна ситуация когда обработчик уже назначен а объекта А еще нет.

События формы
Создание и открытие:
- Конструктор класса
- FormCreate
- FormShow
- FormCanResize
- FormConstrainedResize
- FormResize
- FormActivate
- FormPaint

Если установлен "старый стиль" создания то то первые два события меняются местами.

Вернуться в Работа с базами данных в C++Builder