Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 посмотреть. Тоже повисло&#133


«Может у ReportStringGrid свойство Parent где-то обнуляется?»

Да нет недолжно. А к чему это может привести? Только завтра проверить смогу&#133


 
Loginov Dmitry ©   (2007-02-05 20:47) [21]

> А к чему это может привести?


Канва глючить будет, работать с ней будет невозможно.


 
Kolan ©   (2007-02-05 20:56) [22]

«[21] Loginov Dmitry ©   (05.02.07 20:47)
> А к чему это может привести?

Канва глючить будет, работать с ней будет невозможно.»

Сам то я этого точно не делаю. Тк все создано в дизайн тайме. Лана завтра проверю&#133


 
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
2-1173983823
bagos
2007-03-15 21:37
2007.04.08
stringgrid и listbox


2-1174385675
Adios
2007-03-20 13:14
2007.04.08
URL


15-1173862097
Галинка
2007-03-14 11:48
2007.04.08
Как в Visio перегнать структуру проекта


2-1173899922
Василиус
2007-03-14 22:18
2007.04.08
Добрый ночер


15-1173711497
Kerk
2007-03-12 17:58
2007.04.08
Perl





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский