![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Canvas.TextWidth вешает программу.
Kolan © (2007-02-05 14:58:00)Написал функцию для "подгонки" ширины столбцов StringGrid:
procedure TReportGrid.AdjustColWidth;
var
WidthArr: array of Integer;
I, J: Integer;
begin
with MainForm.ReportStringGrid do
begin
SetLength(WidthArr, ColCount);
for I := Low(WidthArr) to High(WidthArr) do
WidthArr[I] := 0;
for I := 0 to ColCount - 1 do
for J := 0 to Cols[I].Count - 1 do
if Canvas.TextWidth(Cols[I].Strings[J]) > WidthArr[I] then
WidthArr[I] := Canvas.TextWidth(Cols[I].Strings[J]);
for I := 0 to ColCount - 1 do
ColWidths[I] := WidthArr[I]+8;
end;
end;
Удивительным образом, когда идешь отладчиком, на выделеной строчке все останавливается.
Причем процессор не грузит, ничего. Как все равно что в занятую крит секцию попасть...
Почему?
ЗЫ
Есть подозрегие что глючит BDS.
ЗЗЫ
Утечек нет. ReportMemoryLeaks стоит.
ЮЮ (2007-02-06 13:48:00) [21]
> Кроме того так мигание заметно и вообще это изврат...
Мигание можно отключить. С TChart-ом же справился. А выравнивать грид на закладке, на которую возможно никто и не зайдет, - не изврат.
>Прочти пост [0].
Дебажить можно не только код, который не виснет (см.[0]), а и тот, где кажется, всё висит. Run Pause а затем Стек или Трассировка
Kolan (2007-02-06 13:43:00) [22]> переключиться на нужную закладку и затем перестроить грид
Кроме того так мигание заметно и вообще это изврат...
Kolan (2007-02-06 13:42:00) [23]> но продолжаешь биться об стену, не включая дебаггера.
Прочти пост [0].
ЮЮ (2007-02-06 13:41:00) [24]
> Они меня ругать будут :(
Тем более, что знаешь решение - переключиться на нужную закладку и затем перестроить грид - но продолжаешь биться об стену, не включая дебаггера.
Kolan (2007-02-06 13:23:00) [25]> ошибка операционной системы, значит можно облегченно ругать
> микрософт, потому что ошибка не в нас:))
> а в стиле текста не стоит fsitalic?
Ну думаю пользователям пофиг на майкрософт. Они меня ругать будут :(
Kolan (2007-02-06 13:23:00) [26]> MainForm.ReportStringGrid.Cols[I].St rings[J] и чем она
> лучше MainForm.ReportStringGrid.Cells[i,j]?
Ну так я написал. Согласен не очень:)
> MainForm.ReportStringGrid.Cols[I].Count
Опятьже я прохожусь по каждой колонке и по всем её ячейкам. Просто когда писал так думал про себя. И соответственно мыслям написал...
antonn (2007-02-06 13:18:00) [27]
> А что значит OSError ?
ошибка операционной системы, значит можно облегченно ругать микрософт, потому что ошибка не в нас:))
а в стиле текста не стоит fsitalic?
я прошу прощения за возможно идиотский вопрос, но что такое MainForm.ReportStringGrid.Cols[I].Count и чем оно лучше MainForm.ReportStringGrid.Rowcount? и что за конструкция MainForm.ReportStringGrid.Cols[I].St rings[J] и чем она лучше MainForm.ReportStringGrid.Cells[i,j]?
Kolan (2007-02-06 13:02:00) [28]А что значит OSError ?
Kolan (2007-02-06 13:02:00) [29]> Предполагается мне, что у тебя в Cells лажа какая-то. Запусти
> отладчик и не мучайся
Там '№' - это показывает отладчик;
При заполнении грида(до того как происходит выравнивание) это значек берется из
resourcestring
rsNumber = '№';
Пробовал другие символы. Например '#' и 'w'. Результат тот же.
У грида есть заголовок( FixedCols = 1 ) если это имеет какое-то значение...
Игорь Шевченко (2007-02-06 12:53:00) [30]Kolan © (06.02.07 11:48) [35]
Предполагается мне, что у тебя в Cells лажа какая-то. Запусти отладчик и не мучайся
Kolan (2007-02-06 11:57:00) [31]> ээээээ, а это то зачем?:
[1]
Separator (2007-02-06 11:57:00) [32]ээээээ, а это то зачем?:
PageIndex: Integer;
PageIndex := MainForm.PageControl.ActivePageIndex;
MainForm.PageControl.ActivePageIndex := 1;
MainForm.PageControl.ActivePageIndex := PageIndex;
Kolan (2007-02-06 11:56:00) [33]> лучше замени на Cells[I, J]
Заменил. Все попрежнему :(
Kolan (2007-02-06 11:48:00) [34]О новости :)
Так как от выбранного таба зависит глюк написал вот так:
procedure TReportGrid.AdjustColWidth;
var
I, J: Integer;
W: Integer;
PageIndex: Integer;
begin
PageIndex := MainForm.PageControl.ActivePageIndex;
MainForm.PageControl.ActivePageIndex := 1;
for I := 0 to MainForm.ReportStringGrid.ColCount - 1 do
begin
W := 0;
for J := 0 to MainForm.ReportStringGrid.Cols[I].Count - 1 do
if MainForm.ReportStringGrid.Canvas.TextExtent(MainForm.ReportStringGrid.Cols[I].St rings[J]).cx > W then
W := MainForm.ReportStringGrid.Canvas.TextWidth(MainForm.ReportStringGrid.Cols[I].Str ings[J]);
MainForm.ReportStringGrid.ColWidths[I] := W + 8;
end;
MainForm.PageControl.ActivePageIndex := PageIndex;
end;
И при выходе получаю:
EOSError
System Error. Code 1400
Недопустимый дискриптор окна
ЮЮ (2007-02-06 11:40:00) [35]if Canvas.TextWidth (Cols[I].Strings[J]) > WidthArr[I]
лучше замени на Cells[I, J] ибо от сообщения об ошибке тебя спасает только отсутсвие проверки выхода за диапазоны массивов :)
Kolan (2007-02-06 11:39:00) [36]> а ты убери with - и сам не запутаешься и других не запутаешь
ОК.
procedure TReportGrid.AdjustColWidth;
var
I, J: Integer;
W: Integer;
begin
for I := 0 to MainForm.ReportStringGrid.ColCount - 1 do
begin
W := 0;
for J := 0 to MainForm.ReportStringGrid.Cols[I].Count - 1 do
if MainForm.ReportStringGrid.Canvas.TextExtent(MainForm.ReportStringGrid.Cols[I].St rings[J]).cx > W then
W := MainForm.ReportStringGrid.Canvas.TextWidth(MainForm.ReportStringGrid.Cols[I].Str ings[J]);
MainForm.ReportStringGrid.ColWidths[I] := W + 8;
end;
end;
Глюк остался :(
Игорь Шевченко (2007-02-06 11:33:00) [37]
> Зы
> К проблеме это как относится?
а ты убери with - и сам не запутаешься и других не запутаешь
ЮЮ (2007-02-06 11:29:00) [38]
>
> К проблеме это как относится?
К разговору на разных языках. Когда я вижу
procedure TReportGrid.AdjustColWidth;
я полагаю совсем не то, что ты написал в [28]. Как и ты в [28] не понял о чем это я :)
Тогда отладчит к руки - и вперед. Ибо у тех, о ком у нас столь противоречивое мнение, всё работет. См.[23]
Kolan (2007-02-06 11:16:00) [39]> Каждому компоненту в проекте - по обертке? Круто! Не жирно?
>
Не не жирно и круто. Так как я делаю оберкту на компонентам а блокам интерфейса. Например блок "диапазон" - 5 эдитов 1 лэйбл и 1 чекбокс. И метод, например, "получить диапазон". Этот метод и проверит его на корректность и пользователя уведомит если что не так.
Обычные парни пишут так
Ну и пусть пишут. А потом форма-свалка х. знает чего...
Зы
К проблеме это как относится?
ЮЮ (2007-02-06 11:10:00) [40]
> И к томуже классы работают с обертками и ничего не знают
> от формах.
MainForm.ReportStringGrid - ну просто ничего не знаем о форме MainForm.
Каждому компоненту в проекте - по обертке? Круто! Не жирно? Обычные парни пишут так:
procedure TForm1.AdjustColWidth(Grid: TStringGrid);
или
procedure AdjustColWidth(Grid: TStringGrid);
и в качестве параметра передают нужный грид. В этом случае метод формы (процедура) действительно могут применены к любому TStringGrid-у, а именно к тому, что указан в параметрах