Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Основна";
Поточний архів: 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;
end;

procedure Register;

реалізація

procedure TWayTree.Paint;
було
ARect: TRect;
починати
Inherited;
Canvas.Brush.Color: = Color;
ARect.Left: = Left;
ARect.Top:=Top;
ARect.Bottom: = Top + Height;
ARect.Right: = Left + Width;
Canvas.FillRect (ARect)
end;

constructor TWayTree.Create;
починати
Inherited Create (AOwner);
...
end;

procedure Register;
починати
RegisterComponents ( "WayTrees", [TWayTree])
end;

end.

Мало того, коли я ще намагаюся додати властивості 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;
end;

procedure Register;

реалізація

procedure TWayTree.Paint;
було
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");
end;

destructor TWayTree.Destroy;
починати
FPen.Free;
FBrush.Free;
inherited Destroy
end;

constructor TWayTree.Create;
починати
Inherited Create (AOwner);
FPen: = TPen.Create;
FBrush: = TBrush.Create;
FPen.OnChange: = RepaintRequest;
FBrush.OnChange: = RepaintRequest
end;

procedure TWayTree.SetBrush;
починати
if Value = nil then
Exit;
FBrush.Assign (Value);
Invalidate
end;

procedure TWayTree.SetPen;
починати
if Value = nil then
Exit;
FPen.Assign (Value);
Invalidate
end;

procedure TWayTree.RePaintRequest;
починати
Invalidate
end;

procedure Register;
починати
RegisterComponents ( "WayTrees", [TWayTree]);
end;

end.
компонента при вставлянні в форму лається, що не може встановити 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 // Це зайве і навіть шкідливо - маскує помилки користувача
Exit;
FBrush.Assign (Value); // Генерує FBrush.OnChange і виклик RePaintRequest
Invalidate // Це зайве - йде повторна перерисовка
end;

І те ж саме в SetPen. Крім того, змінна ARect в Paint абсолютно не потрібна - використовуйте ClientRect або Canvas.ClipRect.

Нарешті, головне - свої FBrush і FPen абсолютно ні до чого - тільки зайві ресурси гроблять. Використовуйте вбудовані в Canvas:

опублікований
property Pen: TPen read GetPen write SetPen;
...

function ... GetPen: TPen;
починати
Result: = Canvas.Pen
end;

procedure ... SetPen (const Value: TPen);
починати
Canvas.Pen.Assign (Value)
end;

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



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 вся гілка

Форум: "Основна";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

наверх









Пам'ять: 0.61 MB
Час: 0.038 c
3-21921
MVova
2001-12-04 10:41
2002.01.08
Зв'язок багато до багатьох;)


1-22071
KAA
2001-12-19 10:48
2002.01.08
Два сервісу заважають один одному.


4-22502
Олександр
2001-11-06 11:00
2002.01.08
Як отримати іконку для зареєстрованого розширення в системі


1-22161
Єгор Буличов
2001-12-19 22:13
2002.01.08
Memo хелп!


1-22134
Роско
2001-12-15 12:54
2002.01.08
А таке вже є?





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська