Код ведет себя по-разному в Android и Windows

1

Я пытаюсь использовать растровое изображение. Это отлично работает в Windows, но создает ошибку сегментации в Android (во всяком случае, что говорит Delphi, я просто не вижу реакции на Android). У меня есть мобильный проект, форма которого содержит только TToolbar, TSpeedButton, два TLabels и TImage. Там только один обработчик события для клика TSpeedButton.

Когда я прокомментирую все ниже комментария, код отлично работает в Android. Когда я пытаюсь следовать с отладчиком, код отлично работает до конца процедуры. не видя чертежа или сбоя скремблирования. Когда я позволяю ему работать с ошибкой.

Что я делаю неправильно?

procedure TForm2.Button_DrawClick (Sender: TObject);
var rct: TRectF;
    h, w: Int32;
begin
  h := Trunc (Image.Height);
  w := Trunc (Image.Width);
  Label_Height.Text := IntToStr (h);
  Label_Width .Text := IntToStr (w);
  rct := TRectF.Create(20, 20, w - 20, h - 20);
// can be commented out below //
  Image.Bitmap.Create (w, h);
  if Image.Bitmap.Canvas.BeginScene then
  try
    Image.Bitmap.Canvas.Stroke.Color := $FF0000FF;
    Image.Bitmap.Canvas.StrokeThickness := 3;
    Image.Bitmap.Canvas.DrawEllipse (rct, 20);
    Image.Bitmap.Canvas.Stroke.Color := $FF00FF00;
    Image.Bitmap.Canvas.DrawRect(rct, 0, 0, AllCorners, 40);
  finally
    Image.Bitmap.Canvas.EndScene;
  end; // try..finally
end; // Button_DrawClick //
Теги:
graphics
delphi-xe5
bitmap

1 ответ

3
Лучший ответ

Этот код неверен на всех платформах.

Image.Bitmap.Create (w, h);

Запускает конструктор на уже построенном экземпляре. Вы не хотите этого делать. Вы можете уйти с ним на некоторых платформах, но это не так.

Задайте размеры растрового изображения следующим образом:

Image.Bitmap.SetSize(w, h);    

Возможно, вы захотите также вызвать Clear на растровом изображении.

  • 0
    Насколько я знаю, это не ошибка. «Когда конструктор вызывается с использованием ссылки на объект (а не ссылки на класс), он не создает объект. Вместо этого конструктор работает с указанным объектом, выполняя только операторы в реализации конструктора, а затем возвращает ссылку на объект." - docwiki.embarcadero.com/RADStudio/XE5/en/Methods
  • 0
    @ Inspired Нет, это ошибка. FMX TBitmap не предназначен для поддержки такого использования. Язык это позволяет, но класс должен это поддерживать. И это не так. И я вполне уверен, что языковая особенность не устарела.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню