Главная страница
    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;



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

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

Наверх





Память: 0.56 MB
Время: 0.021 c
11-1143564347
dskin
2006-03-28 20:45
2007.01.14
Тупой вопрос


2-1166627427
atas-sheriff
2006-12-20 18:10
2007.01.14
TClientSocket &amp; TProgressBar


1-1163854909
PAVEL315
2006-11-18 16:01
2007.01.14
ПОМОГИТЕ!!!


2-1166728259
HITMAN
2006-12-21 22:10
2007.01.14
Image1 Каким образом загрузить картинку с сайта???


2-1166641119
Signate
2006-12-20 21:58
2007.01.14
Манипуляции с TSocket...





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