AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
DelphiXE3 [FMX] 切り抜き効果(CropEffect) 2013/12/15
 
前回は [Effects]内の「透視変換効果」(PerspectiveTransformEffect)
について見てみました。次は同じく [Effects]内の
「切り抜き効果」(CropEffect)を見てみます。
 
 
[Effects]内
FMX
 
ヘルプより。
TCropEffect は、表示オブジェクトのテクスチャから矩形領域を切り抜く効果を作成するためのクラスです。詳細は、「TImageFXEffect」および「FireMonkey の画像効果」を参照してください。
 
切り抜いてオブジェクトのテクスチャとして表示する矩形領域は、LeftTop プロパティと RightBottom プロパティで指定されます。
 
切り抜かれた領域はオブジェクトの左上隅に再配置され、必要に応じて、オブジェクトの境界に合わせて拡大されます。
 
クロップ、クリッピング、トリミング、切り抜き、切り取り、、、
 

 
LeftTop
切り取り効果のための四角形の、左上座標を示します。
 
LeftTop は、TPointF 型です。 LeftTop に、左上座標と一緒に TPointF 値を割り当てるか、次のように PointF 関数を使用します:
CropEffect1.LeftTop := PointF(0, 0);
LeftTop が明示的に変更されていない場合、(0,0) と見なされます。オブジェクト イメージが切り取られた後、切り取られた領域は、オブジェクトの左上隅に再配置され、そのオブジェクトの境界に合うようにサイズ変更されます。
RightBottom
切り取り効果のための四角形の、右下座標を示します。
 
RightBottom は、TPointF 型です。 RightBottom に、右下座標と一緒に TPointF 値を割り当てるか、次のように PointF 関数を使用します:
CropEffect1.RightBottom := PointF(150, 150);
RightBottom が明示的に変更されていない場合、(150,150) と見なされます。オブジェクト イメージが切り取られた後、切り取られた領域は、そのオブジェクトの境界に合うようにサイズ変更されます。
 
Trigger
トリガ条件を保有するプロパティ。
それぞれのトリガ条件は、プロパティ名、等号記号、トリガ値で構成されます。すべての組み込みトリガはブール値です。したがって、それらの値は True または False でなければなりません。 例:
IsMouseOver=true;IsPressed=false
トリガの値を設定は、 オブジェクト インスペクタで最も簡単に行えます。
トリガ説明
IsDragOverコントロールがドラッグされている(マウス ボタンがクリックされ、かつ押されたままになっている)際に、効果を発生させます。
IsFocusedコントロール上にフォーカスがある際に、効果を発生させます。
IsMouseOver マウスがコントロールの上を通過した際に、効果を発生させます(HitTest が True に設定されている必要があります)。
IsVisibleコントロールが画面上に表示されている際に、効果を発生させます。
その他の組み込みトリガには、以下のものがあります。
・IsActive(TCustomForm)
・IsChecked (TMenuItem)
・IsOpen (TEffect)
・IsPressed (TCustomButton)
・IsSelected(MenuItem、TTabItem、TListBoxItem、TTreeViewItem)
効果トリガに関するさらなる情報については、「FireMonkey の画像効果」の「効果のトリガ」を参照してください。
 
それでは少し試してみます。
 
フォーム上にイメージコンポーネント1つを配置します。回転系の効果の中心点が[150,150]との事ですから、イメージコンポーネントのサイズを 300×300 にしておきます。それに Windows7 標準のサンプルピクチャの「アジサイ.jpg」を指定しています。

 
このイメージに対して効果を掛けるようにします。
本コンポーネントを配置し、構造ビューでドラッグして、上記で配置したイメージの子になるようにします。

 
LeftTop のデフォルト値は [0 , 0]、
RightBottom のデフォルト値は [150 , 150]、となっています。
 
ですので初期状態は、左上〜中心 の部分が切り抜かれて表示されている、という事になります。プログラムコードにて、左上〜中央下 の部分を切り抜いて表示させるようにしてみます。以下のようにフォーム表示時のイベントハンドラを記述します。
procedure TForm1.FormShow(Sender: TObject);
begin
 CropEffect1.LeftTop   := PointF( 0, 0);
 CropEffect1.RightBottom := PointF(150,300);
end;
これで保存・コンパイル(ビルド)・実行をすると下図のようになります。

想定通りですね。
 
次に、右半分を切り抜いて表示させたいとします。普通に考えれば、以下のように記述すれば良いでしょうか?
procedure TForm1.FormShow(Sender: TObject);
begin
 CropEffect1.LeftTop   := PointF(150, 0);
 CropEffect1.RightBottom := PointF(300,300);
end;
これで保存・コンパイル(ビルド)・実行をすると下図のようになります。

全くの想定外ですね。
 
一体、どのようにすれば、思ったような結果が得られるのでしょうか?
色々とやってみた結果、
procedure TForm1.FormShow(Sender: TObject);
begin
 CropEffect1.LeftTop   := PointF(300, 0);
 CropEffect1.RightBottom := PointF(450,300);
end;
これで保存・コンパイル(ビルド)・実行をすると下図のようになります。

 
なぜ、このように指定しないといけないのか、全く意味が分かりません。イメージオブジェクト Image1 の WrapMode値の問題でも無さそうですし、元画像の大きさや、イメージオブジェクトの大きさ、等の問題でも無さそうです。
 
中央〜右下部分を切り抜いて表示させたい場合は、以下のように記述します。
procedure TForm1.FormShow(Sender: TObject);
begin
 CropEffect1.LeftTop   := PointF(300,300);
 CropEffect1.RightBottom := PointF(450,450);
end;
これで保存・コンパイル(ビルド)・実行をすると下図のようになります。

 
他の画像にしたり、イメージオブジェクトの大きさを変えてみたり、様々な状況での確認は行なっていませんので、どのようにすれば「正解」なのかは分かりませんが、いずれにせよ、このコンポーネントを利用する場合には注意したほうがよさそうです。
 
これは、DelphiXE3(update2)での特有の問題なのでしょうか?
 
試しに、同じPCに入れてある DelphiXE4 update1 で同じプロジェクトを開き、実行してみますと、切り抜き状況は同じ感じの様子ですが、こちらではなんと、拡大表示されません。ヘルプでは「拡大されます」とあるにも関わらず、です。XE、XE2でも異なるのかもしれません。仮に、動作させるPC環境、プラットフォームによって動作が異なってくるのであれば、もう、どれが「正解」なのか分からないですね。
 
 
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
>DelphiXE3
▲2013/12/14
 2013/12/15
▼2013/12/15
 
シェアウェア
Script!World
データベース
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015. By AFsoft All Rights Reserved.