Konwersja VCL na FMX

0

Witam. Jestem raczej nowicjuszem w Delphi więc z góry przepraszam jeśli pytanie jest oczywiste.

Mam pewien program który napisałem sobie korzystając z poradników w VCL i ten program działa. Chciałbym teraz ten sam program uruchomić na Androidzie, a tym samym muszę przejść na FireMonkey. I tutaj zaczęły się schody. Mam taki oto kod:

  Image1.Canvas.FillRect(Canvas.ClipRect);
  Image1.Canvas.Pen.Width:=1;
  Image1.Canvas.Pen.Color:=cLBlack;

  with Form1 do begin
      for i := 0 to 360 do
        if (i mod 15)=0 then
        begin
          Image1.Canvas.MoveTo(PozycjaX,PozycjaY);
          Image1.Canvas.LineTo(Round(PozycjaX+PromienP*sin(i*pi/180)),Round(PozycjaY+PromienP*cos(i*pi/180)));
        end;
      for i := 0 to PromienP do
        if (i mod 20)=0 then
        begin
          Image1.Canvas.Arc(PozycjaX+i,PozycjaY+i,PozycjaX-i,PozycjaY-i,PozycjaX+i,PozycjaY+i,PozycjaX+i,PozycjaY+i);
        end;

Czyli po prostu rysowanie na TImage coraz większych okręgów. Niestety mam duży problem z napisaniem tego samego w FireMonkey. O ile zrozumiałem że MoveTo i LineTo łączy się teraz w jedno DrawLine, to kompletnie nie wiem jak przejść ze starego Arc na nowe DrawArc. To co mi się udało do teraz zrobić to:

Image1.Bitmap.Clear($FFFFFF);
 Image1.Bitmap.Canvas.Stroke.Color := TAlphaColors.Black;
 Image1.Bitmap.Canvas.Stroke.Thickness := 1;
  p1 := TPointF.Create(PozycjaX, PozycjaY);

  Image1.Bitmap.Canvas.BeginScene;
  with Form1 do begin
      for i := 0 to 360 do
        if (i mod 15)=0 then
        begin
          p2 := TPointF.Create(Round(PozycjaX+PromienP*sin(i*pi/180)), Round(PozycjaY+PromienP*cos(i*pi/180)));
          Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
        end;
      for i := 0 to PromienP do
        if (i mod 20)=0 then
        begin
          //Image1.Bitmap.Canvas.Arc(PozycjaX+i,PozycjaY+i,PozycjaX-i,PozycjaY-i,PozycjaX+i,PozycjaY+i,PozycjaX+i,PozycjaY+i);
        end;
  Image1.Bitmap.Canvas.EndScene;
  end;

Wykomentowana jest linijka której nie potrafię sam wymienić na wersję działającą w FireMonkey. Efekt który chciałbym uzyskać to coś takiego:
screenshot-20190319231010.png
Z góry dziękuję za pomoc jak to ruszyć.

1

Tutaj jest wyjaśnienie – FireMonkey XE3 DrawArc and FillArc on the form and a TImage Bitmap. Są źródła do pobrania, więc pobierz i pobaw się tym kodem trochę.

Z tego co widzę, BeginScene woła się przed ustawianiem właściwości płótna.

Poza tym do malowania różnych rzeczy używa się komponentów klasy TPaintBox, a nie TImage. Smutne, że nawet w oficjalnych tutorialach sugeruje się ten drugi komponent do bazgrołów.

1

firemonkey draw on canvas i masz nawet wideo tutoriale

0

Witam, dziękuję za odpowiedzi. Mam jednak jeszcze jeden problem z którym nie potrafię sobie poradzić.
Generalnie osiągnąłem to co oczekiwałem i program skompilowany pod Win32 wykonuje to co ma robić.

for i := 0 to 360 do
  if (i mod 15)=0 then
  begin
    p1 := TPointF.Create(PozycjaX, PozycjaY);
    p2 := TPointF.Create(Round(PozycjaX+200*sin(i*pi/180)), Round(PozycjaY+200*cos(i*pi/180)));
    Image1.Bitmap.Canvas.DrawLine(p1, p2, 100);
  end;
  
for i := 0 to 200 do
  if (i mod 20)=0 then
  begin
    prst1 := TRectF.Create(PozycjaX+i,PozycjaY+i,PozycjaX-i,PozycjaY-i);
    Image1.Bitmap.Canvas.DrawEllipse(prst1, 100);
  end;

Tu jest wycinek kodu który to realizuje. Wszystko jest super, tylko niestety kiedy kompiluję ten sam kod już pod Androidem, wykonuje się tylko jego pierwsza część - rysowanie linii. Tak jakby funkcja DrawEllipse wykonywała się tylko w programie skompilowanym pod Windows, a Android ją kompletnie ignorował, przy identycznym kodzie źródłowym. Czy ma ktoś pomysł czym to może być spowodowane? Z góry dziękuję za każdą podpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1