![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DBGrid
Slimer © (2006-12-21 11:45:00)Как в run-time изменить ширину толбца таблицы DBGrid по длине заголовка столбца, или по максимально длинному значению в какой либо ячейке данного столбца?
Германн (2006-12-22 01:41:00) [1]
> Anatoly Podgoretsky © (21.12.06 23:20) [41]
>
> > Slimer (21.12.2006 23:14:40) [40]
>
> Сказано же было заменить на знак больше, а ты на что сменил,
> на d>= ну и зачем делать присвоение ри равенстве?
Акела промахнулся? :-)
В [40] увеличение ширины происходит только при "<"
Anatoly Podgoretsky (2006-12-22 01:29:00) [2]> Slimer (21.12.2006 23:40:42) [42]
Ну так тебе было сказано заменить на знак >, а не на >=
Еще не поздно.
Slimer (2006-12-21 23:40:00) [3]
> Сказано же было заменить на знак больше, а ты на что сменил,
> на d>= ну и зачем делать присвоение ри равенстве?
Вобщем-то не знаю почему, но пока не помнял на >= ничего не работало:)
Anatoly Podgoretsky (2006-12-21 23:20:00) [4]> Slimer (21.12.2006 23:14:40) [40]
Сказано же было заменить на знак больше, а ты на что сменил, на d>= ну и зачем делать присвоение ри равенстве?
Slimer (2006-12-21 23:14:00) [5]Итак, господа програмисты, с большооооой радостью хочу Вам сообщить что функция ЗАРАБОТАЛА!!!
Может она и не будет так сильно востребована в таблице, но она не работала и это не давало мне спокойно жить:)
Вот код абсолютно рабочей на 100% функции:
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i0 then
begin
for c:=0 to Table1.Fields.Count-1 do
begin
d:=0;
Table1.First;
while not Table1.Eof do
begin
if d>=DBGrid1.Canvas.TextWidth(DBGrid1.Fields[c].AsString) then
Table1.Next
else
begin
d:=DBGrid1.Canvas.TextWidth(DBGrid1.Fields[c].AsString);
Table1.Next;
end;
end;
DBGrid1.Columns.Items[c].Width:=d+5;
end;
Table1.First;
end
else
begin
ShowMessage('Áàçà äàííûõ íå îòêðûòà!');
end;
end;
Плохиш (2006-12-21 22:27:00) [6]
> Slimer © (21.12.06 22:18) [38]
Не буду я ничего объяснять, потому что это будет бессмысленное топтание кнопок. Ты всё-равно основ не знаешь, иди читай основы программирования и синтаксис паскаля (в частности описания операторов циклов).
PS. У тебя 17 полей в таблице :-)
Slimer (2006-12-21 22:18:00) [7]Теперь два варианта.
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i0 then
begin
for c:=0 to Table1.Fields.Count-1 do
begin
Table1.First;
d:=0;
while not Table1.Eof do
begin
if d
Плохиш (2006-12-21 22:14:00) [8]Так у него и в первом случая EOF стоит - двойной ужас...
Anatoly Podgoretsky (2006-12-21 21:36:00) [9]> Slimer (21.12.2006 21:29:35) [35]
while not EOF do;
В данном контесте оначает, что консоль (файл input) н доступно в GUI приложении.
В даном контесте использование даной функции абсурд, ты наверно хотел
while not Table1.EOF do;
и без ; и совместно с операторным скобкми.
И то и другое смотрится абсурдом, тебе еще повезло, что это откомпилировалось вообще.
Обычно в данном случае у нас говоят
Ужас
Slimer (2006-12-21 21:29:00) [10]
> Ужасть, а не код :-( Почему бы не использовать цикл while?
Без разницы! Тут дело не в операторе, и не в цикле...
Пишу:
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i0 then
begin
for c:=0 to Table1.Fields.Count-1 do
begin
Table1.First;
d:=1;
while not EOF do;
begin
if d
Плохиш (2006-12-21 21:02:00) [11]
> if not EOF then
> begin
> repeat
> if d<DBGrid1.Canvas.TextWidth(DBGrid1.Fields[c].
> AsString) then
> Table1.Next
> else
> begin
> d:=DBGrid1.Canvas.TextWidth(DBGrid1.Fields[c].
> AsString);
> Table1.Next;
> end;
> until eof;
> end;
Ужасть, а не код :-( Почему бы не использовать цикл while?
Anatoly Podgoretsky (2006-12-21 19:14:00) [12]> Anatoly Podgoretsky (21.12.2006 19:14:32) [32]
Или поменяй местами операнды в операции отношения
Anatoly Podgoretsky (2006-12-21 19:14:00) [13]> Slimer (21.12.2006 19:10:31) [31]
Конечно не будет, поскольку неверный оператор отношения, замеи на больше
Slimer (2006-12-21 19:10:00) [14]Все нормально уже работает если сделать в конце +5:)
Теперь другая проблемма. Это мы устанавливали ширину в зависимости от текста заголовка таблицы, а теперь мне надо установить по максимально большому слову любой из ячеек данной колонки.
Пишу так:
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i0 then //если открыта база
begin
for c:=0 to Table1.Fields.Count-1 do
begin
Table1.First;
d:=1;
if not EOF then
begin
repeat
if d
Anatoly Podgoretsky (2006-12-21 18:08:00) [15]> Slimer (21.12.2006 18:05:29) [29]
Так ширина колонки это не только текст, но и отступы.
Slimer (2006-12-21 18:05:00) [16]Ага. Действительно
DBGrid1.Columns.Items[c].Width:= DBGrid1.Canvas.TextWidth(DBGrid1.Fields[c].FieldName);
И все отлично заработало, но что-то всеравно колонка не по тексту выравнивается. а немного обрезает текст заголовка
Anatoly Podgoretsky (2006-12-21 17:50:00) [17]> Slimer (21.12.2006 17:23:27) [27]
Еще раз читать справку, не только заголовок функции, но и ее описание.
Slimer (2006-12-21 17:23:00) [18]Да, смотрел.
Там все просто function TextWidth(Text: string): double;
Пусть она хоть дабл, хоть риал возвращает! Почему делфи не понимает эту функцию? Пишет Undeclared identifier
Anatoly Podgoretsky (2006-12-21 17:16:00) [19]> Slimer (21.12.2006 17:08:25) [25]
Справку по функции смотрел?
Slimer (2006-12-21 17:08:00) [20]
for c:=0 to DBGrid1.Columns.Count-1 do
DBGrid1.Columns.Items[c].Width:= TextWidth (DBGrid1.Fields[c].Value);
Все что получилось.
Однако не понимает TextWidth никак.
Может в uses надо что-то включить еще?