Форум: "Базы";
Текущий архив: 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.004 c