2016-11-18 13 views
0

Это с Delphi Берлин 10.1 Update 2Как нарисовать линию в Delphi на FMX холсте

следующие работы (я получаю линию, проведенную):

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; 

Ниже не работает:

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

Почему я не могу использовать второй? Как я могу заставить его работать, или я должен придерживаться создания кисти удара, как в первом примере?

Я включил минимальное применение:

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. 
+0

Код в вашем втором примере в порядке. Пожалуйста, покажите [mcve]. Возможно, вы пытаетесь рисовать вне метода «Paint» или «OnPaint»? –

+2

'Stroke.Kind: = TBrushKind.bkSolid;' может понадобиться на Android, так как по умолчанию это 'bkNone'. В Windows значением по умолчанию является 'bkSolid'. –

+0

Я добавил минимальные файлы, необходимые для показа проблемы – imekon

ответ

3

Более ранние версии Delphi имели разные значения по умолчанию для r Stroke.Kind в зависимости от платформы.

С Delphi 10.1 Berlin по умолчанию значение None для всех платформ. (Спасибо @TomBrunberg)

Для того, чтобы появиться линия, установите Stroke.Kind := TBrushKind.Solid;

Примечание: Проверено на Windows, 8.1


Я создал новое приложение Метрополис FMX, а также, где рисунок работал без установки Stroke.Kind. Не могу это объяснить.


Аналогичный отчет был подан в QP, RSP-16313 The Canvas.DrawLine doesn't work at Windows XP (32 bit) forms. Здесь проблема проявляется в Windows-XP, но не в Windows-7.

+0

Бинго! Добавление Stroke.Kind: = TBrushKind.Solid был ответом. Но почему был добавлен такой странный дефолт? – imekon

+0

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

0

Очень странно, что первый случай - это работа.

Вы должны использовать кисть для инсульта.

И вы должны использовать BeginScene и EndScene вместо BeginUpdate и EndUpdate. Этот фрагмент отлично работает:

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; 
+0

В этом вопросе говорится, что использование отдельной кисти работает и спрашивает, почему использование DrawLine без такой кисти не работает. Использование BeginScene/EndScene в событии OnPaint не требуется. –

+0

Это не работает - даже если я использую BeginScene/EndScene: с Canvas do begin BeginScene; Stroke.Color: = TAlphaColors.Black; Толчок. Толщина: = 2.0; DrawLine (PointF (10, 10), PointF (100, 10), 1); EndScene; конец; – imekon

Смежные вопросы