2016-11-18 111 views
0

これは、Delphiベルリン10.1 Update 2のFMXキャンバス上Delphiで線を描画する方法

次作品(私は引かれた線を得る)である:

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; 

以下は動作しません。

なぜ私は2番目のものを使用できませんか?どうすればそれを動作させることができますか、または最初の例のようにストロークブラシの作成に固執すべきですか?

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

2番目の例のコードは問題ありません。 [mcve]を表示してください。 'Paint'メソッドや' OnPaint'ハンドラの外に描画しようとしていますか? –

+2

'Stroke.Kind:= TBrushKind.bkSolid;'はデフォルトでは 'bkNone'なので、Androidでは必要になるかもしれません。 Windowsでは、デフォルト値は 'bkSolid'です。 –

+0

私は問題を表示するのに必要な最小限のファイルを追加しました – imekon

答えて

3

以前のバージョン

私は、最小限のアプリケーションを含めましたデルファイのデフォルト値は異なっていたr Stroke.Kindプラットフォームによって異なります。

デルファイ10.1ベルリン以来、デフォルト値はすべてのプラットフォームでNoneと思われます。 (おかげで@TomBrunberg)

はラインが表示されるようにするには、Stroke.Kind := TBrushKind.Solid;

注意を設定します。


のWindows 8.1でテスト私は描画が働いたとしても、新たなメトロポリスFMXアプリケーションを、作成しましたStroke.Kindを設定しないでください。しかし、それを説明することはできません。


同様のレポートがQPRSP-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

最初のケースが仕事であることは非常に奇妙です。

ストロークブラシを使用してください。

BeginUpdateとEndUpdateの代わりにBeginSceneとEndSceneを使用する必要があります。この断片は完璧​​に機能します:

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; end; – imekon

関連する問題