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

Вниз

Как проитись по всем полям TDataSet   Найти похожие ветки 

 
Kolan ©   (2006-11-16 15:55) [0]

Здравствуйте,
 Надюсь правильно вопрос задал. Мне нужно узнать максимальную длинну строки в колонке, но я незнаю как организовать цикл...


 
Плохиш ©   (2006-11-16 15:56) [1]

Ты уж определись по полям или по записям?

while not query.eof do
...


 
Kolan ©   (2006-11-16 15:57) [2]

> [1] Плохиш ©   (16.11.06 15:56)
> Ты уж определись по полям или по записям?
>
> while not query.eof do
> ...

А как считывать саму строчку?


 
Игорь Шевченко ©   (2006-11-16 15:57) [3]

maxlength := 0;
with dataset do begin
 Open
 while not Eof do
   currentlength := FieldByName("FOO").AsString;
   if currentlength > maxlength then
      maxlength := currentlength;
   Next;  
 end;
end;

Оно ?


 
Плохиш ©   (2006-11-16 15:59) [4]


> Игорь Шевченко ©   (16.11.06 15:57) [3]

Ой, а я знаю какой у него будет следующий вопрос :-))


 
Kolan ©   (2006-11-16 16:00) [5]

Какой?
Гы, уже не угадал :)


 
Kolan ©   (2006-11-16 16:17) [6]

> Оно ?

Вроде :)
Вот наваял..

procedure TMainForm.AdjustColums(DBGrid: TDBGrid);
var
 ColMaxLengths: array of Integer;
 TempLength, I: Integer;
 S: string;
begin
 TempLength := 0;
 I := 0;
 DBGrid.DataSource.DataSet.First;
 while not DBGrid.DataSource.DataSet.Eof do
 begin
   //TempLength := Length(DBGrid.DataSource.DataSet.FieldValues[I]);
   S := Trim(DBGrid.DataSource.DataSet.Fields.Fields[I].Text);
   if Length(S) > TempLength then
   begin
     SetLength(ColMaxLengths, Length(ColMaxLengths)+1);
     ColMaxLengths[High(ColMaxLengths)] := Length(S);
   end;

   DBGrid.DataSource.DataSet.Next;
 end;
end;


1. Как переходит на другую колонку?
2. Как проверять еще и заголовки колонок? (То что у меня закомментированно ругается [Pascal Error] KFreGrafDBMainForm.pas(91): E2010 Incompatible types: "string" and "Integer")


 
Игорь Шевченко ©   (2006-11-16 16:18) [7]

Плохиш ©   (16.11.06 15:59) [4]

Я так надеялся что следующий пост будет содержать "спасибо" :)


 
Игорь Шевченко ©   (2006-11-16 16:27) [8]

procedure AdjustGridColumns (Grid: TDBGrid; AveCharWidth: Integer);
var
 MaxLengths: array of Integer;
 I, J: Integer;
begin
 with Grid.DataSource.DataSet do begin
   Setlength(MaxLengths, FieldCount);
   for I:=0 to Pred(FieldCount) do
     MaxLengths[I] := 0;
   if Active then
      First
   else
     Open;
   while not Eof do begin
      for I:=0 to FieldCount do
         if MaxLengths[I] < Length(Fields[I].AsString)  then
           MaxLengths[I] := Length(Fields[I].AsString);
      Next;
   end;
 for I:=0 to Pred(FieldCount) do
   for J:=0 to Grid.Columns.Count do
     if Grid.Columns[J].FieldName = Fields[I].FieldName then begin
       Grid.Columns[J].Width := MaxLengths[I] * AveCharWidth;
       Break;
     end;
 end;
end;


 
Kolan ©   (2006-11-16 16:36) [9]

Таки, спасибо. :)


 
Kolan ©   (2006-11-16 16:37) [10]

> [8] Игорь Шевченко ©   (16.11.06 16:27)

Ну вот а я думал помощи не будет и сам писал :)

procedure TMainForm.AdjustColums(DBGrid: TDBGrid);
var
 ColMaxLengths: array of Integer;
 TempLength, I, J: Integer;
 S: string;
begin
 TempLength := 0;
 SetLength(ColMaxLengths, DBGrid.DataSource.DataSet.FieldList.Count);
 for I := 0 to DBGrid.DataSource.DataSet.FieldList.Count - 1 do
 begin
   DBGrid.DataSource.DataSet.First;
   S := DBGrid.DataSource.DataSet.FieldDefList[I].Name;
   TempLength := Length(Trim(S));
   ColMaxLengths[I] := Length(S);
   while not DBGrid.DataSource.DataSet.Eof do
   begin
     S := Trim(DBGrid.DataSource.DataSet.Fields.Fields[I].AsString);
     if Length(S) > TempLength then
     begin
       ColMaxLengths[I] := Length(S);
       TempLength := Length(S);
     end;
     DBGrid.DataSource.DataSet.Next;
   end;
 end;
end;


Благодарю :)


 
Kolan ©   (2006-11-16 16:38) [11]

> * AveCharWidth

Вот это чему равно/откуда берется?


 
Игорь Шевченко ©   (2006-11-16 16:49) [12]

Kolan ©   (16.11.06 16:38) [11]

Это равно средней ширине символа в гриде. У Columns Width задается в Pixel-ях, сам понимаешь, Length считает в байтах. Это сколько пикселей в байте в среднем (ну или с запасом).


 
novill ©   (2006-11-16 16:53) [13]

> [4] Плохиш ©   (16.11.06 15:59)
>
> > Игорь Шевченко ©   (16.11.06 15:57) [3]
>
> Ой, а я знаю какой у него будет следующий вопрос :-))


Возможно, автор просто не знал о возможности (и необходимости) посчитать длину строки в пикселях.

> AveCharWidth
>
> Вот это чему равно/откуда берется?



> [8] Игорь Шевченко ©   (16.11.06 16:27)

А почему для расчета не использовали Вашу же функцию ?
function GetTextWidthInPixels(AText: string; AControl: TControl): integer;

Просто интересно :)


 
Игорь Шевченко ©   (2006-11-16 17:00) [14]

novill ©   (16.11.06 16:53) [13]

А она долго будет работать в этом случае. Проще посчитать один раз и передавать константу.


 
clickmaker ©   (2006-11-16 17:01) [15]


> А она долго будет работать в этом случае

медленно, но верно :)


 
Kolan ©   (2006-11-16 20:22) [16]

> Возможно, автор просто не знал о возможности (и необходимости)
> посчитать длину строки в пикселях.

Нет, это просто автар(я) ... :)


> Это равно средней ширине символа в гриде.

Это я понял :)

> Это сколько пикселей в байте в среднем

Как это подсчитать? -Вот что я не понял.. Самому? Вручную?


 
Игорь Шевченко ©   (2006-11-16 21:23) [17]

Kolan ©   (16.11.06 20:22) [16]

var
 TM: TTextMetric;
 AveCharWidth: Integer;
begin
 GetTextMetrics(Grid.Canvas.Handle, TM);
 AveCharWidth := (Grid.Canvas.TextWidth("0") - TM.tmOverhang) +
    TM.tmOverhang + 4;
end;

Примерно так.


 
Игорь Шевченко ©   (2006-11-16 21:24) [18]

Наврал.

AveCharWidth := Grid.Canvas.TextWidth("0") - TM.tmOverhang + 4


 
Kolan ©   (2006-11-16 21:29) [19]

> Игорь Шевченко ©   (16.11.06 21:24)

Благодарствую. Пригодиттся :)


 
Kolan ©   (2006-11-16 21:45) [20]

Гм.. С такой таблицей:

1

Расчитало не верно - сильно обрезало.


 
Игорь Шевченко ©   (2006-11-16 23:49) [21]

Kolan ©   (16.11.06 21:45) [20]


> Расчитало не верно - сильно обрезало.


Единицу прибавь :)
Мы похожей формулой пользовались для автоматических построений форм.


 
Kolan ©   (2006-11-17 14:20) [22]

> Единицу прибавь :)

Вот таки не 1, а минимум 5, тогда конец колонки приливает к "№". Те по хорошему надо -7.


 
Игорь Шевченко ©   (2006-11-17 14:28) [23]

Kolan ©   (17.11.06 14:20) [22]


> Вот таки не 1, а минимум 5, тогда конец колонки приливает
> к "№". Те по хорошему надо -7.


Я чего-то не понял. Ты же умножаешь потом на это число. Ты попробуй с другими полями,не в один символ


 
Kolan ©   (2006-11-17 14:33) [24]

Ты же умножаешь потом на это число.
Да:
DBGrid.Columns[I].Width := TempLength*AveCharWidth+7;

И AveCharWidth = 10 у меня, а длинна знака вчесленная также, те
AveCharWidth := DBGrid.Canvas.TextWidth("№") - TM.tmOverhang + 4;
равна 17.



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

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

Наверх




Память: 0.5 MB
Время: 0.04 c
1-1161455953
andry1981
2006-10-21 22:39
2006.12.03
массив форм


2-1163438458
Troan_81
2006-11-13 20:20
2006.12.03
Работа с директориями


15-1162911202
SkySpeed
2006-11-07 17:53
2006.12.03
Как в Excel построить следующую поверхность функции:x*x+y*y+z*z=1


1-1161613126
click
2006-10-23 18:18
2006.12.03
popup menu при перетаскивании за клиент. область


6-1152986864
anton773
2006-07-15 22:07
2006.12.03
InternetSetFilePointer





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