Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2009, 16:50   #1
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию Ошибка при работе с canvas "Неверный дескриптор"

Доброго времени суток. Нужна помощь профессионалов. Проблема в следующем: Изучаю усиленно работу с canvas по урокам, которые предоставлены в теме "Уроки для новичков". С целью закрепления материала пытаюсь создать простую стрелялку на космическую тематику. Программа запускается, но через 10-20 сек начинает ругаться. Выдает ошибку "Неверный дескриптор" либо "недостаточно памяти для выполнения программы". Графику вывожу через буффер в таймере. Буффер очищаю. Устал искать причину. Код предоставлен ниже.
Код:
  var
  Form1: TForm1;
  Buffer:Tbitmap; // буфер битмап
  Player: Tbitmap; // игрок
  Bullet:Tbitmap; // пуля
  LivePic: Tbitmap; // сердце
  score: integer; // очки
  Live: integer;  // жизни
  Xp,Yp,XsP,YsP:integer; // положение и скорость игрока

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 score:=0;
 Live:=3;
 Xp:=250;
 Yp:=400;
end;

procedure TForm1.TimerMainTimer(Sender: TObject);
begin
 Buffer:=Tbitmap.Create;
 Buffer.Width:=640;
 Buffer.Height:=480;

 Player:=Tbitmap.Create;
 Player.LoadFromFile('pic/ship2.bmp');
 Player.Transparent:=true;

 LivePic:=Tbitmap.Create;
 LivePic.LoadFromFile('pic/live.bmp');

 with Buffer.Canvas do
 begin

 pen.Color:=0;
 brush.Color:=0;
 Rectangle(0,0,580,480);
 pen.Color:=clLime;
 Rectangle(580,0,640,480);
 Font.Color:=clWhite;
 Font.Size:=12;
 TextOut(590,10,'Очки:');
 TextOut(590,30,IntToStr(score));
 TextOut(610,86,'x  '+IntToStr(Live));
 draw(590,90,livePic);

 Draw(Xp,Yp,Player);
 end;

 Form1.Canvas.Draw(0,0,Buffer);
 Buffer.Free;

end;

end.
Вложения
Тип файла: zip canva.zip (196.5 Кб, 16 просмотров)
Алекс Ялта вне форума Ответить с цитированием
Старый 20.03.2009, 17:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
недостаточно памяти для выполнения программы
Цитата:
Player:=Tbitmap.Create;
А уничтожать его кто будет?
Представляю как ты память самусорил такими создаваниями.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.03.2009, 17:10   #3
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

У меня ошибок не пишет.
Вадим Буренков вне форума Ответить с цитированием
Старый 20.03.2009, 17:15   #4
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А уничтожать его кто будет?
Представляю как ты память самусорил такими создаваниями.
Если бы всё было так просто. Это упрощенный вариант кода. Оригинал я подтер. Точнее от безисходности удалил. Было больше Bitmap и все я уничтожал аналогично. Но, примерно через минуту, снова вылетает ошибка
Алекс Ялта вне форума Ответить с цитированием
Старый 20.03.2009, 17:17   #5
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
и все я уничтожал аналогично
Каким образом..?



Дополнение

Вот этот код:
Код:
 Player:=Tbitmap.Create;
 Player.LoadFromFile('pic/ship2.bmp');
 Player.Transparent:=true;
 LivePic:=Tbitmap.Create;
 LivePic.LoadFromFile('pic/live.bmp');
для чего в Timer написал? Его нужно только один раз выполнять в TForm1.FormCreate... А в TForm1.FormDestroy уничтожать...
I am the First of Cyber Evolution...
I am the First to Program your Future...

Последний раз редактировалось DomiNick; 20.03.2009 в 17:21. Причина: Дополнение
DomiNick вне форума Ответить с цитированием
Старый 20.03.2009, 17:25   #6
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

Цитата:
Сообщение от DomiNick Посмотреть сообщение
Каким образом..?



Дополнение

Вот этот код:
Код:
 Player:=Tbitmap.Create;
 Player.LoadFromFile('pic/ship2.bmp');
 Player.Transparent:=true;
 LivePic:=Tbitmap.Create;
 LivePic.LoadFromFile('pic/live.bmp');
для чего в Timer написал? Его нужно только один раз выполнять в TForm1.FormCreate... А в TForm1.FormDestroy уничтожать...
Если этот код использовать в TForm1.FormCreate, то приложение вообще не запускается. Сразу виснет с ошибкой.
Всё равно спасибо за ответы. Сейчас буду разбираться еще раз с учетом замечаний. Ясно одно - напортачил где-то я)
Алекс Ялта вне форума Ответить с цитированием
Старый 20.03.2009, 17:39   #7
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Цитата:
Сообщение от Вадим Буренков Посмотреть сообщение
У меня ошибок не пишет.
Синтаксических ошибок нет... Ты запусти приложение и подожди...
Вот у меня памяти много в компьютере - пришлось этого сообщения 6 минут ждать...

Алекс Ялта, у тебя просто в таймере постоянно создавались всё новые и новые лишние TBitmap ("Player" и "LivePic")...
Изображения "Player" и "LivePic" нужно создать всего один раз при запуске и уничтожать при закрытии:

Код:
Procedure TForm1.FormCreate(Sender: TObject);
Begin
score:=0;
Live:=3;
Xp:=250;
Yp:=400;
Player:=TBitmap.Create;
Player.LoadFromFile('pic/ship2.bmp');
Player.Transparent:=True;
LivePic:=TBitmap.Create;
LivePic.LoadFromFile('pic/live.bmp');
LivePic.Transparent:=True;
End;

Procedure TForm1.FormDestroy(Sender: TObject);
Begin
Player.Free;
LivePic.Free;
End;

Procedure TForm1.TimerMainTimer(Sender: TObject);
Begin
Buffer:=TBitmap.Create;
Buffer.Width:=640;
Buffer.Height:=480;
With Buffer.Canvas Do
      Begin
      pen.Color:=0;
      brush.Color:=0;
      Rectangle(0,0,580,480);
      pen.Color:=clLime;
      Rectangle(580,0,640,480);
      Font.Color:=clWhite;
      Font.Size:=12;
      TextOut(590,10,'Очки:');
      TextOut(590,30,IntToStr(score));
      TextOut(610,86,'x  '+IntToStr(Live));
      draw(590,90,livePic);
      Draw(Xp,Yp,Player);
      End;
Form1.Canvas.Draw(0,0,Buffer);
Buffer.Free;
End;
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 20.03.2009, 17:40   #8
Алекс Ялта
Пользователь
 
Аватар для Алекс Ялта
 
Регистрация: 27.01.2009
Сообщений: 97
По умолчанию

DomiNick был прав. Спасибо Еще раз за помощь. Код изменил таким образом. Пока всё работает

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
 score:=0;
 Live:=3;
 Xp:=250;
 Yp:=400;

 Player:=Tbitmap.Create;
 Player.LoadFromFile('pic/ship2.bmp');
 Player.Transparent:=true;

 LivePic:=Tbitmap.Create;
 LivePic.LoadFromFile('pic/live.bmp');


end;

procedure TForm1.TimerMainTimer(Sender: TObject);
begin
 Buffer:=Tbitmap.Create;
 Buffer.Width:=640;
 Buffer.Height:=480;



 with Buffer.Canvas do
 begin

 pen.Color:=0;
 brush.Color:=0;
 Rectangle(0,0,580,480);
 pen.Color:=clLime;
 Rectangle(580,0,640,480);
 Font.Color:=clWhite;
 Font.Size:=12;
 TextOut(590,10,'Очки:');
 TextOut(590,30,IntToStr(score));
 TextOut(610,86,'x  '+IntToStr(Live));
 draw(590,90,livePic);


 Draw(Xp,Yp,Player);
 end;

 Form1.Canvas.Draw(0,0,Buffer);
 Buffer.Free;

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Player.Free;
LivePic.Free;
end;

end.
Алекс Ялта вне форума Ответить с цитированием
Старый 20.03.2009, 20:15   #9
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Алекс Ялта, вызывай с трэя "Диспетчер задач", отслеживай как ведет себя приложение.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 21.03.2009, 23:35   #10
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Даже не вдаваясь в представленные коды - надо взять за правило, если вызван конструктор (CREATE) - вы занимаете определенную часть памяти, следовательно после работы с этой памятью ее надо освободить (FREE). Т.е. даже в цикле таймера, как в приведенном примере - создали TBitmap.Create; - по окончанию работы таймера уничтожте
объект TBitMap.Free;.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
Ошибка при установке "critical errors were found in setup" tsergey Софт 1 13.03.2009 03:58
"Ошибка приложения" при запуске мидлета hotman Общие вопросы по Java, Java SE, Kotlin 0 04.09.2008 15:16
Ошибка при "управлении вложениями"!!! Altera О форуме и сайтах клуба 1 09.03.2008 15:38
Что такое "дескриптор" и с чем его едят? Snake_ua Win Api 3 30.10.2007 11:17