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


ЮЮ   (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-у, а именно к тому, что указан в параметрах


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

Наверх

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