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

Вниз

DBGrid   Найти похожие ветки 

 
Slimer ©   (2006-12-21 11:45) [0]

Как в run-time изменить ширину толбца таблицы DBGrid по длине заголовка столбца, или по максимально длинному значению в какой либо ячейке данного столбца?


 
Anatoly Podgoretsky ©   (2006-12-21 12:06) [1]

> Slimer  (21.12.2006 11:45:00)  [0]

И то и другое Column.width


 
Slimer ©   (2006-12-21 14:34) [2]


> И то и другое Column.width


В DBGrid.columns нет свойства width!!!


 
Anatoly Podgoretsky ©   (2006-12-21 15:11) [3]

> Slimer  (21.12.2006 14:34:02)  [2]

Читать внимательно, я говорил про TColumn


 
Slimer ©   (2006-12-21 15:24) [4]

А можно привести просто пример кода как это сделать?
А то у меня что-то не получается:(


 
Anatoly Podgoretsky ©   (2006-12-21 15:30) [5]

Смотри свойство Items у DBGrid.columns (можно опускать), кроме того у тебя наверно и Дельфи есть, соответственно есть и редактор, так вот там можно написать, только учти что DBGrid.columns это коллекция, то потребуется индекс, вот после него набей точку и нажми Ctrl+Space
или в конце концов взгляни наконец в справку.


 
Slimer ©   (2006-12-21 15:41) [6]

Ты думаешь я справку не смотрел? Думаешь я просто сижу и при малейшем вопросе сразу начинаю всех просить помочь??? Я с утра с самого пытаюсь сделать эту хрень а она не работает! Я ж не виноват что у меня еще опыта маловато!
Вот пишу следующее:
procedure TForm1.Button1Click(Sender: TObject);
var t: TColumn;
   c:integer;
begin
for c:=0 to DBGrid1.Columns.Count-1 do
begin
t:=TColumn.Create(DBGrid1.Columns);
t.Width:=strtoint (Table1.Fields[c].FieldName.Length);
end;
end;

и естественно ошибка. Как ее исправить?


 
Slimer ©   (2006-12-21 15:44) [7]

Даже вот так будет правильней:
procedure TForm1.Button1Click(Sender: TObject);
var t: TColumn;
   c:integer;
begin
for c:=0 to DBGrid1.Columns.Count-1 do
begin
t:=TColumn.Create(DBGrid1.Columns);
t.Width:=Table1.Fields[c].FieldName.Length;
end;
end;

но всеравно не работает... Надо как-то по другому


 
vitv ©   (2006-12-21 15:48) [8]

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBGrid1.DataSource.DataSet.DisableControls;
  TStringGrid(DBGrid1).DefaultRowHeight := 55;
  DBGrid1.DataSource.DataSet.EnableControls;
end;


 
Плохиш ©   (2006-12-21 15:50) [9]


> t:=TColumn.Create(DBGrid1.Columns);

Это ты где такое вычитал?


 
Slimer ©   (2006-12-21 15:53) [10]


>
> > t:=TColumn.Create(DBGrid1.Columns);
>
> Это ты где такое вычитал?


Как где? Подгорецкий посоветовал:)


 
Плохиш ©   (2006-12-21 15:55) [11]


> Slimer ©   (21.12.06 15:53) [10]
> Как где? Подгорецкий посоветовал

Не ври, он этого не советовал. И в справке, в которую он тебя послал, то же такого не советовали.


 
Slimer ©   (2006-12-21 15:57) [12]


> vitv ©   (21.12.06 15:48) [8]
> procedure TForm1.Button1Click(Sender: TObject);
> begin
>   DBGrid1.DataSource.DataSet.DisableControls;
>   TStringGrid(DBGrid1).DefaultRowHeight := 55;
>   DBGrid1.DataSource.DataSet.EnableControls;
> end;


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


 
Slimer ©   (2006-12-21 16:00) [13]


> Не ври, он этого не советовал. И в справке, в которую он
> тебя послал, то же такого не советовали.


Ну может он когда советовал то имел ввиду что-то другое, но я это понял так:) И так оно получилось. но не работает.

Да может хоть кто-то просто привести пример кода и все!!! Я сразу пойму как это должно работать, а не тыкать вечно в эту хренову справку! Если б она еще на русском была, а так я еще не понимаю что там наклацано на забугорском!


 
Anatoly Podgoretsky ©   (2006-12-21 16:01) [14]

> Slimer  (21.12.2006 15:44:07)  [7]

Зачем ты пытаешься создавать созданое.
Быстро марш в справку по указанным ключевым словам.


 
Slimer ©   (2006-12-21 16:15) [15]

Таааак:) Отличненько... с одним справились:)
Процедура упростилась до неймоверных размеров:) Ура! Как грицца краткость-сестра таланта:)

procedure TForm1.Button1Click(Sender: TObject);
var c:integer;
begin
for c:=0 to DBGrid1.Columns.Count-1 do
DBGrid1.Columns.Items[c].Width:=30;
end;


Теперь растолкуйте мне пожалуйста, как вместо 30, написать то что мне нужно?


 
Anatoly Podgoretsky ©   (2006-12-21 16:24) [16]

> Slimer  (21.12.2006 16:15:15)  [15]

Например так

DBGrid1.Columns[c].Width := 33;


 
Плохиш ©   (2006-12-21 16:24) [17]


> Slimer ©   (21.12.06 16:15) [15]
> Теперь растолкуйте мне пожалуйста, как вместо 30, написать
> то что мне нужно?

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


 
Slimer ©   (2006-12-21 16:26) [18]


> > Slimer  (21.12.2006 16:15:15)  [15]
>
> Например так
>
> DBGrid1.Columns[c].Width := 33;


??? Не думал что вы меня настолько тупым считаете!
Я имею ввиду как можно определить длину строки заголовка столбца? А подставить значение вместо 30 я и сам могу


 
Anatoly Podgoretsky ©   (2006-12-21 16:29) [19]

> Slimer  (21.12.2006 16:26:18)  [18]

длина_заголовка_столбца := DBGrid1.Columns[c].Width


 
Slimer ©   (2006-12-21 16:34) [20]


> > Slimer  (21.12.2006 16:26:18)  [18]
>
> длина_заголовка_столбца := DBGrid1.Columns[c].Width


У меня складывается впечатление что вы либо не понимаете мой вопрос либо издеваетесь надо мной! Мне нужно чтоб ширина столбца устанавливалась по тексту заголовка! Т.е. в зависимости от того насколько длинное слово в заголовке столбца.


 
Плохиш ©   (2006-12-21 16:37) [21]

дбгрид1.цокумнс[c].дисплынаме + ф1

PS. какой догадливый, аднака :-)


 
Slimer ©   (2006-12-21 16:50) [22]


> дбгрид1.цокумнс[c].дисплынаме + ф1
>
> PS. какой догадливый, аднака :-)


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


 
Anatoly Podgoretsky ©   (2006-12-21 16:52) [23]

> Slimer  (21.12.2006 16:34:20)  [20]

Как задашь вопрос, так и получишь ответ, в народной мудрости "каков вопрос, таков и ответ"


 
Anatoly Podgoretsky ©   (2006-12-21 16:53) [24]

> Slimer  (21.12.2006 16:50:22)  [22]

Это уже другой вопрос и другая функция/свойство TextWidth
Смотреть там же, в справке


 
Slimer ©   (2006-12-21 17:08) [25]

for c:=0 to DBGrid1.Columns.Count-1 do
DBGrid1.Columns.Items[c].Width:= TextWidth (DBGrid1.Fields[c].Value);

Все что получилось.
Однако не понимает TextWidth никак.
Может в uses надо что-то включить еще?


 
Anatoly Podgoretsky ©   (2006-12-21 17:16) [26]

> Slimer  (21.12.2006 17:08:25)  [25]

Справку по функции смотрел?


 
Slimer ©   (2006-12-21 17:23) [27]

Да, смотрел.
Там все просто function TextWidth(Text: string): double;
Пусть она хоть дабл, хоть риал возвращает! Почему делфи не понимает эту функцию? Пишет Undeclared identifier


 
Anatoly Podgoretsky ©   (2006-12-21 17:50) [28]

> Slimer  (21.12.2006 17:23:27)  [27]

Еще раз читать справку, не только заголовок функции, но и ее описание.


 
Slimer ©   (2006-12-21 18:05) [29]

Ага. Действительно
DBGrid1.Columns.Items[c].Width:= DBGrid1.Canvas.TextWidth(DBGrid1.Fields[c].FieldName);
И все отлично заработало, но что-то всеравно колонка не по тексту выравнивается. а немного обрезает текст заголовка


 
Anatoly Podgoretsky ©   (2006-12-21 18:08) [30]

> Slimer  (21.12.2006 18:05:29)  [29]

Так ширина колонки это не только текст, но и отступы.


 
Slimer ©   (2006-12-21 19:10) [31]

Все нормально уже работает если сделать в конце +5:)
Теперь другая проблемма. Это мы устанавливали ширину в зависимости от текста заголовка таблицы, а теперь мне надо установить по максимально большому слову любой из ячеек данной колонки.
Пишу так:
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i<>0 then //если открыта база
begin
 for c:=0 to Table1.Fields.Count-1 do
 begin
   Table1.First;
   d:=1;
    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;
 end;
 DBGrid1.Columns.Items[c].Width:=d+5;
end
else
begin
ShowMessage("&#193;&#224;&#231;&#224; &#228;&#224;&#237;&#237;&#251;&#245; &#237;&#229; &#238;&#242;&#234;&#240;&#251;&#242;&#224;!");
end;
end;


Ну и как вы уже догадались - ничего не работает


 
Anatoly Podgoretsky ©   (2006-12-21 19:14) [32]

> Slimer  (21.12.2006 19:10:31)  [31]

Конечно не будет, поскольку неверный оператор отношения, замеи на больше


 
Anatoly Podgoretsky ©   (2006-12-21 19:14) [33]

> Anatoly Podgoretsky  (21.12.2006 19:14:32)  [32]

Или поменяй местами операнды в операции отношения


 
Плохиш ©   (2006-12-21 21:02) [34]


>     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?


 
Slimer ©   (2006-12-21 21:29) [35]


> Ужасть, а не код :-( Почему бы не использовать цикл while?


Без разницы! Тут дело не в операторе, и не в цикле...
Пишу:
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i<>0 then
begin
 for c:=0 to Table1.Fields.Count-1 do
 begin
   Table1.First;
   d:=1;
    while not 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;
 end;
 DBGrid1.Columns.Items[c].Width:=d+5;
end
else
begin
ShowMessage("&#193;&#224;&#231;&#224; &#228;&#224;&#237;&#237;&#251;&#245; &#237;&#229; &#238;&#242;&#234;&#240;&#251;&#242;&#224;!");
end;
end;

Выдает ошибку "I/O error 6"
При этом выделяет строку while not EOF do;


 
Anatoly Podgoretsky ©   (2006-12-21 21:36) [36]

> Slimer  (21.12.2006 21:29:35)  [35]

while not EOF do;

В данном контесте оначает, что консоль (файл input) н доступно в GUI приложении.
В даном контесте использование даной функции абсурд, ты наверно хотел

while not Table1.EOF do;

и без ; и совместно с операторным скобкми.
И то и другое смотрится абсурдом, тебе еще повезло, что это откомпилировалось вообще.

Обычно в данном случае у нас говоят

Ужас


 
Плохиш ©   (2006-12-21 22:14) [37]

Так у него и в первом случая EOF стоит - двойной ужас...


 
Slimer ©   (2006-12-21 22:18) [38]

Теперь два варианта.
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i<>0 then
begin
 for c:=0 to Table1.Fields.Count-1 do
 begin
   Table1.First;
   d:=0;
    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;
 end;
 DBGrid1.Columns.Items[c].Width:=d+5;
end
else
begin
ShowMessage("&#193;&#224;&#231;&#224; &#228;&#224;&#237;&#237;&#251;&#245; &#237;&#229; &#238;&#242;&#234;&#240;&#251;&#242;&#224;!");
end;
end;


Если в таком виде - то программа при выполнении это процедуры зависает

Если после строк
for c:=0 to Table1.Fields.Count-1 do
и
while not Table1.Eof do
поставить ; то выдается ошибка List index out of bonds (17)


 
Плохиш ©   (2006-12-21 22:27) [39]


> Slimer ©   (21.12.06 22:18) [38]

Не буду я ничего объяснять, потому что это будет бессмысленное топтание кнопок. Ты всё-равно основ не знаешь, иди читай основы программирования и синтаксис паскаля (в частности описания операторов циклов).

PS. У тебя 17 полей в таблице :-)


 
Slimer ©   (2006-12-21 23:14) [40]

Итак, господа програмисты, с большооооой радостью хочу Вам сообщить что функция ЗАРАБОТАЛА!!!
Может она и не будет так сильно востребована в таблице, но она не работала и это не давало мне спокойно жить:)
Вот код абсолютно рабочей на 100% функции:
procedure TForm2.N2Click(Sender: TObject);
var c,d:integer;
begin
if i<>0 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("&#193;&#224;&#231;&#224; &#228;&#224;&#237;&#237;&#251;&#245; &#237;&#229; &#238;&#242;&#234;&#240;&#251;&#242;&#224;!");
end;

end;


 
Anatoly Podgoretsky ©   (2006-12-21 23:20) [41]

> Slimer  (21.12.2006 23:14:40)  [40]

Сказано же было заменить на знак больше, а ты на что сменил, на d>= ну и зачем делать присвоение ри равенстве?


 
Slimer ©   (2006-12-21 23:40) [42]


> Сказано же было заменить на знак больше, а ты на что сменил,
>  на d>= ну и зачем делать присвоение ри равенстве?

Вобщем-то не знаю почему, но пока не помнял на >= ничего не работало:)


 
Anatoly Podgoretsky ©   (2006-12-22 01:29) [43]

> Slimer  (21.12.2006 23:40:42)  [42]

Ну так тебе было сказано заменить на знак >, а не на >=
Еще не поздно.


 
Германн ©   (2006-12-22 01:41) [44]


> Anatoly Podgoretsky ©   (21.12.06 23:20) [41]
>
> > Slimer  (21.12.2006 23:14:40)  [40]
>
> Сказано же было заменить на знак больше, а ты на что сменил,
>  на d>= ну и зачем делать присвоение ри равенстве?

Акела промахнулся? :-)
В [40] увеличение ширины происходит только при "<"



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

Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.015 c
1-1163773693
alexey_potapov
2006-11-17 17:28
2007.01.14
"Недостаточно памяти для завершения операции"


9-1134361287
megabyte-ceercop
2005-12-12 07:21
2007.01.14
Сетевая игра. BCB6


6-1149488733
sound81
2006-06-05 10:25
2007.01.14
Проверка актуальности антивирусных баз


2-1166791290
Rolevik
2006-12-22 15:41
2007.01.14
Задание атрибутов музыкальных файлов


2-1166708713
Vitaly
2006-12-21 16:45
2007.01.14
Как из TDateTime получить TDateTime минус несколько часов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский