How to draw a line in Delphi on an FMX canvas

10.7k Views Asked by At

This is with Delphi Berlin 10.1 Update 2

The following works (I get a line drawn):

brush := TStrokeBrush.Create(TBrushKind.Solid, TAlphaColors.Lightgray);
brush.Thickness := 2;
with Canvas do
begin
    BeginUpdate;
    DrawLine(PointF(10, 10), PointF(100, 10), 1, brush);
    EndUpdate;
end;

The following does not work:

with Canvas do
begin
    BeginUpdate;
    Stroke.Color := TAlphaColors.Black;
    Stroke.Thickness := 2.0;
    DrawLine(PointF(10, 10), PointF(100, 10), 1);
    EndUpdate;
end;

Why can't I use the 2nd one? How can I get it to work, or should I stick to creating a stroke brush as in the first example?

I've included a minimal application:

main.pas

unit main;

interface

uses
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects;

type
    TMainForm = class(TForm)
        PaintBox: TPaintBox;
        procedure OnPaint(Sender: TObject; Canvas: TCanvas);
    private
        { Private declarations }
    public
        { Public declarations }
    end;

var
    MainForm: TMainForm;

implementation

{$R *.fmx}

procedure TMainForm.OnPaint(Sender: TObject; Canvas: TCanvas);
begin
    with Canvas do
    begin
        BeginUpdate;
        Stroke.Color := TAlphaColors.Black;
        Stroke.Thickness := 2.0;
        DrawLine(PointF(10, 10), PointF(100, 10), 1);
        EndUpdate;
    end;
end;

end.

main.fmx:

object MainForm: TMainForm
    Left = 0
    Top = 0
    Caption = 'Form1'
    ClientHeight = 480
    ClientWidth = 640
    FormFactor.Width = 320
    FormFactor.Height = 480
    FormFactor.Devices = [Desktop]
    DesignerMasterStyle = 0
    object PaintBox: TPaintBox
        Position.X = 16.000000000000000000
        Position.Y = 16.000000000000000000
        Size.Width = 609.000000000000000000
        Size.Height = 449.000000000000000000
        Size.PlatformDefault = False
        OnPaint = OnPaint
    end
end

test.dpr:

program test;

uses
   System.StartUpCopy,
   FMX.Forms,
   main in 'main.pas' {MainForm};

{$R *.res}

begin
    Application.Initialize;
    Application.CreateForm(TMainForm, MainForm);
    Application.Run;
end.
2

There are 2 best solutions below

2
LU RD On BEST ANSWER

Earlier versions of Delphi had different default values for Stroke.Kind depending on platform.

Since Delphi 10.1 Berlin, the default value seems to be Nonefor all platforms. (Thanks @TomBrunberg)

To make the line appear, set Stroke.Kind := TBrushKind.Solid;

Note: Tested on Windows 8.1


I created a new Metropolis FMX application as well, where the drawing worked without setting the Stroke.Kind. Can't explain that though.


A similar report was filed at QP, RSP-16313 The Canvas.DrawLine doesn't work at Windows XP (32 bit) forms. Here the problem manifests on Windows-XP but not on Windows-7.

2
Dimsa On

it's very strange that first case is work.

You should use stroke brush.

And you Should use BeginScene and EndScene instead of BeginUpdate and EndUpdate. This fragment works perfect:

  Brush := TStrokeBrush.Create(TBrushKind.Solid, TAlphaColors.Black);
  Brush.Thickness := 2;
  with Canvas do
  begin
    BeginScene();
    DrawLine(PointF(10, 10), PointF(100, 10), 1, Brush);
    EndScene;
  end;