![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ламерский вопрос про DbGrid [D5, Paradox]
ray_wagner © (2002-02-12 03:36:00)Подскажите, как сделать, чтобы в DbGride не оставалось пустого места после столбцов?
Анонимщик (2002-02-14 20:10:00) [1]Не, Quest, ты не прав. Мне желательно, например, чтобы ширина столбца выравнивалась автоматически по ширине самой длинной видимой записи в гриде в данный момент. И как реализовать?
Quest (2002-02-14 13:33:00) [2]это происходит вычисление для всех ячеек, но только для одного условия - чтобы ширина столбца была не меньше самого "длинного" значения ячейки этого столбца (я попробовал и работает прекрасно, правда с небольшим дополнением) ... а вот с уменьшением столбца (до ширины самого длинного значения) - просчёт :( ... да, здесь могу сказать только одно, что это не является основной задачей для программиста, и настройку элементов инерфейса можно переложить на пользователя предоставив ему для этого необходимые средства, а то современный пользователь окромя местонахождений основных кнопок ни о чём думать и не желает ... :)
прошу прощения за оффтопик
Анонимщик (2002-02-14 12:16:00) [3]Это происходит вычисление и установка ширины только для данной ячейки. Событие, вызывающее эту перерисовку, происходит, когда нужно эту чяейку перерисовать. А другие-то видимые не учитываюся, а они могут повлиять (и повлияют) на нужную ширину. Как я уж только не извращался (но по-простому, без наворотов) - ничего не вышло.
Quest (2002-02-14 12:08:00) [4]>Анонимщик ©
это вопрос скорее к 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 11:50:00) [5]Чего-то непонятно, о чем речь, чтобы столбцы сами по себе были как можно меньше и в то же время, чтобы в них была видна вся информация, или чтобы сам грид имел максимальную ширину, исходя из ширины каждого из столбцов?
MetallAdm (2002-02-14 11:24:00) [6]А нельзя все енто математически подсчитать ??
Относительно Ширины DBGrid-a ??
плюс учитывать длинну строк в Титульных строках ...
если ширина ДБГрида = 100
а ширина всех строк =50
их допустим пять то выводишь формулу и прибовляешь к их ширине
.. в данном случае по 10
Или Такой вариан не из лутших ??
Анонимщик (2002-02-14 10:43:00) [7]Quest >>>
Не, так не пойдет, ак только заголовок учитываться будет, нечестно. Вообще-то этот вопрос где-то поднимался, но я невнимательно читал. Количество видимых строк в DBGrid"е можно, в общем, высчитать, исходя из высоты самого грида и высоты текста в каждой строке, но вот на какой строке именно находишься - не знаю, как сделать. Если есть время, то посмотришь, может?
Quest (2002-02-14 08:44:00) [8]TextWidth -> TextWidth(Column.Field.text)
Quest (2002-02-14 08:20:00) [9]>Анонимщик ©
не скажу, но чтобы бегать только по видимой части 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;
Анонимщик (2002-02-13 21:19:00) [10]А я, Quest, пример привел, да и только. А вот скажешь, может, как узнать, какие строки в гриде видны в данное время и каким записям они соответствуют?
Jony (2002-02-13 16:36:00) [11]Используй DBGridEh. У неё есть свойство AutiFitColWidths. Установить его в True и все проблемы решены.
Quest (2002-02-13 15:50:00) [12]>Belov ©
возможно, я не спорю, но для меня мой путь удобнее, по крайней мере тем, что я помимо размеров столбцов TDBGrid-ов ещё сохраняю различные настройки и переменные программы и при чтении, могу перед их установкой делать необходимые проверки и обработки ...
но это к теме уже не относится.
Belov (2002-02-13 15:22:00) [13]>2Quest
На самом деле можно сделать все более красивее и проще
по-поводу сохранения настроек
DBGrid1.Columns.SaveToFile(....)
установка
DBGrid1.Columns.LoadFromFile(...)
Quest (2002-02-13 14:45:00) [14]>Анонимщик ©
относительно твоего алгоритма, это тоже не рационально, выходит при любых пересчётах, изменений данных необходимо пробегать по всей базе, и плюс к этому будут ограничения на используемые шрифты и размер формы (ведь если ширина главного окошка будет больше суммарной ширины столбцов + разделителей + ширина рамки, то справа от крайней левой колонки будет неиспользованное место, и в противном случае не будут видны все поля, так как не будет возможности их сократить)
wicked (2002-02-13 14:44:00) [15]2 Quest ©
дело ваше... можно и самому написать похожую компоненту... смысл моего высказывания заключается в том, что если delphi - компонентно-ориентированная среда, то, по меньшей мере, геморройно пытаться в каждом проекте писать одно и то же сохранение...
насчёт изменения ширины столбцов
можно разрешить юзеру выставить такую ширину, как ему хочется (он за компом главный :), а потом, при изменении размеров окна, пропорционально изменять ширину столбцов... ну и, конечно, сохранять этот расклад между сессиями работы с программой...
Анонимщик (2002-02-13 14:29:00) [16]Все равно это все неудобно, длина текста в поле может меняться, иногда желательно, чтобы размер выставлялся и сам по максимальной ширине видимых записей.
Quest (2002-02-13 14:26:00) [17]>wicked ©
НО есть и такие, кто не пользуется сторонними компонентами, а принципиально и из соображения длительного сопровождения программы (с переходами на более продвинутые версии Delphi) использует стандартные и самописные ...
wicked (2002-02-13 14:05:00) [18]2 kserg@ukr.net
2 Quest ©
а ежели у кого rxlib есть, так там это всё автоматически... компонента tformstorage.... и уже немного меньше работы... :)
Quest (2002-02-13 12:20:00) [19]Сохраняю исключительно в 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, определяя количество столбцов и их размеры.
kserg@ukr.net (2002-02-13 10:53:00) [20]>Quest уважаемый, поделись как ты это делаешь?