Перейти к содержанию
Fire Monkey от А до Я
  • 0

[Android] Почему возникает ошибка ECanvasException 'Handle not allocated'?


Steepe_Hare

Вопрос

Под Windows 32  приложение собирается и работает отлично, под Android при запуске из RAD-среды сразу говорит: Project project1.apk raised exception class ECanvasException with message 'Handle not allocated' и отказывается работать.

В чем может быть причина?

Ссылка на комментарий

Рекомендуемые сообщения

  • 0
  • Модераторы
1 минуту назад, Steepe_Hare сказал:

Под Windows 32  приложение собирается и работает отлично, под Android при запуске из RAD-среды сразу говорит: Project project1.apk raised exception class ECanvasException with message 'Handle not allocated' и отказывается работать.

В чем может быть причина?

ну желательно код показать

Ссылка на комментарий
  • 0
53 минуты назад, ZuBy сказал:

ну желательно код показать

Выбрасывает на модуль FMX.Canvas.GPU в конструктор:

 

constructor TCanvasGpu.CreateFromBitmap(const ABitmap: TBitmap;
  const AQuality: TCanvasQuality = TCanvasQuality.SystemDefault);

....
begin
  ....
  if not Bitmap.HandleAllocated then
    raise ECanvasException.Create('Handle not allocated');

Ссылка на комментарий
  • 0
24 минуты назад, Brovin Yaroslav сказал:

В какой момент создаете битмап?

Вот этот код дает ошибку. Что в нем не так?

var
  MemStream: TMemoryStream;
begin
  Image1.Bitmap.Canvas.BeginScene;
  MemStream := TMemoryStream.Create;
  try
    Image1.Bitmap.Clear(0);
    with TResourceStream.Create(hInstance, PChar('territoria'), RT_RCDATA) do
      try
        SaveToStream(MemStream);
      finally
        Free;
      end;

    MemStream.Position := 0;
    Image1.Bitmap.LoadFromStream(MemStream);
  finally
    Image1.Bitmap.Canvas.EndScene;
    MemStream.Free;
  end;

Image1 в дизайн-тайме пустой.

Ссылка на комментарий
  • 0
  • Модераторы
Image1.Bitmap.Canvas.BeginScene; 
...
Image1.Bitmap.Canvas.EndScene;

это тут не нужно, т.к. не работаете с Canvas'ом

Ссылка на комментарий
  • 0
18 минут назад, Brovin Yaroslav сказал:

В каком потоке работаете: В главном или отдельном?

В вашем коде Image.Bitmap пустой.

в главном потоке. Image.Bitmap грузит из ресурсов картинку. Под Win32 всё работает

Ссылка на комментарий
  • 0
13 минут назад, Brovin Yaroslav сказал:

Убедитесь, что Image.Bitmap есть.

Извиняюсь, но не совсем вас понял. Image.Bitmap пустой в дизайн-тайме (а он обязан быть заполненным??). Картинка туда грузится из ресурсов только в ран-тайме.

Ссылка на комментарий
  • 0
  • Администраторы

Дело в том, что у вас Image1.Bitmap, как экземпляр класса TBitmap присутствует. НО в нем нету никакой информации. То есть по факту у него размер равен 0 на 0. Это значит, что для него хендл не будет выделяться (Зачем системе хранить пустой битмап). Поэтому, когда вы пытаетесь с ним поработать и получить доступ к канве, то получаете такую ошибку:

raised exception class ECanvasException with message 'Handle not allocated'

Теперь смотрим ваш код:

Image1.Bitmap.Canvas.BeginScene;

Будет работать с канвой, но хендла нет. отсюда будет исключение.

Image1.Bitmap.Clear(0);

Опять же работает с канвой и пытается очистить пустой битмап.

Image1.Bitmap.LoadFromStream(MemStream);

Это корректный вызов, при загрузке нового битмапа будет выделен хендл на уровне Image1.Bitmap.
Соответственно, вам нужно:

  1. Сформировать новый битмап
  2. Загрузить его в Image1.Bitmap

На Windows используется GDI+/Direct2D канва, которая может работать по другому. А на мобильных платформах GPU, поэтому у вас и возникает ошибка.

Ссылка на комментарий
  • 0
3 часа назад, Brovin Yaroslav сказал:

 

На Windows используется GDI+/Direct2D канва, которая может работать по другому. А на мобильных платформах GPU, поэтому у вас и возникает ошибка.

 

Большое спасибо за подробное объяснение

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...