Андрей Рулин Опубликовано 18 июля, 2020 Поделиться Опубликовано 18 июля, 2020 (изменено) Данный код работает в windows-32 , но не хочет работать в Android. Form1.Canvas.BeginScene; Form1.Canvas.Fill.Kind := TBrushKind.bkSolid; Form1.Canvas.Fill.Color := TAlphaColorRec.Red; form1.Canvas.FillRect(fs,0,0,AllCorners,1); Form1.Canvas.EndScene; Просто ничего не отрисовывается. В чём может быть причина? Прикрепляют также тестовый проект, вдруг на какой-то версии он нормально работает. Test.rar Изменено 19 июля, 2020 пользователем Андрей Рулин Цитата Ссылка на комментарий
1 krapotkin Опубликовано 20 июля, 2020 Поделиться Опубликовано 20 июля, 2020 потому что нельзя рисовать где попало когда захочется есть событие OnPaint - его и используйте Андрей Рулин и Ingalime 2 Цитата Ссылка на комментарий
0 Андрей Рулин Опубликовано 21 июля, 2020 Автор Поделиться Опубликовано 21 июля, 2020 Да , так работает лучше, но всё же всё-рано что-то не так. Вот я отрабатываю клик мышкой. TestRect.Left := XToEtalon(X)-50; TestRect.Top := XToEtalon(Y)-50; FormPaint(Sender,Canvas,TestRect); WriteToLog(report,FloatToStr(X)+' , '+ FloatToStr(Y)); И соотвественно, redraw(0,0,1,false); redraw(Round(ARect.Left),Round(ARect.Top),1,true); В итоге в Win32 всё работает отлично - куда я щёлкаю мышкой, появляются прямоугольники. В Android - нулевая реакция. При этом в логе записывается , что клик произошёл. Test2.rar Цитата Ссылка на комментарий
1 krapotkin Опубликовано 21 июля, 2020 Поделиться Опубликовано 21 июля, 2020 ну так еще раз - нельзя рисовать где попало когда захочется FormPaint это обработчик события когда у системы есть настроение порисовать. Просто кликать мышью для этого недостаточно Нужно заявить, что эта часть окна невалидна. По мне, так то, что в Windows это работает - это скорее упущение, баг, а не фича )) Вот после инвалидации система вызовет Paint. На Windows точно так же Цитата Ссылка на комментарий
0 Андрей Рулин Опубликовано 21 июля, 2020 Автор Поделиться Опубликовано 21 июля, 2020 Увы, и это не работает. InvalidateRect(WinRect); //FormPaint(Sender,Canvas,TestRect); WinRect - посылается размер окна. Естественно на win32 работает и этот вариант. Цитата По мне, так то, что в Windows это работает - это скорее упущение, баг, а не фича )) Ну на VCL - это был скорее фича , можно было всё без танцев с бубном делать. Но на FMX на разных платформах должно работать единообразно - или везде или нигде. ПОтому , что любую программу надо будет тестировать на win32/64 , потом так же тщательно на Android , а потом ещё и на IoS. Вот у меня устойств с IOS нет , я уже понял, то доступ раз в недёлю "отца русской демократии" не спасёт. Цитата Ссылка на комментарий
1 krapotkin Опубликовано 21 июля, 2020 Поделиться Опубликовано 21 июля, 2020 Если вы хотите на чем-то рисовать, не надо портить стены, возьмите бумагу, холст там.. Специально придуман PaintBox именно для ваших целей. Но для демо ровно то же самое вместо PaintBox.OnPaint сделал на Form.OnPaint Работает одинаково, на windows и android. Уверен, что ровно так же все будет на всех остальных ОС. type TForm1 = class(TForm) procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); private FCrd: TPointF; public end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FCrd := PointF(X,Y); end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin Invalidate; end; procedure TForm1.FormPaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); begin Canvas.Fill.Color := TAlphaColorRec.Wheat; Canvas.FillRect(rectf(FCrd.X, FCrd.Y, FCrd.X+100, FCrd.Y+100), 0,0,[], 1); end; там в проекте еще дофига разных странных решений и ошибок. Но это уже оффтоп... Ingalime и Андрей Рулин 2 Цитата Ссылка на комментарий
0 Андрей Рулин Опубликовано 22 июля, 2020 Автор Поделиться Опубликовано 22 июля, 2020 Большое спасибо! Invalidate действительно работает и в моём проекте тоже, если поставить вместо InvalidateRect. Цитата Ссылка на комментарий
Вопрос
Андрей Рулин
Данный код работает в windows-32 , но не хочет работать в Android.
Form1.Canvas.BeginScene; Form1.Canvas.Fill.Kind := TBrushKind.bkSolid; Form1.Canvas.Fill.Color := TAlphaColorRec.Red; form1.Canvas.FillRect(fs,0,0,AllCorners,1); Form1.Canvas.EndScene;
Просто ничего не отрисовывается. В чём может быть причина?
Прикрепляют также тестовый проект, вдруг на какой-то версии он нормально работает.
Test.rar
Изменено пользователем Андрей РулинСсылка на комментарий
6 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.