Различия между Canvas

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Различия между Canvas

Сообщение Странник » 17.06.2010 13:10:11

Всем привет.
Такой вопрос: в чем отличие Image1.Picture.Bitmap.Canvas oт Image1.Canvas?
Странник
незнакомец
 
Сообщения: 8
Зарегистрирован: 16.06.2010 18:36:02

Re: Различия между Canvas

Сообщение скалогрыз » 17.06.2010 14:49:19

Странник писал(а):Всем привет.
Такой вопрос: в чем отличие Image1.Picture.Bitmap.Canvas oт Image1.Canvas?

то что ты нарисуешь на Image1.Canvas отразиться лишь на экране (контроле Image).
На этот Canvas следует рисовать ТОЛЬКО в Image1.OnPaint событии!

а рисование на Image1.Picture.Bitmap.Canvas отразиться не только на экране, но и в случае записи изображения в файл - на файле. Естественно, контрол Image1, при следующей отрисовке отобразит изменения, сделанные в Image1.Picture.Bitmap.Canvas
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Различия между Canvas

Сообщение А.Н. » 18.06.2010 14:36:13

А, может, объясните какая разница между TBitmapCanvas и TControlCanvas?
Почему, например, при попытке какого-нибудь, Image.Canvas.Assign(Bitmap.Canvas) он выдаёт "Cannot assign TBitmapCanvas to TControlCanvas"?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Различия между Canvas

Сообщение Timid » 18.06.2010 14:52:35

Есть еще Metafile.Canvas, он содержится тоже в Image и выбор зависит от способа инициализации.
Фактически, рисование на канве битмапа, который внутри имиджа идет в два этапа - рисование в буфер битмапа, а затем битмап сам делает redraw на канву имиджа.

Поэтому указанный assign и невозможен. Это разные сущности. Буфер и GDI.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: Различия между Canvas

Сообщение А.Н. » 18.06.2010 15:17:33

Но, как мне показалось, они имеют одинаковый базовый класс?

Добавлено спустя 17 секунд:
Вообще, одинаковый класс?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Различия между Canvas

Сообщение Timid » 18.06.2010 16:10:21

А причем здесь базовый класс? Для Assign нужно чтобы была совместимость классов.
Вот CustomCanvas, наверное, можно подцепить.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: Различия между Canvas

Сообщение А.Н. » 18.06.2010 16:13:04

Не понимаю. Canvas, TForm, например, имеет тип TCanvas и Canvas TBitmap имеет тип TCanvas.
А как их отличает Assign?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Различия между Canvas

Сообщение Sergei I. Gorelkin » 18.06.2010 17:05:00

Не нужно никакой совместимости классов, делай хоть Напильник.Assign(Молоток), нужно только чтобы они оба были наследниками TPersistent и чтобы был реализован либо метод Напильник.Assign, либо Молоток.AssignTo.
В классе TCanvas они не реализованы, вот и все.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Различия между Canvas

Сообщение А.Н. » 18.06.2010 17:20:31

Понятно. Просто Assign, обычно, проверяет класс.
Блин, грустно, что нельзя сделать Assign Canvas'у. :(
Но откуда он тогда берёт эти TBitmapCanvas/TControlCanvas?
Или это некая процедура обработки ошибок их образует, как Имя_классаИмя_аттрибута?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Различия между Canvas

Сообщение Sergei I. Gorelkin » 18.06.2010 18:19:32

При отсутствии перекрытых процедур Assign будет вызвана TPersistent.Assign, которая бросает исключение с указанием имен обоих классов.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Различия между Canvas

Сообщение А.Н. » 18.06.2010 19:15:25

Понятно...
Только странно: "Cannot assign TBitmapCanvas to a TBitmapCanvas."
По-идее, он должен показывать TCanvas. И в коде AssignError используется ClassName. Откуда же TBitmapCanvas?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Различия между Canvas

Сообщение Sergei I. Gorelkin » 18.06.2010 20:12:54

При обращении к свойству TBitmap.Canvas создается не TCanvas, а его наследник TBitmapCanvas. Этот TBitmapCanvas не предназначен для самостоятельного использования, и его нет в интерфейсе. Та же история с TControlCanvas. Но ф-ция ClassName возвращает реальное имя класса, а о том, что с ним работают, как с предком, она "не знает".
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Различия между Canvas

Сообщение А.Н. » 18.06.2010 20:32:40

Эээээ... :shock: А зачем нужно создавать новый класс? Для чего это?

Добавлено спустя 2 минуты 1 секунду:
И что, так с любым объектным свойством?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Различия между Canvas

Сообщение Sergei I. Gorelkin » 18.06.2010 20:52:14

Если говорить о TBitmap.Canvas, то объект канвы создается только при первом обращении к свойству, а сделано так для экономии ресурсов, потому что для большинства операций с битмапом канва не требуется. Она нужна, чтобы рисовать что-то на самом битмапе, а загрузить/сохранить/нарисовать битмап можно без нее.
Другие объектные свойства могут вести себя по-другому.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Различия между Canvas

Сообщение А.Н. » 18.06.2010 21:01:16

Любопытно. Но больше меня интересует не сам объект, а класс. Как создаётся новый класс? И зачем?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

Рейтинг@Mail.ru