主页

论坛:“主要”;
当前存档:2002.01.08;
下载:[xml.tar.bz2];
向下

Не рисуется компонента, и все тут... 找到类似的分支


亚历山大(2001-12-18 13:03) [0]

亲爱的同事们!
Понадобилось это мне создать компоненту. Создал, породив от TGraphicControl. Ставлю на форму - все в порядке, проперти видны, но вот не рисуется, и все тут... Код таков

类型
TWayTree = class(TGraphicControl)
私立
...
保护
procedure Paint;override;
公开
constructor Create(AOwner : TComponent);
出版
...
property Color default clWhite;
property Visible default true;
结束;

procedure Register;

履行

procedure TWayTree.Paint;
VAR
ARect : TRect;
开始
Inherited;
Canvas.Brush.Color:=Color;
ARect.Left:=Left;
ARect.Top:=Top;
ARect.Bottom:=Top+Height;
ARect.Right:=Left+Width;
Canvas.FillRect(ARect)
结束;

constructor TWayTree.Create;
开始
Inherited Create(AOwner);
...
结束;

procedure Register;
开始
RegisterComponents("WayTrees", [TWayTree])
结束;

结束。

Мало того, когда я еще пытаюсь добавить свойства FPen и FBrush (для отдельного доступа в дизайн-тайме):

TWayTree = class(TGraphicControl)
私立
FPen : TPen;
FBrush : TBrush;
procedure RePaintRequest(Sender : TObject);
procedure SetBrush(Value : TBrush);
procedure SetPen(Value : TPen);
保护
procedure Paint;override;
公开
constructor Create(AOwner : TComponent);
destructor Destroy;
出版
property Color default clWhite;
property Visible;
property Brush : TBrush read FBrush write SetBrush;
property Pen : TPen read FPen write SetPen;
结束;

procedure Register;

履行

procedure TWayTree.Paint;
VAR
ARect : TRect;
开始
Inherited;
Canvas.Pen:=FPen;
Canvas.Brush:=FBrush;
Canvas.Brush.Color:=Color;
ARect.Left:=Left;
ARect.Top:=Top;
ARect.Bottom:=Top+Height;
ARect.Right:=Left+Width;
Canvas.FillRect(ARect);
Canvas.TextOut(ARect.Left,ARect.Top,"AAA");
结束;

destructor TWayTree.Destroy;
开始
FPen.Free;
FBrush.Free;
inherited Destroy
结束;

constructor TWayTree.Create;
开始
Inherited Create(AOwner);
FPen:=TPen.Create;
FBrush:=TBrush.Create;
FPen.OnChange:=RepaintRequest;
FBrush.OnChange:=RepaintRequest
结束;

procedure TWayTree.SetBrush;
开始
if Value=nil then
Exit;
FBrush.Assign(Value);
废止
结束;

procedure TWayTree.SetPen;
开始
if Value=nil then
Exit;
FPen.Assign(Value);
废止
结束;

procedure TWayTree.RePaintRequest;
开始
废止
结束;

procedure Register;
开始
RegisterComponents("WayTrees", [TWayTree]);
结束;

结束。
компонента при вставлении в форму ругается, что не может установить Pen в nil. Pen и Brush в Инспекторе появляются, но при нажатии на + нифига не выпадает, при изменении размеров компоненты та же ошибка... Чего я тут не так делаю?



csf   (2001-12-18 13:09) [1]

Перезапусти Delphi, говорят, помогает.
Про 存储 можно еще почитать...



亚历山大(2001-12-18 13:11) [2]

Сорри, мне пора на свалку... Разобрался, что забыл override напротив констрактора с дестрактором нарисовать... Интересно, как можно к этой компоненте подключить вертикальный ScrollBar...



csf   (2001-12-18 13:19) [3]

... хорошо бы проверять при Paint FPen & FBrush на nil...



尤里佐托夫(2001-12-18 14:30) [4]

> csf

XNUMX. > Перезапусти Delphi, говорят, помогает.
Ценнейший совет.

XNUMX. > Про stored можно еще почитать...
Можно. Только к сабжу это не имеет никакого отношения.

XNUMX. > ... хорошо бы проверять при Paint FPen & FBrush на nil...
Зачем? Oни созданы в конструкторе компонента. Nil там быть никак не может.

Итого: Вы написали XNUMX фразы и все XNUMX, извините, чушь. Стоило ли писать? Стоит ли вообще отвечать на вопросы, тема которых Вам, мягко говоря, не очень хорошо знакома?


> Aleksandr

С override Вы уже сами разобрались, но это еще не все - у Вас идет двойная перерисовка:

procedure TWayTree.SetBrush;
开始
if Value=nil then // Это лишнее и даже вредно - маскирует ошибки юзера
Exit;
FBrush.Assign(Value); // Генерит FBrush.OnChange и вызов RePaintRequest
Invalidate // Это лишнее - идет повторная перерисовка
结束;

И то же самое в SetPen. Кроме того, переменная ARect в Paint совершенно не нужна - используйте ClientRect или Canvas.ClipRect.

Наконец, главное - свои FBrush и FPen абсолютно ни к чему - только лишние ресурсы гробят. Используйте встроенные в Canvas:

出版
property Pen: TPen read GetPen write SetPen;
...

function ...GetPen: TPen;
开始
Result := Canvas.Pen
结束;

procedure ...SetPen(const Value: TPen);
开始
Canvas.Pen.Assign(Value)
结束;

Вывод - даже такие простейшие компоненты надо продумывать более тщательно и делать более акккуратно.




亚历山大(2001-12-18 15:50) [5]

XNUMX Юрий Зотов
Спасибо за инфу. Однако, прямое обращение к свойствам канвы вызовет то, что не будет "стандартов" по умолчанию - она всегда будет продолжать рисовать тем цветом, который использовался последним. И, соответственно, на OnChange ничего посадить нельзя - будет происходить элементарное зацикливание - установка цвета канвы вызывает OnChange, он вызывает перерисовку, а в перерисовке опять меняется цвет Canvas.
Остался один вопрос на повестке: как засобачить в компоненту TScrollBar? Что-то у меня не получается нифига сделать двойное наследование - от TGraphicControl и от TScrollBar...



DieHard(2001-12-18 16:01) [6]

Двойное наследование не пройдет.
Попробуй наследовать от TScrollBox.



MBo(2001-12-18 16:02) [7]

двойного наследования нет.
может, наследовать от TWinControl?



Polevi(2001-12-18 16:19) [8]

TCustomControl



亚历山大(2001-12-18 16:19) [9]

Мда... ладно, оставим сие пока... Вот как истчо избежать постоянного мерцания компоненты при изменении размеров формы?




帕诺夫(2001-12-18 16:31) [10]

>Aleksandr © (XNUMX XNUMX:XNUMX)
Попробуй указать Enabled := False перед изменением размеров



尤里佐托夫(2001-12-18 17:25) [11]

> Aleksandr © (XNUMX XNUMX:XNUMX)

> она всегда будет продолжать рисовать тем цветом, который использовался последним.

需要什么。


> И, соответственно, на OnChange ничего посадить нельзя

И не нужно. Ваш метод Paint будет вызван автоматически, а больше ничего и не требуется.

> будет происходить элементарное зацикливание - установка цвета канвы
> вызывает OnChange, он вызывает перерисовку, а в перерисовке опять
> меняется цвет Canvas.

Во-первых, Вы сами подтверждаете, что смена свойств канвы автоматически вызывает Ваш метод Paint. Значит, Вы должны согласиться с предыдущим пунктом - никакие обработчики OnChange Вам не нужны (обработчики OnChange дают только лишнюю перерисовку - отсюда и лишнее моргание).

Во-вторых, в перерисовке НЕ НУЖНО менять свойств канвы. Зачем? Ведь если Вы завяжете свойства компонента на свойства канвы, то при вызове метода Paint эти свойства канвы УЖЕ будут установлены, как надо. С ними и рисуйте, ничего не меняя. И тогда не будет никакого зацикливания.

В общем, советую попробовать - увидите сами. Думаю, и мерцание значительно уменьшится.

Далее, по поводу мерцания и ScrollBar - прислушайтесь к совету Polevi. TCustomControl - это окно. ScrollBar"ы туда вставляются простым выставлением стилей WS_HSCROLL/WS_VSCROLL в CreateParams, а уменьшить мерцание можно установкой свойства DoubleBuffered.




Страницы: 1 整个分支

论坛:“主要”;
当前存档:2002.01.08;
下载:[xml.tar.bz2];

楼上

Top.Mail.Ru Yandeks.Metrika













内存:0.81 MB
时间:0.042 c
1-22027
胜利者
XNUMX-XNUMX-XNUMX XNUMX:XNUMX
2002.01.08
нужен компонент для отображения HTML страничек


1-22232
T2
XNUMX-XNUMX-XNUMX XNUMX:XNUMX
2002.01.08
WINXNUMX.SWP


1-22159
Phisio
XNUMX-XNUMX-XNUMX XNUMX:XNUMX
2002.01.08
Как создавать новую структуру


6-22314
SDS
XNUMX-XNUMX-XNUMX XNUMX:XNUMX
2002.01.08
Вопрос о методе POST


1-22001
Socol
XNUMX-XNUMX-XNUMX XNUMX:XNUMX
2002.01.08
阿纳托利podgoretsky





南非荷兰语 阿尔巴尼亚人 阿拉伯语 亚美尼亚 阿塞拜疆 巴斯克 白俄罗斯 保加利亚语 加泰罗尼亚 简体中文 中国(繁体) 克罗地亚 捷克 丹麦语 荷兰人 英语 爱沙尼亚语 菲律宾人 芬兰 法文
加利亚西语 格鲁吉亚语 德语 希腊语 海地克里奥尔语 希伯来语 印地语 匈牙利 北日耳曼语 印度尼西亚人 爱尔兰语 意大利语 日语 韩语 拉脱维亚 立陶宛 马其顿 马来语 马耳他语 挪威语
波斯语 波兰语 葡萄牙语 罗马尼亚 俄语 塞尔维亚 斯洛伐克 斯洛文尼亚 西班牙语 斯瓦希里 瑞典语 泰国人 土耳其 乌克兰 乌尔都语 越南人 威尔士语 意第绪语 孟加拉 波斯尼亚
宿务 世界语 古吉拉特语 豪萨语 苗族 伊博 爪哇 卡纳达语 高棉 老挝 拉丁语 毛利 马拉 蒙古人 尼泊尔 旁遮普 索马里 泰米尔人 泰卢固语 约鲁巴语
祖鲁
英文 Французский Немецкий Итальянский Португальский 俄文 Испанский