Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.14;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.048 c
11-1142992833
Rusya
2006-03-22 05:00
2007.01.14
Куда пропало свойство Hint?


2-1167118826
СержК
2006-12-26 10:40
2007.01.14
Помогите написать запрос


15-1166554186
cando
2006-12-19 21:49
2007.01.14
пароли и имена подключений


6-1155810638
DesWind
2006-08-17 14:30
2007.01.14
TIdUDPserver


2-1167052236
Trible
2006-12-25 16:10
2007.01.14
отослать сообщение процесу, созданного с CreateProcess