Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Вниз

Canvas.TextWidth вешает программу.   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.6 MB
Время: 0.069 c
2-1173314268
Wind
2007-03-08 03:37
2007.04.08
В несколько колонок


1-1171298579
Vid0g
2007-02-12 19:42
2007.04.08
Добавление/Извлечение ресурсов в программе


15-1173878618
zdm
2007-03-14 16:23
2007.04.08
проверка MaskEdit на пустое значение


15-1173698830
vasIZmax
2007-03-12 14:27
2007.04.08
FOR or WHILE


15-1173901069
default
2007-03-14 22:37
2007.04.08
Alcohol52%





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский