![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как проитись по всем полям TDataSet
Kolan © (2006-11-16 15:55:00)Здравствуйте,
Надюсь правильно вопрос задал. Мне нужно узнать максимальную длинну строки в колонке, но я незнаю как организовать цикл...
Kolan (2006-11-17 14:33:00) [1]
Ты же умножаешь потом на это число.
Да:
DBGrid.Columns[I].Width := TempLength*AveCharWidth+7;
И AveCharWidth = 10 у меня, а длинна знака№вчесленная также, те
AveCharWidth := DBGrid.Canvas.TextWidth('№') - TM.tmOverhang + 4;
равна 17.
Игорь Шевченко (2006-11-17 14:28:00) [2]Kolan © (17.11.06 14:20) [22]
> Вот таки не 1, а минимум 5, тогда конец колонки приливает
> к "№". Те по хорошему надо -7.
Я чего-то не понял. Ты же умножаешь потом на это число. Ты попробуй с другими полями,не в один символ
Kolan (2006-11-17 14:20:00) [3]> Единицу прибавь :)
Вот таки не 1, а минимум 5, тогда конец колонки приливает к "№". Те по хорошему надо -7.
Игорь Шевченко (2006-11-16 23:49:00) [4]Kolan © (16.11.06 21:45) [20]
> Расчитало не верно - сильно обрезало.
Единицу прибавь :)
Мы похожей формулой пользовались для автоматических построений форм.
Kolan (2006-11-16 21:45:00) [5]Гм.. С такой таблицей:
№
1
Расчитало не верно - сильно обрезало.
Kolan (2006-11-16 21:29:00) [6]> Игорь Шевченко © (16.11.06 21:24)
Благодарствую. Пригодиттся :)
Игорь Шевченко (2006-11-16 21:24:00) [7]Наврал.
AveCharWidth := Grid.Canvas.TextWidth('0') - TM.tmOverhang + 4
Игорь Шевченко (2006-11-16 21:23:00) [8]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;
Примерно так.
Kolan (2006-11-16 20:22:00) [9]> Возможно, автор просто не знал о возможности (и необходимости)
> посчитать длину строки в пикселях.
Нет, это просто автар(я) ... :)
> Это равно средней ширине символа в гриде.
Это я понял :)
> Это сколько пикселей в байте в среднем
Как это подсчитать? -Вот что я не понял.. Самому? Вручную?
clickmaker (2006-11-16 17:01:00) [10]
> А она долго будет работать в этом случае
медленно, но верно :)
Игорь Шевченко (2006-11-16 17:00:00) [11]novill © (16.11.06 16:53) [13]
А она долго будет работать в этом случае. Проще посчитать один раз и передавать константу.
novill (2006-11-16 16:53:00) [12]> [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 16:49:00) [13]Kolan © (16.11.06 16:38) [11]
Это равно средней ширине символа в гриде. У Columns Width задается в Pixel-ях, сам понимаешь, Length считает в байтах. Это сколько пикселей в байте в среднем (ну или с запасом).
Kolan (2006-11-16 16:38:00) [14]> * AveCharWidth
Вот это чему равно/откуда берется?
Kolan (2006-11-16 16:37:00) [15]> [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:36:00) [16]Таки, спасибо. :)
Игорь Шевченко (2006-11-16 16:27:00) [17]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;
Игорь Шевченко (2006-11-16 16:18:00) [18]Плохиш © (16.11.06 15:59) [4]
Я так надеялся что следующий пост будет содержать "спасибо" :)
Kolan (2006-11-16 16:17:00) [19]> Оно ?
Вроде :)
Вот наваял..
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')
Kolan (2006-11-16 16:00:00) [20]Какой?
Гы, уже не угадал :)