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

Вниз

Как проитись по всем полям 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.161 c
1-1161673278
DelphiLexx
2006-10-24 11:01
2006.12.03
TRegistry - удалить подраздел


15-1163156100
Empleado
2006-11-10 13:55
2006.12.03
Как можно заинтересовать ребенка


2-1163743805
alex810
2006-11-17 09:10
2006.12.03
StringGrid событие DrawCell


1-1161708596
carmen
2006-10-24 20:49
2006.12.03
Создание dbgrideh на листе tabsheet компонента pagecontrol


15-1163666134
TJulia
2006-11-16 11:35
2006.12.03
Как устроены спам-фильтры?