منزل
Top.Mail.Ru Yandeks.Metrika
المنتدى: "Main";
الأرشيف الحالي: 2002.01.08;
تنزيل: [xml.tar.bz2];

إلى

لم يتم رسم المكون ، وهذا كل شيء ... البحث عن فروع مماثلة


Aleksandr   (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 TWayTree.Paint;
فار
ARect : TRect;
بدأ
الموروثة.
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);
...
الغاية؛

سجل الإجراءات ؛
بدأ
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);
المدمرة تدمير.
نشرت
property Color default clWhite;
property Visible;
property Brush : TBrush read FBrush write SetBrush;
property Pen : TPen read FPen write SetPen;
الغاية؛

سجل الإجراءات ؛

التنفيذ

procedure TWayTree.Paint;
فار
ARect : TRect;
بدأ
الموروثة.
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;
تدمير الموروثة
الغاية؛

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
الخروج؛
FBrush.Assign(Value);
إبطال
الغاية؛

procedure TWayTree.SetPen;
بدأ
if Value=nil then
الخروج؛
FPen.Assign(Value);
إبطال
الغاية؛

procedure TWayTree.RePaintRequest;
بدأ
إبطال
الغاية؛

سجل الإجراءات ؛
بدأ
RegisterComponents("WayTrees", [TWayTree]);
الغاية؛

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



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

Перезапусти Delphi, говорят, помогает.
حول تخزين можно еще почитать...



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;
بدأ
if Value=nil then // Это лишнее и даже вредно - маскирует ошибки юзера
الخروج؛
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)
الغاية؛

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



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)

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

ما هو مطلوب.


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

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

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

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

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

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

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



صفحات: 1 فرع كامل

المنتدى: "Main";
الأرشيف الحالي: 2002.01.08;
تنزيل: [xml.tar.bz2];

الطابق العلوي









الذاكرة: 0.61 ميغابايت
الوقت: 0.03 ج
4-22486
Pantero
2001-11-03 23:59
2002.01.08
مقبض


1-22039
يوري btr
2001-12-18 10:46
2002.01.08
شكل


1-22056
Delphimun
2001-12-15 13:11
2002.01.08
كيفية إنشاء مورد باستخدام brcc32.exe؟


14-22342
سميك
2001-11-05 18:52
2002.01.08
المنافسة! خلفية للعبة (موقع) قتال البحر!


1-22001
Socol
2001-12-15 15:55
2002.01.08
اناتولي podgoretsky





الأفريكانية الألبانية عربي الأرميني أذربيجان الباسكي البيلاروسية Bulgarian التشيكية الصينية المبسطة) تقاليد صينية) الكرواتية التشيكية دانماركي Dutch أنجليزي الإستونية الفلبينية Finnish جيب
الجاليكية الجورجية الألمانيّة اليونانيّة الكريولية الهايتية اللغة العبرية الهندية الهنغارية أيسلندي Indonesian الأيرلندية Italian اليابانيّة الكوريّة اللاتفية اللتوانية المقدونية الملايو المالطية Norwegian
اللغة الفارسية بولنديّة البرتغاليّة رومانية Russian صربي السلوفاكيّة سلوفيني إسباني السواحيلي Swedish Thai التركية الأوكراني الأردية الفيتنامية ويلزي اليديشية البنغالي البوسنية
السيبيونو الاسبرانتو الغوجاراتية الهوسا همونغ الإيبو جاوي الكانادا الخمير لاو لاتينية الماوري المهاراتية المنغولية النيبالية البنجابية الصومالية التاميل التيلجو اليوروبا
زولو
Английский Французский ألماني Итальянский البرتغالية Русский Испанский