Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

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 ) если это имеет какое-то значение...


 
Kolan ©   (2007-02-06 13:02) [41]

А что значит OSError ?


 
antonn ©   (2007-02-06 13:18) [42]


> А что значит 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:23) [43]

> MainForm.ReportStringGrid.Cols[I].St rings[J] и чем она
> лучше MainForm.ReportStringGrid.Cells[i,j]?

Ну так я написал. Согласен не очень:)


> MainForm.ReportStringGrid.Cols[I].Count

Опятьже я прохожусь по каждой колонке и по всем её ячейкам. Просто когда писал так думал про себя. И соответственно мыслям написал...


 
Kolan ©   (2007-02-06 13:23) [44]

> ошибка операционной системы, значит можно облегченно ругать
> микрософт, потому что ошибка не в нас:))
> а в стиле текста не стоит fsitalic?

Ну думаю пользователям пофиг на майкрософт. Они меня ругать будут :(


 
ЮЮ ©   (2007-02-06 13:41) [45]


> Они меня ругать будут :(


Тем более, что знаешь решение - переключиться на нужную закладку и затем перестроить грид - но продолжаешь биться об стену, не включая дебаггера.


 
Kolan ©   (2007-02-06 13:42) [46]

> но продолжаешь биться об стену, не включая дебаггера.

Прочти пост [0].


 
Kolan ©   (2007-02-06 13:43) [47]

> переключиться на нужную закладку и затем перестроить грид

Кроме того так мигание заметно и вообще это изврат...


 
ЮЮ ©   (2007-02-06 13:48) [48]


> Кроме того так мигание заметно и вообще это изврат...


Мигание можно отключить. С TChart-ом же справился. А выравнивать грид на закладке, на которую возможно никто и не зайдет, - не изврат.

>Прочти пост [0].
Дебажить можно не только код, который не виснет (см.[0]), а и тот, где кажется, всё висит. Run Pause а затем Стек или Трассировка


 
Kolan ©   (2007-02-06 13:49) [49]

procedure TReportGrid.AdjustColWidth(Grid: TStringGrid);
var
 I, J: Integer;
 W: Integer;
begin
   for I := 0 to Grid.ColCount - 1 do
   begin
     W := 0;
     for J := 0 to Grid.RowCount - 1 do
       if Grid.Canvas.TextWidth(Grid.Cells[I,J]) > W then
         W := Grid.Canvas.TextWidth(Grid.Cells[I, J]);
     Grid.ColWidths[I] := W + 8;
     end;
end;


Всеравно неработает.


 
Kolan ©   (2007-02-06 13:57) [50]

> А выравнивать грид на закладке, на которую возможно никто
> и не зайдет,

А в смысли пре переключении на закладку выравнивать - это наверно сработает.

С TChart-ом же справился
Вот оказалось что не совсем :) См топик...


> Run Pause а затем Стек или Трассировка

Ты меня сделал :) Я ниче не понимаю в CPU окне.

Я шас попробовал.
Написано ntdll.KiFastSystemCallRect на этом месте стоит стелка.
Иду далее а далее попадаю в код потока(дополнительного) который что-то там делает..

А потом process is not accessible. А в CPU окне ------.
Наверно это значит что поток termianted.


 
Kolan ©   (2007-02-06 14:01) [51]

> А выравнивать грид на закладке, на которую возможно никто
> и не зайдет,

Как и ожидалось все работает.
Только получается раньше я выравнивал при загрузке данных в грид, а теперь при каждом перекключении, но наверно это легко решится с помошью флага.

Однако суть проблемы неясна...


 
Kolan ©   (2007-02-06 14:05) [52]

Так а что делать если пользовыатель смотрит на Таб с гридом?
Получается колонки не выровнятся пока он туда сюда не переключит...


 
Kolan ©   (2007-02-06 14:17) [53]

Сделал так:
if MainForm.Canvas.TextWidth(Cells[I, J]) > W then
И работает. Что-то не так с канвой грида :(.
Все-равно результат одинаковы...


 
Loginov Dmitry ©   (2007-02-06 17:54) [54]

Создай TBitmap, скопируй в него свойства канвы с грида и не мучайся. Видимо канва глючит именно из-за того, что Грид закрывается другой вкладкой.


 
GrayFace ©   (2007-02-06 21:41) [55]

Separator ©   (06.02.07 10:22) [23]
Лучше
procedure TForm1.Button1Click(Sender: TObject);
var
  i, j, w: integer;
begin
  with StringGrid1 do
      for i:= 0 to ColCount - 1 do
      begin
          w:= 0;
          for j:= 0 to RowCount - 1 do
              w:= max(w, Canvas.TextWidth(Cells[i, j]));
          ColWidths[i]:= w + 8;
      end;
end;


 
Kolan ©   (2007-02-06 23:22) [56]

«Лучше»

Чем же ?


 
Kolan ©   (2007-02-07 09:50) [57]

Видимо это Чарт сволочь.
Установил Про Чарт. В итоге:
1. Он изгадил хелп. Если чарт лежит и на жать Ф1, то появляется сранное окно со списком тем, но клик по ним не к чему не приводит.

2. Он выснет, сам чарт. Остальная прогармма работает :)

3. И вот это.

ЗЫ
 Надо видимо все снести...


 
GrayFace ©   (2007-02-08 18:06) [58]

Kolan ©   (06.02.07 23:22) [56]
Чем же ?

Canvas.TextWidth(Cells[i, j]) дважды не вычисляется. И красивее.

Kolan ©   (07.02.07 9:50) [57]
Надо видимо все снести...

И отформатировать диск %)


 
Apollon604   (2007-02-08 18:58) [59]


> with MainForm.ReportStringGrid do


Завязывай с такими "обертками" - класс не должен знать имена объектов, которые его используют... И вообще, для таких целей нормальные люди используют процедуры обычные.


 
GrayFace ©   (2007-02-09 01:26) [60]

Вместо оберток можно методы в public формы разбивать по группам и перед группой делать коммент.


 
GrayFace ©   (2007-02-09 01:27) [61]

Точнее, не можно, а нужно.


 
Kolan ©   (2007-02-09 09:46) [62]

> [61] GrayFace ©   (09.02.07 01:27)
> Точнее, не можно, а нужно.

Блин, хотел промолчать...ну ладно.

Итак допустим Имеем паттерн стратегия. Есть 3 класса ТА и ТВ - стратегии, ТС - класс, который позволяет выбрать одну из них.

Те доступ к стратегии осушествляется только через экземпляр ТС.

Допустим стратегия выполняя работу должна уведомить пользователя, написав строку с сообщением в Эдите и в РичЭдите.

Мой вариант:
Делаю обертку
ТОбертка = класс
 процедура ДобавитьСообщение(С: строка);
энд;


В нутри ДобавитьСообщение записываю строку в Эдит и РичЭдит.

Те стратегии знают только об обертке и пользуются её методом ДобавитьСообщение.

Ваше решение?

ЗЫ
группам и перед группой делать коммент.
Прочтите Фаулера про "запахи в коде". Комментарии там на первом месте.


 
Kolan ©   (2007-02-09 11:50) [63]

> GrayFace ©

Ну дык какие предложения?


 
Apollon604   (2007-02-09 13:39) [64]


> Kolan ©   (09.02.07 11:50) [63]
> > GrayFace ©Ну дык какие предложения?



interface

type

 TMessageCallBack = procedure(AMessage: String) of Object;

 TA = class
 private
   fMesCallBack: TMessageCallBack;
   ...
 public
   procedure Run;
   property MessageCallBack: TMessageCallBack read fMesCallBack write fMesCallBack;
   ...
 end;

 TB = class
 private
   fMesCallBack: TMessageCallBack;
   ...
 public
   procedure Run;
   property MessageCallBack: TMessageCallBack read fMesCallBack write fMesCallBack;
   ...
 end;

 TC = class
 private
   fA: TA;
   fB: TB;
   procedure FieldMessageCallBack(AMessage: String);
   ...
 public
   constructor Create;
   destructor Destroy;
   ...
 end;

implementation

{ TA }

procedure TA.Run;
begin
 ...
 if Assigned(fMesCallBack) then
   fMesCallBack("DCAB");
 ...
end;

{ TB }

procedure TB.Run;
begin
 ...
 if Assigned(fMesCallBack) then
   fMesCallBack("DCAB");
 ...
end;

{ TC }

constructor TC.Create;
begin
 fA := TA.Create;
 fA.MessageCallBack := FieldMessageCallBack;

 fB := TB.Create;
 fB.MessageCallBack := FieldMessageCallBack;
 ...
end;

destructor TC.Destroy;
begin
 fA.Free;
 fB.Free;
 ...
end;

procedure TC.FieldMessageCallBack(AMessage: String);
begin
 SomeEdit.Text := AMessage;
end;


В твоем случае TC - это и есть твоя главная форма. TA и TB ничего о ней не знают, а знают толко, что в определенный момент они должны передать сообщение в MessageCallBack.


 
Kolan ©   (2007-02-09 15:54) [65]

procedure TC.FieldMessageCallBack(AMessage: String);
begin
SomeEdit.Text := AMessage;
end;


Вот где вся суть разговора. Про существование событий я ессно в курсе.

SomeEdit.Text := AMessage;
Говорит о том, что модуль с TC знает о форме. Кроме того я хотел не просто добавить строку в эдит, а еще доавить
её в РичЭдит, да еще было бы неплохо подкрасить её.

И по твоему бедный переключатель стратегий(ТС) будет в себе содержать всю эту левую дрянь(типа функция изменения цвета итд).

А я предлогаю делать тоже самое + всю работу с интерфейсом скрывать за оберткой.

Итого:
У тебя:
procedure TC.FieldMessageCallBack(AMessage: String);
begin
SomeEdit.Text := AMessage;
RichEdit.Lines.Add(AMessage);
{Алгоритм раскрашивания этой строки в красный цвет. Это как пример.}
{А может я захочу еще BaloonTip показать. Тоже все тут.}
end;


У меня:
procedure TC.FieldMessageCallBack(AMessage: String);
begin
 UIInfoBlock.Add(AMessge);
end;


Способ отображения скрыт за оберткой. Какой бы сложный он небыл он всеь там.

А если теперь представить, что несколько объектов могут выводить эту строку. То тебе придется каждый раз этот вывод делать(в итоге duplicate code).
А у меня все в 1 месте. кому надо тот и вызывает...

ЗЫ
 Благодарю за спор :). выходит незря я так делаю... :)


 
Kolan ©   (2007-02-09 15:55) [66]

> SomeEdit.Text := AMessage;
> Говорит о том, что модуль с TC знает о форме.

Вот еще довод:

А если бы я еще в 10 форм выводил.
У тебя их все тоже поключать пришлось.

У меня как был 1 модуль с оберткой подключен так и осталось....


 
GrayFace ©   (2007-02-10 12:09) [67]

Kolan ©   (09.02.07 9:46) [62]
Прочтите Фаулера про "запахи в коде".

"Рефакторинг: улучшение существующего кода"?

Kolan ©   (09.02.07 9:46) [62]
Комментарии там на первом месте.

Конечно, бессмысленные комментарии - большое зло, но к предлагаемым они не имеют никакого отношения. А вот обращение к глобальной переменной Form1 явно ухудшает "запах" кода.

Kolan ©   (09.02.07 15:54) [65]
Говорит о том, что модуль с TC знает о форме.

А сделать FieldMessageCallBack методом формы?
Но изначально ты (давай уж на ты) говорил, что выделяешь логически связанные операции в один класс, а не о наличии нескольких стратегий.


 
Kolan ©   (2007-02-10 15:54) [68]

«Но изначально ты (давай уж на ты) говорил, что выделяешь
логически связанные операции в один класс, а не о наличии
нескольких стратегий.»

Изначально вопрос другой вообще был.

«„Рефакторинг: улучшение существующего кода“?»

Угу


«А вот обращение к глобальной переменной Form1 явно ухудшает „запах“ кода.»

Наверно обращение к синглетону вообще грех :)


«А сделать FieldMessageCallBack методом формы?»

А что будешь делать если надо на 10 формах отобразить? Кто то все равно будет знать о всех 10 формах. :)


«а не о наличии нескольких стратегий»

Стратегии привел чтобы было понятно, что объект напрямую недоступен.

Да спорить неохота дальше. Решение неплохое имхо&#133



Страницы: 1 2 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.67 MB
Время: 0.033 c
1-1171273611
hex1287
2007-02-12 12:46
2007.04.08
Как перекрыть конструктор, если он не виртуальный?


15-1173978662
Vendict
2007-03-15 20:11
2007.04.08
Подскажите программу.


15-1173986770
Kerk
2007-03-15 22:26
2007.04.08
Выращивание роз


15-1174075693
SkySpeed
2007-03-16 23:08
2007.04.08
MathCad - трабл при запуске................. как решить проблему?


15-1173552340
Loginov Dmitry
2007-03-10 21:45
2007.04.08
GALA