![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ненавистный DBGrid, ширина колонки
Prohodil Mimo © (2008-02-06 16:47:00)Решил сделать форму с DBGrid-ом растягиваемой, следовательно надо и колонки разрешать растягивать.
Вот и натолкнулся ещё на одну проблему:
Если изменить размер колонки (хоть мышкой, хоть DBGrid1.Columns[0].Width := 100;), а потом
сделать
DBGrid1.DataSource.DataSet.Close;
DBGrid1.DataSource.DataSet.Open;
ширина колонки увеличивается примерно на 20 пикселей, причём не только у той, которой меняли ширину, а у всех в гриде.
В DataSet-е грида поля добавлены, если не добавлять, ширина сбрасывается на изначальную.
Возможно ли с этим бороться или грид просто не способен адекватно себя вести?
как пример для испытаний, можно взять всё тот же
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1199805755&n=1
[24], только надо добавить поля в Query.
Германн (2008-05-24 00:58:00) [1]
> sniknik © (07.02.08 00:33) [15]
Вот что самое смешное. В своих программах на BDE+Paradox я как раз всегдаделал статические TxxxField компоненты через соответствующий редактор. А вот в первой же программе на ADO+FB почему-то "пошёл другим путём".
Германн (2008-05-24 00:54:00) [2]
> sniknik © (23.05.08 02:05) [25]
> Johnmen © (23.05.08 09:28) [26]
Не очень понял, точнее совсем не понял. Но запомню на будущее, что проблемы с русскими названиями возможны не только с реальнымиименами полей в таблице.
Prohodil Mimo (2008-05-23 19:37:00) [3]Stas © (23.05.08 11:42) [30]
это решено было ещё в [3]
а сторонним я не пользуюсь, за исключением FIBPlus и FastReport (да и то не везде). Всё остальное своё.
MsGuns (2008-05-23 13:01:00) [4]т.е. сделал компонент ? и теперь носишь его за собой, как черт торбу ?
Reindeer Moss Eater (2008-05-23 12:47:00) [5]у меня экономится не меньше, а даже больше.
русские названия колонок либо через дизайнтайм филды датасета, либо через колонки грида (если датасета на абстрактной форме нет)
а сохранение индеска и ширины колонок - опция самого грида (так же как и сама опция "сохранять". Это тоже опция грида )
Когда-то было как у тебя через библиотечные модули с именами xxx_common.pas, но потом надоело и перенес этот функционал в сам грид и многое другое тоже.
MsGuns (2008-05-23 12:41:00) [6]Есть такой побочный эффект, поэтому в эксплоререх я и не сохраняю ничего. Обезьянничаю с того же мелкософта (QA).
А вот в клиентских приложениях, где массы сеток, предназначенных, как правило, для отображения одних и тех же датасетов, применяю вовсю. В дизайне лишь присваиваю филдам кэпшины (DisplayLabel) и выставляю форматы для дат и чисел, с размерами колонок вообще не вожусь. Ты знаешь, экономится масса времени ;)
Reindeer Moss Eater (2008-05-23 12:02:00) [7]Это если у меня заранее известен датасет. А если нет ?
То есть библиотечная процедура сохраняющая ширины колонок принимает параметром грид (датасет которого может на момент сохранения быть любым ) а после когда процедуру вызывают для восстановления ширины колонок датасет грида тоже может быть другим и не обязательно таким же как при предыдущем сохранении.
MsGuns (2008-05-23 11:57:00) [8]>Reindeer Moss Eater © (23.05.08 11:43) [31]
>А чем второй и последующие запуски отличаются от запуска сразу после установки если ничего не запоминаем?
Если "ничего не запоминаем", то ничем, кроме одного - вместо десятиэкранной (по горизонтали) сетки, в которой за раз оботражается одно-два поля с океанами пустого места, получаем компактный вид с кре-гле обрезанной информацией - зато видим хотя бы список всех или почти всех колонок за раз.
Про "запоминание" в том посте тоже есть
MsGuns (2008-05-23 11:54:00) [9]>Reindeer Moss Eater © (23.05.08 11:41) [29]
>Первичная настройка и дизайне неплохо делается.
Это если у меня заранее известен датасет. А если нет ? Например, при разработке какого-нибудь эксплорера БД. Заранее ничего неизвестно
Reindeer Moss Eater (2008-05-23 11:43:00) [10]Речь шла о ПЕРВИЧНОЙ настроке, когда приложение только установлено (переустановлено)
А чем второй и последующие запуски отличаются от запуска сразу после установки если ничего не запоминаем?
Stas (2008-05-23 11:42:00) [11]>Prohodil Mimo © (06.02.08 16:47)
В DBGRIDEh это решено.
Reindeer Moss Eater (2008-05-23 11:41:00) [12]Первичная настройка и дизайне неплохо делается.
MsGuns (2008-05-23 11:40:00) [13]>Не надо ничего вычислять. Надо просто запоминать ширину выставленную >пользователем. А заодно и индекс.
Речь шла о ПЕРВИЧНОЙ настроке, когда приложение только установлено (переустановлено)
Reindeer Moss Eater (2008-05-23 09:47:00) [14]Мне больше нравится способ настроек колонок грида, вынесенный в некую библиотечную процедуру, вычисляющую ширину колонок таким образом:
Не надо ничего вычислять. Надо просто запоминать ширину выставленную пользователем. А заодно и индекс.
Johnmen (2008-05-23 09:28:00) [15]
> Германн © (23.05.08 01:26) [24]
Тут, если говорить образно, некошерность того же плана, что и именование классов. Ну там ТМойСуперКласс. Да, по-русски нельзя. Но это сегодня, и идеологически ничему не противоречит, вроде бы...
Я всего лишь провожу четкую грань между клиентской программой, где можно извращаться, как хочешь, и сервером, "придерживающимся" языка оригинала.
Вышесказанное - ИМХО. Никому не навязываю. Но если вдруг что - я предупреждал...
А проблемы будут, напр., при работе с IB/FB. Т.е. проблема одна - работать не будет вовсе :))
> Кристина (22.05.08 21:17) [22]
Некрофилия здесь не приветствуется. Если есть вопросы - новая ветка.
sniknik (2008-05-23 02:05:00) [16]> Чем это не кошерно? И какие проблемы "м.б."?
прочитай [17].
Германн (2008-05-23 01:26:00) [17]
> Johnmen © (07.02.08 09:24) [18]
>
>
> > Германн © (07.02.08 01:00) [16]
> > А я как раз давеча впервые в жизни написал программульку,
>
> > где русские названия колонкам даются в самом запросе через
> > "AS". Это что, некошерно? Или какие-то проблемы могут
> возникнуть?
>
> Абсолютно некошерно. Фу...:)
> И проблемы м.б.
>
Раз уж кто-то поднял сей вопрос, то...
Жень! Чем это не кошерно? И какие проблемы "м.б."?
MsGuns (2008-05-23 00:15:00) [18]Это плохой способ, ибо он абсолютно не учитывает специфику данных в полях. Сам компонент при автоматической разметке колонок (сразу после открытия связанного датасета) следует такому нехитрому алгоритму.
1) Определяется ширина текста заголовка колонки (назовем ее wt) - по умолчанию текст заголовка = названию поля датасета (TField.FieldName)
2) Определяется ширина текста данных колонки, вычисляемая из св-ва TField.Size, которое , в свою очередь, автоматически вычисляется датасетом сразу после открытия. (wf)
3) Ширина колонки = Max(wt,wf)
Это при условии отсутствия "ручных" настроек коллекций TFields и TColumns в дизайне или каким -либо другим образом в ран-тайме до открытия НД. При этом надо помнить, что для полей-стрингов, получаемых с алиасом либо вычисляемых, ширина определяется многими серверами с весьма солидным "запасом". Поэтому неизбежен эффект колонок во весь грид или около того.
Мне больше нравится способ настроек колонок грида, вынесенный в некую библиотечную процедуру, вычисляющую ширину колонок таким образом:
Для нестринговых полей ширина колонок остается неизменной, а для стрингов урезается до 200 (или сколько указано вх.параметром) пикселей.
Пользователю всегда проще расширить нужные колонки для требуемой вместимости, чем сужать их, манипулируя в основном гор.скроллом. А если еще и не поленится позаботиться о сохранении-восстановлении текущих параметров (TColumns.SaveToFile/LoadFromFile) после открытия и перед закрытием НД, то получим довольную мордочку милашки-оператора ;)
Кристина (2008-05-22 21:17:00) [19]Ребят, а я делала вот так: - высчитывала ширину колонок в процентном соотношении от ширини грида. Колонки разной ширины
procedure TfrmMain.FormResize(Sender: TObject);
begin
DBGrid1.Columns[0].Width:=round(0.05*DBGrid1.width);
DBGrid1.Columns[1].Width:=round(0.15*DBGrid1.width);
DBGrid1.Columns[2].Width:=round(0.2*DBGrid1.width);
DBGrid1.Columns[3].Width:=round(0.25*DBGrid1.width);
DBGrid1.Columns[4].Width:=round(0.1*DBGrid1.width);
DBGrid1.Columns[5].Width:=round(0.1*DBGrid1.width);
DBGrid1.Columns[6].Width:=round(0.1*DBGrid1.width);
end;
Prohodil Mimo (2008-02-07 13:55:00) [20]sniknik © (07.02.08 12:49) [20]
> вернее не глюками, а просто не пониманием правильной в
> общем то работы
сейчас не могу вспомнить, что именно было причиной, но помню, что потратил несколько часов, пока не вспомнил, что я колонки в грид добавил. Возможно что то не получалось из-за того, что я изменил или переименовал поля в датасете, а в гриде колонки не изменил. Но точно не помню, более 10 лет прошло.
> а отключение контролов при изменении данных, не
> используешь тоже потому, что когдато "столкнулся с
> какими-то глюками"?
вот не знал, что так надо, спасибо, что хоть кто то подсказал. Лучше поздно, чем никогда. В книжках, на которых учился, такого ни где не было.