Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Canvas.TextWidth вешает программу.


Страницы:   1 2 3 4

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 стоит.


Kolan   (2007-02-06 10:43:00) [41]

> Может в методе класса работать со своим канвасом

Непонял? В методе какого класса? Поясните?

Идея все го этого такая:
На форме я как обычно делаю интерфейс. Например положил эдит.
И есть модуль - оболочек. Допустим на этот эдит я хочу выводить информацию.
Значит оболочка такая:
TMyEdit = class
public
 procedure Write(S);
end;
//
procedure TMyEdit.Write(S);
begin
 MaimForm.Edit1.Text := S;
end;


Также и с гридом.

Так имхо удобнее так как работа с интерфейсом(всякие проверки, итд) лежит в этом модуле-оберток..
И к томуже классы работают с обертками и ничего не знают от формах. например в методе Write(S);я могу выводить не только в эдит, но показать ShowMessageи все что угодно..


ЮЮ   (2007-02-06 10:35:00) [42]


> Написал функцию для "подгонки" ширины столбцов StringGrid:
procedure TReportGrid.AdjustColWidth;

Это больше похоже на метод какого-то класса, коим MainForm.ReportStringGrid похоже и является. Но в методе классс написать такое !!!

procedure TReportGrid.AdjustColWidth;
var
WidthArr: array of Integer;
I, J: Integer;
begin
with MainForm.ReportStringGriddo
begin


Может в методе класса работать со своим канвасом, а не с мистическим MainForm.ReportStringGrid?


Kolan   (2007-02-06 10:34:00) [43]

Separator ©   (06.02.07 10:22)
Да так попроще :), переделал, массив убрал, всеравно непашет :(


Kolan   (2007-02-06 10:28:00) [44]

> С обычным гридом все работает:

Так и у меня тоже обычный грид :(


Kolan   (2007-02-06 10:27:00) [45]

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

Не не обнуляется.
С TextExtent тоже самое - зависает.
:(


Separator   (2007-02-06 10:22:00) [46]

С обычным гридом все работает:
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-05 20:56:00) [47]

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

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

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


Loginov Dmitry   (2007-02-05 20:47:00) [48]

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


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


Kolan   (2007-02-05 20:14:00) [49]

«ReportStringGrid»

Это TStringGrid. TCanvas там есть :)
Да и компилятор бы не пропустил. + Я же пробовал как в [16] полностью в Watch посмотреть. Тоже повисло…


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

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


Loginov Dmitry   (2007-02-05 19:15:00) [50]

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


Комбинатор   (2007-02-05 18:58:00) [51]


> Какой класс у ReportStringGrid и есть ли у него в public|published
> TCanvas?
> Если нет, то реально ты обращаешься к канвасу формы.

Какой бы ни был грид - У него есть канва)


Ega23   (2007-02-05 18:20:00) [52]


> Означает:
> MainForm.ReportStringGrid.Canvas.TextWidth(MainForm.ReportStringGrid.
> Cols[ I].Strings[J]) > WidthArr[I]
>
> Те это канва грида.
>


Какой класс у ReportStringGrid и есть ли у него в public|published TCanvas?
Если нет, то реально ты обращаешься к канвасу формы.


Kolan   (2007-02-05 17:20:00) [53]

> а какой 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]

Те это канва грида.


Kolan   (2007-02-05 17:18:00) [54]

>
> Ну вызывать соотв функцию только на открытых страницах....

Ну это уже ... изврат.
Страниц всего две грубоговоря. На второй лежит грид. Когда появляются новые данные, они отображаются на гриде, а потом погдоняются колоночки.


umbra   (2007-02-05 17:16:00) [55]


>  with MainForm.ReportStringGrid do
>  begin
>    {........................}
>        if Canvas.TextWidth(Cols[I].Strings[J]) > WidthArr[I]
>  {..........................}
>

а какой Canvas может быть у наследника TObject?


RASkov   (2007-02-05 16:49:00) [56]

> [1] Kolan ©   (05.02.07 15:06)


> Причем у мнея есть PageControl. И вот если при вызове соотв
> функции открыта страница на которой лежит Grid, то все o'кей.
> А если другая, то зависает..

Ну вызывать соотв функцию только на открытых страницах....


Kolan   (2007-02-05 16:47:00) [57]

> Код работает. Так что все ОК!

Да я знаю что работает. Колько невсегда. Может с TextExtent получится :(


Loginov Dmitry   (2007-02-05 16:42:00) [58]

> А по делу есть что-нибудь


Код работает. Так что все ОК!
:)))


Kolan   (2007-02-05 16:26:00) [59]

> Хорошо хоть не телепатией им управляешь :)

Чем пихать все в форму лучьше так.
А по делу есть что-нибудь :)?


Loginov Dmitry   (2007-02-05 16:20:00) [60]

> Когда мне надо выровнять колонки я прошу экземпляр TReportGrid:
> "Выравняй колонки  грида"(AdjustColWidth).


Хорошо хоть не телепатией им управляешь :)


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо