Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 31.05.2017, 12:48
Aptyp Aptyp вне форума
Прохожий
 
Регистрация: 10.03.2017
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Canvas.Draw и has no parent

Делаю компонент-кнопку от TCustomControl.
Её канвас создаю так в Create компонента:
Код:
FCanvas: TCanvas;
...
FCanvas := TControlCanvas.Create;
TControlCanvas( FCanvas ).Control := Self;
Ну и рисую на нём:
Код:
FCanvas.Draw( 0, 0, _BitMap );
Всё отлично работает до тех пор, пока родитель кнопки или его родитель или ещё выше по иерархии не сделает:
Код:
Parent := nil;
И если после этого что-то вызовет перерисовку кнопки, к примеру смена одного из её свойств, то "control has no parent window", в роли control-а в данной ошибке выступает естественно тот, у которого нет родителя. Можно конечно при каждой перерисовке циклом проверять родителей или обернуть в try ... except, но оба эти варианты ни в какие рамки конечно не лезут. Как это правильно сделать?
Ответить с цитированием
  #2  
Старый 31.05.2017, 14:46
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

У TCustomControl уже есть работающий Canvas.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 31.05.2017, 17:07
Aptyp Aptyp вне форума
Прохожий
 
Регистрация: 10.03.2017
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Во-первых у него механизм создания канваса точно такой же. Собственно я оттуда и скопировал. Так вести себя должно абсолютно так же. Во-вторых мне нужен именно свой канвас, так как я в read методе свойства Canvas не всегда его отдаю.
Ответить с цитированием
  #4  
Старый 01.06.2017, 08:48
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

1. Обычный велосипед - лишнее.
2. Canvas у TCustomControl находится в protected. Изменить его у наследника проблем нет.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 01.06.2017, 12:40
Aptyp Aptyp вне форума
Прохожий
 
Регистрация: 10.03.2017
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Чтобы не было мерцаний при внешней рисовке на компоненте, я придумал такой механизм:
Код:
property Canvas: TCanvas read GetCanvas;

...

function GetCanvas: TCanvas;
begin
  Result := FCanvasLink;
end;

procedure DoPaintEvent( _BitMap: TBitmap );
begin
  if Assigned( FOnPaint ) then
    begin
      FCanvasLink := _BitMap.Canvas;
      FOnPaint( Self );
      FCanvasLink := FCanvas;
    end;
  FCanvas.Draw( 0, 0, _BitMap );
end;
К тому же ещё компонент при смене какого-то св-ва, к примеру Enable, может вызвать перерисовку, так как нужна другая картинка. При этом поддерживается анимация и перерисовка может идти многократная в таймере. Но каждая перерисовка заканчивается в процедуре DoPaintEvent. Вот тут и возникает та самая ошибка, если один из родителей моего компонента имеет Parent=nil, кроме формы конечно.
Ответить с цитированием
  #6  
Старый 01.06.2017, 14:27
Aptyp Aptyp вне форума
Прохожий
 
Регистрация: 10.03.2017
Сообщения: 14
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Всё проблему решил. Рисую на отдельном BitMap и вызываю Invalidate. А в WMPaint уже рисую его на канвасе компонента. В таком случае винда уже сама заботиться о резоне посыла сообщения о перерисовке.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter