Форум: "Основная";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Вниз
Canvas.TextWidth вешает программу. Найти похожие ветки
← →
Kolan © (2007-02-05 14:58) [0]Написал функцию для "подгонки" ширины столбцов 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 стоит.
← →
Kolan © (2007-02-05 15:06) [1]Причем у мнея есть PageControl. И вот если при вызове соотв функции открыта страница на которой лежит Grid, то все o"кей. А если другая, то зависает.. Что за нах.
← →
Kolan © (2007-02-05 15:11) [2]Хм, записал проблемную строчку в Watches. И Watches тоже повисло :), совсем.
← →
Loginov Dmitry © (2007-02-05 15:48) [3]> for I := Low(WidthArr) to High(WidthArr) do
> WidthArr[I] := 0;
Бесполезный код часто вешает программу :)))
← →
Kolan © (2007-02-05 15:49) [4]> Бесполезный код часто вешает программу :)))
Обрати внимание на вопрос.
ЗЫ
Может я параноик.
← →
Loginov Dmitry © (2007-02-05 15:52) [5]А если убрать
ColWidths[I] := WidthArr[I]+8;
???
← →
Loginov Dmitry © (2007-02-05 15:57) [6]Как понимать:
procedure TReportGrid.AdjustColWidth;
...
with MainForm.ReportStringGrid do
...
???
← →
Kolan © (2007-02-05 16:01) [7]> А если убрать
> ColWidths[I] := WidthArr[I]+8;
Ты издеваешься?
До этого места дело не доходит(проверил) :)
← →
Kolan © (2007-02-05 16:17) [8]> procedure TReportGrid.AdjustColWidth;
> ...
> with MainForm.ReportStringGrid do
Понимать так:
TReportGrid - просто класс, который управляет Гридом(ReportStringGrid)лежащим на форме(MainForm).
Просто класс занчит наследаник TObject:TReportGrid = class
private
Когда мне надо выровнять колонки я прошу экземпляр TReportGrid: "Выравняй колонки грида"(AdjustColWidth).
А он выравнивает :)
← →
Loginov Dmitry © (2007-02-05 16:20) [9]> Когда мне надо выровнять колонки я прошу экземпляр TReportGrid:
> "Выравняй колонки грида"(AdjustColWidth).
Хорошо хоть не телепатией им управляешь :)
← →
Kolan © (2007-02-05 16:26) [10]> Хорошо хоть не телепатией им управляешь :)
Чем пихать все в форму лучьше так.
А по делу есть что-нибудь :)?
← →
Loginov Dmitry © (2007-02-05 16:42) [11]> А по делу есть что-нибудь
Код работает. Так что все ОК!
:)))
← →
Kolan © (2007-02-05 16:47) [12]> Код работает. Так что все ОК!
Да я знаю что работает. Колько невсегда. Может с TextExtent получится :(
← →
RASkov (2007-02-05 16:49) [13]> [1] Kolan © (05.02.07 15:06)
> Причем у мнея есть PageControl. И вот если при вызове соотв
> функции открыта страница на которой лежит Grid, то все o"кей.
> А если другая, то зависает..
Ну вызывать соотв функцию только на открытых страницах....
← →
umbra © (2007-02-05 17:16) [14]
> with MainForm.ReportStringGrid do
> begin
> {........................}
> if Canvas.TextWidth(Cols[I].Strings[J]) > WidthArr[I]
> {..........................}
>
а какой Canvas может быть у наследника TObject?
← →
Kolan © (2007-02-05 17:18) [15]>
> Ну вызывать соотв функцию только на открытых страницах....
Ну это уже ... изврат.
Страниц всего две грубоговоря. На второй лежит грид. Когда появляются новые данные, они отображаются на гриде, а потом погдоняются колоночки.
← →
Kolan © (2007-02-05 17:20) [16]> а какой Canvas может быть у наследника TObject?
Вот это:
with MainForm.ReportStringGrid do
> begin
> {........................}
> if Canvas.TextWidth(Cols[I].Strings[J]) > WidthArr[I]
Означает:MainForm.ReportStringGrid.Canvas.TextWidth(MainForm.ReportStringGrid.Cols[ I].Strings[J]) > WidthArr[I]
Те это канва грида.
← →
Ega23 © (2007-02-05 18:20) [17]
> Означает:
> MainForm.ReportStringGrid.Canvas.TextWidth(MainForm.ReportStringGrid.
> Cols[ I].Strings[J]) > WidthArr[I]
>
> Те это канва грида.
>
Какой класс у ReportStringGrid и есть ли у него в public|published TCanvas?
Если нет, то реально ты обращаешься к канвасу формы.
← →
Комбинатор (2007-02-05 18:58) [18]
> Какой класс у ReportStringGrid и есть ли у него в public|published
> TCanvas?
> Если нет, то реально ты обращаешься к канвасу формы.
Какой бы ни был грид - У него есть канва)
← →
Loginov Dmitry © (2007-02-05 19:15) [19]Может у ReportStringGrid свойство Parent где-то обнуляется?
← →
Kolan © (2007-02-05 20:14) [20]«ReportStringGrid»
Это TStringGrid. TCanvas там есть :)
Да и компилятор бы не пропустил. + Я же пробовал как в [16] полностью в Watch посмотреть. Тоже повисло…
«Может у ReportStringGrid свойство Parent где-то обнуляется?»
Да нет недолжно. А к чему это может привести? Только завтра проверить смогу…
← →
Loginov Dmitry © (2007-02-05 20:47) [21]> А к чему это может привести?
Канва глючить будет, работать с ней будет невозможно.
← →
Kolan © (2007-02-05 20:56) [22]«[21] Loginov Dmitry © (05.02.07 20:47)
> А к чему это может привести?
Канва глючить будет, работать с ней будет невозможно.»
Сам то я этого точно не делаю. Тк все создано в дизайн тайме. Лана завтра проверю…
← →
Separator © (2007-02-06 10:22) [23]С обычным гридом все работает:
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, w: integer;
begin
with StringGrid1 do begin
for i:= 0 to ColCount - 1 do begin
w:= 0;
for j:= 0 to RowCount - 1 do
if Canvas.TextWidth(Cells[i, j]) > w then
w:= Canvas.TextWidth(Cells[i, j]);
ColWidths[i]:= w + 8
end
end
end;
← →
Kolan © (2007-02-06 10:27) [24]> Может у ReportStringGrid свойство Parent где-то обнуляется?
Не не обнуляется.
С TextExtent тоже самое - зависает.
:(
← →
Kolan © (2007-02-06 10:28) [25]> С обычным гридом все работает:
Так и у меня тоже обычный грид :(
← →
Kolan © (2007-02-06 10:34) [26]Separator © (06.02.07 10:22)
Да так попроще :), переделал, массив убрал, всеравно непашет :(
← →
ЮЮ © (2007-02-06 10:35) [27]
> Написал функцию для "подгонки" ширины столбцов StringGrid:
procedure TReportGrid.AdjustColWidth;
Это больше похоже на метод какого-то класса, коим MainForm.ReportStringGrid похоже и является. Но в методе классс написать такое !!!procedure TReportGrid.AdjustColWidth;
var
WidthArr: array of Integer;
I, J: Integer;
begin
with MainForm.ReportStringGrid do
begin
Может в методе класса работать со своим канвасом, а не с мистическим MainForm.ReportStringGrid?
← →
Kolan © (2007-02-06 10:43) [28]> Может в методе класса работать со своим канвасом
Непонял? В методе какого класса? Поясните?
Идея все го этого такая:
На форме я как обычно делаю интерфейс. Например положил эдит.
И есть модуль - оболочек. Допустим на этот эдит я хочу выводить информацию.
Значит оболочка такая:TMyEdit = class
public
procedure Write(S);
end;
//
procedure TMyEdit.Write(S);
begin
MaimForm.Edit1.Text := S;
end;
Также и с гридом.
Так имхо удобнее так как работа с интерфейсом(всякие проверки, итд) лежит в этом модуле-оберток..
И к томуже классы работают с обертками и ничего не знают от формах. например в методе Write(S); я могу выводить не только в эдит, но показатьShowMessage
и все что угодно..
← →
ЮЮ © (2007-02-06 11:10) [29]
> И к томуже классы работают с обертками и ничего не знают
> от формах.
MainForm.ReportStringGrid - ну просто ничего не знаем о форме MainForm.
Каждому компоненту в проекте - по обертке? Круто! Не жирно? Обычные парни пишут так:
procedure TForm1.AdjustColWidth(Grid: TStringGrid);
или
procedure AdjustColWidth(Grid: TStringGrid);
и в качестве параметра передают нужный грид. В этом случае метод формы (процедура) действительно могут применены к любому TStringGrid-у, а именно к тому, что указан в параметрах
← →
Kolan © (2007-02-06 11:16) [30]> Каждому компоненту в проекте - по обертке? Круто! Не жирно?
>
Не не жирно и круто. Так как я делаю оберкту на компонентам а блокам интерфейса. Например блок "диапазон" - 5 эдитов 1 лэйбл и 1 чекбокс. И метод, например, "получить диапазон". Этот метод и проверит его на корректность и пользователя уведомит если что не так.
Обычные парни пишут так
Ну и пусть пишут. А потом форма-свалка х. знает чего...
Зы
К проблеме это как относится?
← →
ЮЮ © (2007-02-06 11:29) [31]
>
> К проблеме это как относится?
К разговору на разных языках. Когда я вижу
procedure TReportGrid.AdjustColWidth;
я полагаю совсем не то, что ты написал в [28]. Как и ты в [28] не понял о чем это я :)
Тогда отладчит к руки - и вперед. Ибо у тех, о ком у нас столь противоречивое мнение, всё работет. См.[23]
← →
Игорь Шевченко © (2007-02-06 11:33) [32]
> Зы
> К проблеме это как относится?
а ты убери with - и сам не запутаешься и других не запутаешь
← →
Kolan © (2007-02-06 11:39) [33]> а ты убери 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:40) [34]if Canvas.TextWidth(Cols[I].Strings[J]) > WidthArr[I]
лучше замени на Cells[I, J] ибо от сообщения об ошибке тебя спасает только отсутсвие проверки выхода за диапазоны массивов :)
← →
Kolan © (2007-02-06 11:48) [35]О новости :)
Так как от выбранного таба зависит глюк написал вот так: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
Недопустимый дискриптор окна
← →
Kolan © (2007-02-06 11:56) [36]> лучше замени на Cells[I, J]
Заменил. Все попрежнему :(
← →
Separator © (2007-02-06 11:57) [37]ээээээ, а это то зачем?:
PageIndex: Integer;
PageIndex := MainForm.PageControl.ActivePageIndex;
MainForm.PageControl.ActivePageIndex := 1;
MainForm.PageControl.ActivePageIndex := PageIndex;
← →
Kolan © (2007-02-06 11:57) [38]> ээээээ, а это то зачем?:
[1]
← →
Игорь Шевченко © (2007-02-06 12:53) [39]Kolan © (06.02.07 11:48) [35]
Предполагается мне, что у тебя в Cells лажа какая-то. Запусти отладчик и не мучайся
← →
Kolan © (2007-02-06 13:02) [40]> Предполагается мне, что у тебя в Cells лажа какая-то. Запусти
> отладчик и не мучайся
Там "№" - это показывает отладчик;
При заполнении грида(до того как происходит выравнивание) это значек берется изresourcestring
rsNumber = "№";
Пробовал другие символы. Например "#" и "w". Результат тот же.
У грида есть заголовок( FixedCols = 1 ) если это имеет какое-то значение...
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.039 c