2014-01-19 81 views
3

我需要一個可以根據需要定製的可點擊控件。從Delphi文檔中我收集到一個TRectangle會做的事情。我需要以編程方式創建我的TRectangles,所以我創建了一個Form,一個Panel和一個Button(請參閱下面的代碼)。由於TRectangle是通過TControl的TShape派生的,我測試了是否可以使用PaintTo使用自己的畫布在TRectangle畫布上繪製。我構建的TRectF是在假設繪畫將相對於TRectangle的畫布的情況下創建的,因此需要(0,0)的偏移量。然而,該矩形被繪製在Form的位置(0,0)處!沒有注意到我所做的填充和筆畫屬性的變化。如何在Trectangle的畫布上繪畫

我接下來嘗試了一個FillRect,並再次得到相同的結果,雖然使用了正確的填充。雖然調用來自Trectangle變量.Canvas.FillRect,但它總是相對於樹中最高的父元素,繞過TRectangle和TPanel。我一直認爲繪畫是與Canvas屬於TControl的座標相關的。

這是錯誤的還是TRectangle有什麼特別的?在TRectangle上有更好的繪畫方法嗎?

unit rect_test_main; 

interface 

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

type 
    TForm1 = class(TForm) 
    Panel1: TPanel; 
    Button1: TButton; 

    procedure Button1Click (Sender: TObject); 
    procedure FormCreate (Sender: TObject); 

    protected 
     FR: TRectangle; 

    public 
     procedure draw_paintto (rect: TRectangle); 
     procedure draw_rect (rect: TRectangle); 
     procedure draw_fill (rect: TRectangle); 
     procedure draw (surface: TControl); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

procedure TForm1.FormCreate (Sender: TObject); 
begin 
    FR := Trectangle.Create (Panel1); 
    FR.Parent := Panel1; 
    FR.Canvas.BeginScene; 
    FR.Canvas.Fill.Color := TAlphaColors.Black; 
    FR.Canvas.Stroke.Color := TAlphaColors.Green; 
    FR.SetBounds (200, 200, 50, 300); 
    FR.OnClick := Button1Click; 
    FR.Canvas.EndScene; 
end; // FormCreate // 

procedure TForm1.Button1Click (Sender: TObject); 
begin 
    draw_fill (FR); 
end; 

procedure TForm1.draw_paintto (rect: TRectangle); 
var 
    r: TRectF; 
begin 
    FR.Canvas.BeginScene; 
    FR.Canvas.Fill.Color := TAlphaColors.Black; 
    FR.Canvas.Stroke.Color := TAlphaColors.Green; 
    FR.Canvas.Stroke.Thickness := 10; 
    r := rect.ShapeRect; 
// r := TRectF.Create (TPointF.Create (FR.Position.X - 10, FR.Position.Y - 10), FR.Width, FR.Height); 
    FR.PaintTo (FR.Canvas, r, FR.Parent); 
    FR.Canvas.EndScene; 
end; // draw_paintto // 

procedure TForm1.draw_fill (rect: TRectangle); 
var 
    r: TRectF; 
begin 
    FR.Canvas.BeginScene; 
    FR.Canvas.Fill.Color := TAlphaColors.Black; 
    FR.Canvas.Stroke.Color := TAlphaColors.Green; 
    FR.Canvas.Stroke.Thickness := 10; 
    r := TRectF.Create (TPointF.Create (FR.Position.X, FR.Position.Y), FR.Width, FR.Height); 
    FR.Canvas.FillRect (r, 0, 0, AllCorners, 1); 
    FR.Canvas.EndScene; 
end; // draw_fill // 

回答

3

當在TRectangle一個描繪應該訪問的TRectangle水平和電刷和行程變化畫布上。在這種情況下,所有工作都如預期的那樣,TRectangle的Canvas被繪製。

Key: TRectangle; 
... 
Key.Fill.Color := TAlphaColors.White; 
Key.Fill.Kind := TBrushKind.bkSolid; // and not Key.Canvas.Fill ... 
Key.Stroke.Thickness := 1; 
Key.Stroke.Color := TAlphaColors.Darkgray; 
Key.Paint; 

爲什麼TRectangle繪製其Parent.Parent的畫布(在這種情況下)在其繪圖畫布時,我百思不得其解。也許它沒有Canvas本身,而TRectangle.Canvas只是對其Parent.Canvas的引用?

+1

我有同樣的需求,因爲你有同樣的問題,但是我已經試過您的解決方案和油漆,現在保護上XE5,我仍然得到我的運行時創建矩形沒有顏色(保持透明)其他一切作品。你有沒有嘗試過XE5?任何想法可以分享?謝謝 –