2016-11-18 3 views
0

Dies ist mit Delphi Berlin 10.1 Update 2Wie eine Linie in Delphi auf einer FMX Leinwand zeichnen

Folgenden Werken (erhalte ich eine Linie gezeichnet):

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; 

Die folgenden nicht funktioniert:

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

Warum kann ich nicht die zweite verwenden? Wie kann ich es zum Laufen bringen, oder sollte ich wie im ersten Beispiel einen Strichpinsel erstellen?

Ich habe eine minimale Anwendung enthalten:

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

Der Code in Ihrem zweiten Beispiel ist in Ordnung. Bitte zeigen Sie [mcve]. Versuchen Sie vielleicht, außerhalb der 'Paint'-Methode oder' OnPaint'-Handler zu zeichnen? –

+2

'Stroke.Kind: = TBrushKind.bkSolid;' kann auf Android benötigt werden, da es standardmäßig 'bkNone' ist. Unter Windows lautet der Standardwert "bkSolid". –

+0

Ich habe die minimalen Dateien hinzugefügt, die benötigt werden, um das Problem zu zeigen – imekon

Antwort

3

Frühere Versionen von Delphi hatten verschiedene Standardwerte für r Stroke.Kind je nach Plattform.

Seit Delphi 10.1 Berlin scheint der Standardwert None für alle Plattformen zu sein. (Danke @TomBrunberg)

Um die Linie erscheinen, setzen Stroke.Kind := TBrushKind.Solid;

Hinweis: Getestet unter Windows 8,1


habe ich eine neue Metropole FMX-Anwendung als auch, wo die Zeichnung gearbeitet ohne die Stroke.Kind einzustellen. Kann das aber nicht erklären.


Ein ähnlicher Bericht wurde bei QP, RSP-16313 The Canvas.DrawLine doesn't work at Windows XP (32 bit) forms eingereicht. Hier manifestiert sich das Problem unter Windows-XP, aber nicht unter Windows-7.

+0

Bingo! Stroke.Kind: = TBrushKind.Solid war die Antwort. Aber warum wurde solch ein seltsamer Standard hinzugefügt? – imekon

+0

Ich weiß es nicht. Vielleicht ist der Wert überhaupt nicht beständig, sondern hängt vom Kontext ab. Wie auch immer, es immer vor dem Schreiben fest zu machen, funktioniert unter allen Umständen. –

0

ist es sehr seltsam, dass der erste Fall Arbeit ist.

Sie sollten Strichbürste verwenden.

Und Sie sollten BeginScene und Endscene anstelle von BeginUpdate und EndUpdate verwenden. Dieses Fragment funktioniert perfekt:

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

Die Frage besagt, dass die Verwendung eines separaten Pinsels funktioniert und fragt, warum die Verwendung von DrawLine ohne einen solchen Pinsel nicht funktioniert. Die Verwendung von BeginScene/EndScene in einem OnPaint-Ereignis ist nicht erforderlich. –

+0

Das funktioniert nicht - auch wenn ich BeginScene/EndScene verwende: mit Canvas do beginne BeginScene; Stroke.Color: = TAlphaColors.Black; Stroke.Thickness: = 2,0; DrawLine (PunktF (10, 10), PunktF (100, 10), 1); Endszene; Ende; – imekon