Я пытаюсь использовать растровое изображение. Это отлично работает в 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 //
Этот код неверен на всех платформах.
Image.Bitmap.Create (w, h);
Запускает конструктор на уже построенном экземпляре. Вы не хотите этого делать. Вы можете уйти с ним на некоторых платформах, но это не так.
Задайте размеры растрового изображения следующим образом:
Image.Bitmap.SetSize(w, h);
Возможно, вы захотите также вызвать Clear на растровом изображении.
TBitmap
не предназначен для поддержки такого использования. Язык это позволяет, но класс должен это поддерживать. И это не так. И я вполне уверен, что языковая особенность не устарела.