casa
Top.Mail.Ru Yandeks.Metrika
Forum: "Principale";
Archivio attuale: 2002.01.08;
Scarica: [xml.tar.bz2];

giù

Il componente non è disegnato, e questo è tutto ... Trova rami simili


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

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

Digitare
TWayTree = class(TGraphicControl)
privato
...
protetta
procedura Paint; override;
pubblico
constructor Create(AOwner : TComponent);
pubblicato
...
property Color default clWhite;
property Visible default true;
fine;

registro delle procedure;

implementazione

procedure TWayTree.Paint;
var
ARect : TRect;
iniziare
ereditato;
Canvas.Brush.Color:=Color;
ARect.Left:=Left;
ARect.Top:=Top;
ARect.Bottom:=Top+Height;
ARect.Right:=Left+Width;
Canvas.FillRect(ARect)
fine;

constructor TWayTree.Create;
iniziare
Inherited Create (AOwner);
...
fine;

registro delle procedure;
iniziare
RegisterComponents("WayTrees", [TWayTree])
fine;

fine.

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

TWayTree = class(TGraphicControl)
privato
FPen : TPen;
FBrush : TBrush;
procedure RePaintRequest(Sender : TObject);
procedure SetBrush(Value : TBrush);
procedure SetPen(Value : TPen);
protetta
procedura Paint; override;
pubblico
constructor Create(AOwner : TComponent);
distruttore Destroy;
pubblicato
property Color default clWhite;
proprietà visibile;
property Brush : TBrush read FBrush write SetBrush;
property Pen : TPen read FPen write SetPen;
fine;

registro delle procedure;

implementazione

procedure TWayTree.Paint;
var
ARect : TRect;
iniziare
ereditato;
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");
fine;

distruttore TWayTree.Destroy;
iniziare
FPen.Free;
FBrush.Free;
ereditato Distruggi
fine;

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

procedure TWayTree.SetBrush;
iniziare
if Value=nil then
Exit;
FBrush.Assign(Value);
infirmare
fine;

procedure TWayTree.SetPen;
iniziare
if Value=nil then
Exit;
FPen.Assign(Value);
infirmare
fine;

procedure TWayTree.RePaintRequest;
iniziare
infirmare
fine;

registro delle procedure;
iniziare
RegisterComponents("WayTrees", [TWayTree]);
fine;

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



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

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



Aleksandr   (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

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

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

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

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


> Aleksandr

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

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

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

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

pubblicato
property Pen: TPen read GetPen write SetPen;
...

function ...GetPen: TPen;
iniziare
Result := Canvas.Pen
fine;

procedure ...SetPen(const Value: TPen);
iniziare
Canvas.Pen.Assign(Value)
fine;

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



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 перед изменением размеров



Юрий Зотов   (2001-12-18 17:25) [11]

> Aleksandr © (18.12.01 15:50)

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

Cosa è richiesto


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

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

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

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

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

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

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



Pagine: 1 tutto il ramo

Forum: "Principale";
Archivio attuale: 2002.01.08;
Scarica: [xml.tar.bz2];

al piano di sopra









Memoria: 0.87 MB
Ora: 0.04 c
3-21969
Kozhanov
2001-11-30 18:31
2002.01.08
Opzioni del driver OBDC


1-22144
shornik
2001-12-20 11:36
2002.01.08
Maestri !!!! Si prega di aiutare con il problema!


4-22505
delphixnumx
2001-11-07 20:14
2002.01.08
Problema con Bitmap


14-22407
KL
2001-11-03 00:47
2002.01.08
Beta test !!!


1-22264
Anatoly
2001-12-17 06:36
2002.01.08
Grafico





afrikaans albanese Arabic armeno Azero basco bielorusso Bulgarian catalano Cinese (semplificato) Cinese (tradizionale) croato Ceco danese Dutch Inglese estone filippina Finnish Francese
galiziano georgiano Tedesco greco Creolo haitiano ebraico hindi ungherese islandese Indonesian irlandese Italiano Giapponese Korean lettone lituano macedone Malay maltese Norwegian
persiano polacco Portoghese rumeno Russian serbo Slovak sloveno Spagnolo swahili Swedish Thai turco ucraino Urdu vietnamita gallese yiddish bengalese bosniaco
Cebuano esperanto Gujarati Hausa Hmong Igbo giavanese kannada khmer lao latino maori marathi mongolo nepali punjabi somalo tamil telugu Yoruba
zulù
Английский Francese tedesco italiano portoghese russo spagnolo