Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 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, ты не прав. Мне желательно, например, чтобы ширина столбца выравнивалась автоматически по ширине самой длинной видимой записи в гриде в данный момент. И как реализовать?




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




Наверх





Память: 0.78 MB
Время: 0.03 c
1-42992           Zool                  2002-02-28 10:38  2002.03.14  
jpg


14-43169          Awex                  2002-01-31 14:33  2002.03.14  
Подскажите плиз, книку Рэя Конопки кто нибудь видел в каком нибудь интернет магазине, и Белеро и Озон и море других просмотрел, так и ненашел.... везде в нулевых остатках.... :(((


4-43211           Romul                 2002-01-12 12:05  2002.03.14  
Как удерживать бегунок у ScrollBar внизу?


3-42956           Duce                  2002-02-14 12:37  2002.03.14  
Как красиво исполнить INSERT?


3-42930           Koks                  2002-02-14 13:53  2002.03.14  
экспорт в Excel