maison

Forum: "Main";
Archive actuelle: 2002.01.08;
Télécharger: [xml.tar.bz2];
vers le bas

Le composant n'est pas dessiné, et c'est tout ... Trouver des branches similaires


Aleksandr (2001-12-18 13:03) 0

Chers collègues!
Понадобилось это мне создать компоненту. Создал, породив от TGraphicControl. Ставлю на форму - все в порядке, проперти видны, но вот не рисуется, и все тут... Код таков

type
TWayTree = class(TGraphicControl)
Privée
...
protégé
procedure Paint;override;
public
constructor Create(AOwner : TComponent);
publié
...
property Color default clWhite;
property Visible default true;
fin;

registre de procédure;

la mise en oeuvre

procedure TWayTree.Paint;
var
ARect : TRect;
commencer
Hérité;
Canvas.Brush.Color:=Color;
ARect.Left:=Left;
ARect.Top:=Top;
ARect.Bottom:=Top+Height;
ARect.Right:=Left+Width;
Canvas.FillRect(ARect)
fin;

constructor TWayTree.Create;
commencer
Inherited Create(AOwner);
...
fin;

registre de procédure;
commencer
RegisterComponents("WayTrees", [TWayTree])
fin;

fin.

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

TWayTree = class(TGraphicControl)
Privée
FPen : TPen;
FBrush : TBrush;
procedure RePaintRequest(Sender : TObject);
procedure SetBrush(Value : TBrush);
procedure SetPen(Value : TPen);
protégé
procedure Paint;override;
public
constructor Create(AOwner : TComponent);
destructor Destroy;
publié
property Color default clWhite;
property Visible;
property Brush : TBrush read FBrush write SetBrush;
property Pen : TPen read FPen write SetPen;
fin;

registre de procédure;

la mise en oeuvre

procedure TWayTree.Paint;
var
ARect : TRect;
commencer
Hérité;
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");
fin;

destructor TWayTree.Destroy;
commencer
FPen.Free;
FBrush.Free;
Destroy hérité
fin;

constructor TWayTree.Create;
commencer
Inherited Create(AOwner);
FPen:=TPen.Create;
FBrush:=TBrush.Create;
FPen.OnChange:=RepaintRequest;
FBrush.OnChange:=RepaintRequest
fin;

procedure TWayTree.SetBrush;
commencer
if Value=nil then
Sortie;
FBrush.Assign(Value);
Invalider
fin;

procedure TWayTree.SetPen;
commencer
if Value=nil then
Sortie;
FPen.Assign(Value);
Invalider
fin;

procedure TWayTree.RePaintRequest;
commencer
Invalider
fin;

registre de procédure;
commencer
RegisterComponents("WayTrees", [TWayTree]);
fin;

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



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

Перезапусти Delphi, говорят, помогает.
Sur stockée можно еще почитать...



Aleksandr (2001-12-18 13:11) 2

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



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

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



Yuri Zotov (2001-12-18 14:30) 4

> csf

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

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

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

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


> Aleksandr

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

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

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

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

publié
property Pen: TPen read GetPen write SetPen;
...

function ...GetPen: TPen;
commencer
Result := Canvas.Pen
fin;

procedure ...SetPen(const Value: TPen);
commencer
Canvas.Pen.Assign(Value)
fin;

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




Aleksandr (2001-12-18 15:50) 5

2 Юрий Зотов
Спасибо за инфу. Однако, прямое обращение к свойствам канвы вызовет то, что не будет "стандартов" по умолчанию - она всегда будет продолжать рисовать тем цветом, который использовался последним. И, соответственно, на 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



Aleksandr (2001-12-18 16:19) 9

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




panov (2001-12-18 16:31) 10

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



Yuri Zotov (2001-12-18 17:25) 11

> Aleksandr © (18.12.01 15:50)

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

Ce qui est requis


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

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

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

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

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

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

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




Pages: 1 branche entière

Forum: "Main";
Archive actuelle: 2002.01.08;
Télécharger: [xml.tar.bz2];

à l'étage

Top.Mail.Ru Yandeks.Metrika













Mémoire: 0.84 MB
Heure: 0.123 c
6-22304
sedoy
2001-10-11 14:09
2002.01.08
клиент-сервер в Интернет через прокси


4-22464
Dimich
2001-11-01 14:50
2002.01.08
Livres sur les API en russe


1-22110
Катерина
2001-12-19 18:09
2002.01.08
pleurer demander de l'aide


14-22354
Némésis
2001-10-08 13:02
2002.01.08
Мобила


4-22471
bsFrame
2001-11-02 11:42
2002.01.08
Composant





afrikaans albanais Arabic arménien azerbaïdjanais basque Biélorusse Bulgare catalan Chinois simplifié) Chinois (traditionnel) croate Tchèque Danois Néerlandais English estonien Filipino Finlandais Français
galicien géorgien Allemand Grecque Créole haïtien hébreu Hindi Hongrois Islandais Indonesian irlandais Italien Japonais Coréen letton lituanien macédonien Malay maltais Norvégien
persan Polonais Portugais roumain Russe serbe Slovaque Slovène Espagnol Swahili Suédois Thai turc ukrainien Urdu vietnamien gallois yiddish bengali bosniaque
Cebuano espéranto gujarati Hause hmong Igbo Javanais Kannada Khmer lao latin maori Marathi mongol népalais punjabi somali tamil telugu yoruba
zoulou
Английский Français Allemand Italien Португальский Русский Espagnol