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, насколько я понял, платная компонента... или можно найти бесплатную? |
|
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();
}
появляется сообщение?
|
|
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())
...;
Но это не или. Это два независимых кода. |
|
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
Насколько я знаю OnCreate вызывается сразу же по окончании действий прописанных в конструкторе....
или перед ?
Отредактировано nawok78 — 29.01.2007, 16:52 |
|
AVC |
Отправлено: 29.01.2007, 17:54 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (nawok78 @ 29.01.2007, 15:50) | "Раз руки не дошли" значит там NULL |
Не обязательно. Там может быть все что угодно.
Допустим в обработчике события OnDataChange код работает с каким либо динамическим объектом А, который создается в конструкторе класса формы. Но так как открытие набора данных происходит до того как как выполнится конструктор формы то возможна ситуация когда обработчик уже назначен а объекта А еще нет.
События формы
Создание и открытие:
- Конструктор класса
- FormCreate
- FormShow
- FormCanResize
- FormConstrainedResize
- FormResize
- FormActivate
- FormPaint
Если установлен "старый стиль" создания то то первые два события меняются местами. |
|