Форум: "Начинающим";
Текущий архив: 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