Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятное поведение Canvas.Handle 
:(
    Опции темы
serI
Дата 7.1.2008, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Добрый вечер.
Вообще проблема такая, пишу клон арканойда, задание в универе.
Вот вроде сделал, осталось не так много. И столкнулся с тем что
Canvas.Handle самопроизвольно меняется, возможно ошибка в структуре классов  smile 

Кто может, гляньте пожалуйста код, может будут какие-нибудь рекомендации...

Game -> New Game если смотреть в отладчике то
Код

procedure TBoat.drawBoat(var psbd: TBitmap);
begin
  pFsbd:=psbd;
  BitBlt(Fbuf.Canvas.Handle, Fx, Fy, Fsprite.Width, Fsprite.Height, psbd.Canvas.Handle,0,0, SRCPAINT);
  BitBlt(psbd.Canvas.Handle, Fx, Fy, Fsprite.Width, Fsprite.Height, Fsprite.Canvas.Handle,0,0, SRCCOPY);
end;


psbd.Canvas.Handle - тут имеет одно значение

если нажать любую кнопку то
Код

procedure TGame.KeyDown(Key: Word; Shift: TShiftState);
begin
  FBoat.moveBoat(100,100);
  ReDraw;   // ? почему HANDLE дрУГОЙ!!
end;

procedure TBoat.moveBoat(x, y: Integer);  // и тут уже другой Handle соотвественно и рисует оно не там где надо (
begin
  BitBlt(pFsbd.Canvas.Handle, Fx, Fy, Fbuf.Width, Fbuf.Height, Fbuf.Canvas.Handle,0,0, SRCCOPY);
  Fx:=x;  Fy:=y;   
  BitBlt(pFsbd.Canvas.Handle, 300, 400, Fsprite.Width, Fsprite.Height, Fsprite.Canvas.Handle,0,0, SRCCOPY);
end;




Это сообщение отредактировал(а) serI - 7.1.2008, 15:57

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  Arco.rar 30,98 Kb
PM MAIL   Вверх
MetalFan
Дата 7.1.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 5
Всего: 128



да, меняется. и что? оно и должно меняться


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
serI
Дата 7.1.2008, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Цитата(MetalFan @ 7.1.2008,  20:00)
да, меняется. и что? оно и должно меняться

Интересное кино,
как же мне тогда передать ссылку на канву или битмап на котором bitblt сможет
рисовать если hadnle постоянно меняется...
PM MAIL   Вверх
MetalFan
Дата 7.1.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 5
Всего: 128



дык не постоянно... а периодически)
непойму в какой момент у тебя чего меняется


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
maxim1000
Дата 8.1.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 1
Всего: 110



Цитата(serI @  7.1.2008,  22:56 Найти цитируемый пост)
Интересное кино,
как же мне тогда передать ссылку на канву или битмап на котором bitblt сможет
рисовать если hadnle постоянно меняется...

так canvas же не меняется... меняется только handle: какое отношение это имеет к процессу передачи ссылок на canvas?

Это сообщение отредактировал(а) maxim1000 - 8.1.2008, 00:37


--------------------
qqq
PM WWW   Вверх
Alexeis
Дата 8.1.2008, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Canvas.Handle это DC - дескриптор который выдается на не продолжительное время, по прошествию которого становиться недействительным.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
serI
Дата 8.1.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Цитата(maxim1000 @ 8.1.2008,  00:37)
Цитата(serI @  7.1.2008,  22:56 Найти цитируемый пост)
Интересное кино,
как же мне тогда передать ссылку на канву или битмап на котором bitblt сможет
рисовать если hadnle постоянно меняется...

так canvas же не меняется... меняется только handle: какое отношение это имеет к процессу передачи ссылок на canvas?


Действительно объект должен оставаться самим собой, но если я взял canvas.handle и поместил его в myHandle 
и при этом не использовал  trylock, чтобы заблокировать handle. Он изменится и где-то в коде где используется myHandle, а не вызов canvas.handle произойдет ошибка, точнее вывод будет в пустоту. Собствено тот факт, что handle у canvas меняется с учетом выше изложенного привел меня в замешательство.

Значит Canvas обертка на DC, и включает в себя функции API MoveTo, LineTo... Просто когда используется чистое API там не каких TryLock нету, контекст он и в африке контекст




Это сообщение отредактировал(а) serI - 8.1.2008, 10:06
PM MAIL   Вверх
MetalFan
Дата 8.1.2008, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 5
Всего: 128



Цитата(serI @  8.1.2008,  09:51 Найти цитируемый пост)
Просто когда используется чистое API там не каких TryLock нету

ну так и получай HDC перед отрисовкой...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
serI
Дата 8.1.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 7.1.2008

Репутация: нет
Всего: нет



Вообще спасибо всем кто откликнулся на зов о помощи. Разобрался вроде и сделал некоторые выводы:

Предположим у вас есть некоторая совокупность классов отражающая функциональность
вашей программы. И вам требуется передавать своим классам указатель на TCanvas формы
или друго обьекта со свойством Canvas. Рассмотрим возможные варианты:

1. Передать классу handle нужного canvas, но перед этим нужно обязательно заблокировать
handle вызовом метода trylock или lock.

2. Передать TCanvas по ссылке

и встречный вопрос 
Код

procedure Test(var cc: TCanvas)

и  

procedure Test(cc: TCanvas)

это одно и тоже? передача экземпляра класса по ссылке?
тогда var получает издержки производства   smile

Существует ли какая-либо статья в которая ставит все точки над i в 
особенности реализации классов в Delphi и их отличия от C++?


Это сообщение отредактировал(а) serI - 8.1.2008, 11:29
PM MAIL   Вверх
MetalFan
Дата 8.1.2008, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 5
Всего: 128



Цитата(serI @  8.1.2008,  10:38 Найти цитируемый пост)
и встречный вопрос

эта тема освещена в любом учебнике по паскалю


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
ivan219
Дата 8.1.2008, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 4
Всего: 12



Цитата(serI @  8.1.2008,  10:38 Найти цитируемый пост)
procedure Test(cc: TCanvas)

Вот так будет правильнее так как cc это не обект а ссылка на обект.
Правда есть один вопрос это копия ссылки или это таже самая ссылка???
PM MAIL ICQ   Вверх
Alexeis
Дата 8.1.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(ivan219 @  8.1.2008,  13:04 Найти цитируемый пост)
Правда есть один вопрос это копия ссылки или это таже самая ссылка??? 

  Ссылка это такое понятие, что копия ссылки это по сути та же самая ссылка, потому совершенно никакой разницы, хотя самой ссылкой тут и не пахнет, тут просто везде копируется указатель на объект. В делфи вообще нет понятия ссылки как сущности, можно передать объект по ссылке в функцию как var параметр, но ссылка создается неявно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1133 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.