2016-11-18 42 views
0

這是用Delphi柏林10.1更新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有不同的默認值fo r Stroke.Kind取決於平臺。

自德爾福10.1柏林以來,所有平臺的默認值似乎爲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不起作用。在OnPaint事件中使用BeginScene/EndScene不是必需的。 –

+0

這不起作用 - 即使我使用BeginScene/EndScene:使用Canvas做 begin BeginScene; Stroke.Color:= TAlphaColors.Black; Stroke.Thickness:= 2.0; DrawLine(PointF(10,10),PointF(100,10),1); EndScene; 結束; – imekon