1

Delphi XE8 で FireMonkey のクロスプラットフォーム コンポーネントを作成しようとしています...

しかし、私はいくつかの問題に直面しています。Object Inspector でプロパティ "Width" と "Height" をコンパイルするように設定しましたが、明らかにサイズ設定は無視されます。プロジェクトを再度開くと、コンポーネントも小さくなります。(幅と高さの設定が DFM ファイルに保存されていないことに気付きました)。

注: FireMonkey の他のすべてのネイティブ コンポーネントは正常に動作しますが、私のカスタムではありません。

どうしたの?

unit FMX.Card;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls, FMX.Graphics, System.Types;

type

TCardNum = (Ace, Deuce, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King);

TCardSuit = (Clubs, Diamonds, Hearts, Spades);

TCard = class(TControl)
private
  { Private declarations }
  FCardBack: TBitmap;
  FCardDown: Boolean;
  FCardSet: TBitmap;
  FCardNum: TCardNum;
  FCardSuit: TCardSuit;
  procedure SetCardDown(AValue: Boolean);
  procedure SetCardNum(AValue: TCardNum);
  procedure SetCardSuit(AValue: TCardSuit);
protected
  { Protected declarations }
  procedure Paint; override;
public
  { Public declarations }
  constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
  { Published declarations }
  property Position;
  property RotationAngle;
  property Width;
  property Height;
  property CardDown: Boolean read FCardDown write FCardDown;
  property CardNum: TCardNum read FCardNum write FCardNum;
  property CardSuit: TCardSuit read FCardSuit write FCardSuit;
end;

implementation

{$R 'CardResource.res'}

const
  DEFAULT_CARD_WIDTH  = 71;
  DEFAULT_CARD_HEIGHT = 96;

{ TCard }

constructor TCard.Create(AOwner: TComponent);
var
  LRStream: TResourceStream;
begin
  inherited;
  LRStream := TResourceStream.Create(HInstance, 'CardBack', RT_RCDATA);
  try
    FCardBack := TBitmap.CreateFromStream(LRStream);
  finally
    LRStream.Free;
  end;
  LRStream := TResourceStream.Create(HInstance, 'CardSet', RT_RCDATA);
  try
    FCardSet := TBitmap.CreateFromStream(LRStream);
  finally
    LRStream.Free;
  end;
end;

destructor TCard.Destroy;
begin
  FCardBack.Free;
  FCardSet.Free;
  inherited;
end;

procedure TCard.Paint;
var
  LLeft: Single;
  LTop: Single;
begin
  inherited;
  Canvas.BeginScene;
  try
    if FCardDown then
      Canvas.DrawBitmap(FCardBack, TRectF.Create(0, 0, FCardBack.Width, FCardBack.Height), TRectF.Create(0, 0, Width, Height), 1.0)
    else
    begin
      LLeft := Ord(FCardNum) * DEFAULT_CARD_WIDTH;
      LTop := Ord(FCardSuit) * DEFAULT_CARD_HEIGHT;
      Canvas.DrawBitmap(FCardSet, TRectF.Create(LLeft, LTop, LLeft + DEFAULT_CARD_WIDTH, LTop + DEFAULT_CARD_HEIGHT), TRectF.Create(0, 0, Width, Height), 1.0);
    end;
  finally
    Canvas.EndScene;
  end;
end;

4

1 に答える 1

3

解決策は、「プロパティ サイズ;」を追加することです。も公開されています。

published
  { Published declarations }
  property Size;
  property Width;
  property Height;

「高さ」と「幅」を追加するだけでは、設計時にのみ機能します。

私を助けようとしてくれたすべての人に感謝します。

于 2015-06-26T04:36:01.827 に答える