Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];

Вниз

Ламерский вопрос про DbGrid   Найти похожие ветки 

 
ray_wagner   (2002-02-12 03:36) [0]

Подскажите, как сделать, чтобы в DbGride не оставалось пустого места после столбцов?


 
Johnmen   (2002-02-12 09:59) [1]

Растянуть столбцы !


 
Desdechado   (2002-02-12 10:23) [2]

... вручную или программно :))


 
Jim   (2002-02-12 10:38) [3]

Попробуй по очереди, один вручную, второй программно :-))


 
Jim   (2002-02-12 10:38) [4]

Можно по очереди, один вручную, второй программно :-))


 
Анонимщик   (2002-02-12 21:17) [5]

Не, по очереди не выйдет, нужно сразу - и вручную, и программно.

Делаешь цикл от первой записи до последней. Для каждого шага этого цикла делаешь еще один цикл - от нулевого поля до Count - 1. Здесь определяешь, какую длину занимают данные (DBGrid->Canvas->TextWidth(Table1->Fields->Fields[такое-то поле]->AsString)). А для каждого поля создаешь переменную, в которой максимальную длину хранишь. Понятно? Дойдешь до конца таблицы, у тебя в этих переменных и будут необходимые длины полей. Потом выставишь по ним ширину столбцов, только еще о заголовках не забудь.


 
Quest   (2002-02-13 09:18) [6]

зачем перегружать программу? ... я например даю пользователям менять размеры столбцов, сохраняя их значения при выходе и восстанавливая при запуске программы. Для пользователя это удобнее, особенно если окно программы может менять размер.


 
kserg@ukr.net   (2002-02-13 10:53) [7]

>Quest уважаемый, поделись как ты это делаешь?


 
Quest   (2002-02-13 12:20) [8]

Сохраняю исключительно в ini файле, для того чтобы легко можно было лекго сохранять и переносить настройки ..
Сохранить:
Uses IniFiles;
...
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
If MessageDLG("Желаете выйти из программы ?"+
"",mtConfirmation,[mbYes,mbNo],0) = mrYes Then Begin

With TiniFile.Create(CHangeFileExt(ExtractFilename(Application.ExeName),".INI")) DO
Try

// сохранение размеров и местоположения главного окошка
WriteInteger("Position", "Left",Left);
WriteInteger("Position", "Top",Top);
WriteInteger("Size", "Width",Width);
WriteInteger("Size", "Height",Height);

// сохранение размеров столцов DBGrid
WriteInteger("DBGrid1", "Width1",DBGrid1.Columns[0].Width );
WriteInteger("DBGrid1", "Width2",DBGrid1.Columns[1].Width );
WriteInteger("DBGrid1", "Width3",DBGrid1.Columns[2].Width );

Finally
Free;
End;
CanClose := True;
End
Else
CanClose := False;
End;


Установить:
procedure TForm1.FormCreate(Sender: TObject);
begin
With TiniFile.Create(CHangeFileExt(ExtractFilename(Application.Exename),".INI")) DO
Try

// установка размеров и местоположения главного окошка
Left := ReadInteger("Position", "Left", 171);
Top := ReadInteger("Position", "Top", 61);
Width := ReadInteger("Size", "Width", 511);
Height := ReadInteger("Size", "Height", 400);

// установка размеров столцов DBGrid
DBGrid1.Columns[0].Width:=ReadInteger("DBGrid1", "Width1",80 );
DBGrid1.Columns[1].Width:=ReadInteger("DBGrid1", "Width2",80 );
DBGrid1.Columns[2].Width:=ReadInteger("DBGrid1", "Width3",80 );

Finally
Free;
End;
End;

... разумеется можно автоматизировать эти процедуры и в цикле перебирать существующие TDBGRID, определяя количество столбцов и их размеры.


 
wicked   (2002-02-13 14:05) [9]

2 kserg@ukr.net
2 Quest ©
а ежели у кого rxlib есть, так там это всё автоматически... компонента tformstorage.... и уже немного меньше работы... :)


 
Quest   (2002-02-13 14:26) [10]

>wicked ©
НО есть и такие, кто не пользуется сторонними компонентами, а принципиально и из соображения длительного сопровождения программы (с переходами на более продвинутые версии Delphi) использует стандартные и самописные ...


 
Анонимщик   (2002-02-13 14:29) [11]

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


 
wicked   (2002-02-13 14:44) [12]

2 Quest ©
дело ваше... можно и самому написать похожую компоненту... смысл моего высказывания заключается в том, что если delphi - компонентно-ориентированная среда, то, по меньшей мере, геморройно пытаться в каждом проекте писать одно и то же сохранение...

насчёт изменения ширины столбцов
можно разрешить юзеру выставить такую ширину, как ему хочется (он за компом главный :), а потом, при изменении размеров окна, пропорционально изменять ширину столбцов... ну и, конечно, сохранять этот расклад между сессиями работы с программой...


 
Quest   (2002-02-13 14:45) [13]

>Анонимщик ©
относительно твоего алгоритма, это тоже не рационально, выходит при любых пересчётах, изменений данных необходимо пробегать по всей базе, и плюс к этому будут ограничения на используемые шрифты и размер формы (ведь если ширина главного окошка будет больше суммарной ширины столбцов + разделителей + ширина рамки, то справа от крайней левой колонки будет неиспользованное место, и в противном случае не будут видны все поля, так как не будет возможности их сократить)


 
Belov   (2002-02-13 15:22) [14]

>2Quest
На самом деле можно сделать все более красивее и проще
по-поводу сохранения настроек
DBGrid1.Columns.SaveToFile(....)
установка
DBGrid1.Columns.LoadFromFile(...)


 
Quest   (2002-02-13 15:50) [15]

>Belov ©
возможно, я не спорю, но для меня мой путь удобнее, по крайней мере тем, что я помимо размеров столбцов TDBGrid-ов ещё сохраняю различные настройки и переменные программы и при чтении, могу перед их установкой делать необходимые проверки и обработки ...
но это к теме уже не относится.


 
Jony   (2002-02-13 16:36) [16]

Используй DBGridEh. У неё есть свойство AutiFitColWidths. Установить его в True и все проблемы решены.


 
Анонимщик   (2002-02-13 21:19) [17]

А я, Quest, пример привел, да и только. А вот скажешь, может, как узнать, какие строки в гриде видны в данное время и каким записям они соответствуют?


 
Quest   (2002-02-14 08:20) [18]

>Анонимщик ©
не скажу, но чтобы бегать только по видимой части DBGrid можно воспользоваться чем-то типа этого:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
With (Sender as TDBGrid).Canvas Do
if TextWidth > column.Width then
if TextWidth > column.title.<размер заголовка столбца> then
column.Width := TextWidth;
End;



 
Quest   (2002-02-14 08:44) [19]

TextWidth -> TextWidth(Column.Field.text)


 
Анонимщик   (2002-02-14 10:43) [20]

Quest >>>
Не, так не пойдет, ак только заголовок учитываться будет, нечестно. Вообще-то этот вопрос где-то поднимался, но я невнимательно читал. Количество видимых строк в DBGrid"е можно, в общем, высчитать, исходя из высоты самого грида и высоты текста в каждой строке, но вот на какой строке именно находишься - не знаю, как сделать. Если есть время, то посмотришь, может?


 
MetallAdm   (2002-02-14 11:24) [21]

А нельзя все енто математически подсчитать ??
Относительно Ширины DBGrid-a ??
плюс учитывать длинну строк в Титульных строках ...
если ширина ДБГрида = 100
а ширина всех строк =50
их допустим пять то выводишь формулу и прибовляешь к их ширине
.. в данном случае по 10

Или Такой вариан не из лутших ??



 
Анонимщик   (2002-02-14 11:50) [22]

Чего-то непонятно, о чем речь, чтобы столбцы сами по себе были как можно меньше и в то же время, чтобы в них была видна вся информация, или чтобы сам грид имел максимальную ширину, исходя из ширины каждого из столбцов?


 
Quest   (2002-02-14 12:08) [23]

>Анонимщик ©
это вопрос скорее к ray_wagner © - открывшему эту ветку :))

>>на какой строке именно находишься
текущую строку видимой части TDBGrid
With TStringGrid(DBGrid1) Do
Begin
Col // столбец
Row // строка
End;

если текущее значение, то это через DataSet
...
но по моему ты ошибаешся относительно моего предыдущего ответа, ведь здесь как раз и учитывается ширина текста в ячейке:
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
With (Sender as TDBGrid).Canvas Do

// ЭТО ширина содержимого ячейки
if TextWidth(Column.Field.text) > column.Width then

column.Width := TextWidth(Column.Field.text) + <приращение относительно ширины DBGrid>;
End;


 
Анонимщик   (2002-02-14 12:16) [24]

Это происходит вычисление и установка ширины только для данной ячейки. Событие, вызывающее эту перерисовку, происходит, когда нужно эту чяейку перерисовать. А другие-то видимые не учитываюся, а они могут повлиять (и повлияют) на нужную ширину. Как я уж только не извращался (но по-простому, без наворотов) - ничего не вышло.


 
Quest   (2002-02-14 13:33) [25]

это происходит вычисление для всех ячеек, но только для одного условия - чтобы ширина столбца была не меньше самого "длинного" значения ячейки этого столбца (я попробовал и работает прекрасно, правда с небольшим дополнением) ... а вот с уменьшением столбца (до ширины самого длинного значения) - просчёт :( ... да, здесь могу сказать только одно, что это не является основной задачей для программиста, и настройку элементов инерфейса можно переложить на пользователя предоставив ему для этого необходимые средства, а то современный пользователь окромя местонахождений основных кнопок ни о чём думать и не желает ... :)
прошу прощения за оффтопик


 
Анонимщик   (2002-02-14 20:10) [26]

Не, Quest, ты не прав. Мне желательно, например, чтобы ширина столбца выравнивалась автоматически по ширине самой длинной видимой записи в гриде в данный момент. И как реализовать?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.03.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
7-43200
olkononov1
2001-12-11 17:06
2002.03.14
Размер шрифта зависит от ОС


14-43157
Inkognito
2002-01-28 15:28
2002.03.14
Непрограммист в программиста


1-43001
Дмитрий_Ч
2002-02-28 12:38
2002.03.14
Помогите кто знает как...


4-43214
metakon
2002-01-12 03:03
2002.03.14
Как отключить клавиатуру и мышку?


1-43107
Miwa
2002-02-21 03:38
2002.03.14
Версия приложения.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский