Форум: "Основная";
Текущий архив: 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 формах. :)
«а не о наличии нескольких стратегий»
Стратегии привел чтобы было понятно, что объект напрямую недоступен.
Да спорить неохота дальше. Решение неплохое имхо…
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.069 c