|
Delphi2010 ジェスチャ(4) 2010/11/27 |
前回までは、ジェスチャの「標準ジェスチャ」「カスタムジェスチャ」「対話型ジェスチャ」について見てきました。今回は、[Gestures]内にあるほかのコンポーネントについて見ていきます。
テスト29(フォルダ「029」)として新規に作成します。まずは、パネル Panel1 を配置し、[Gestures]内の ジェスチャマネージャ GestureManager1 を配置し、<オブジェクトインスペクタ>にて、パネルのTouchプロパティ内の GestureManagerプロパティ欄の右端の▼をクリックして「GestureManager1」にします。
取り合えず、パネル Panel1 標準ジェスチャを全部チェックを入れておきます。そしてパネル Panel1 の OnGesture イベントハンドラを下記のようにしておきます。
procedure TForm1.Panel1Gesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
id : integer ;
begin
id := EventInfo.GestureID ;
Panel1.Caption := IntToStr(id)+':('
+ IntToStr(EventInfo.Location.X) + ','
+ IntToStr(EventInfo.Location.Y) + ')' ;
end; |
この状態で、保存・コンパイル(再構築)・実行を行い、正常動作することを確認しておきます。
さて、それでは [Gestures]内のジェスチャリストビュー GestureListView を配置してみます。1つ目ですので Nameプロパティは GestureListView1 となります。
↓
<オブジェクトインスペクタ>にて、GestureManagerプロパティ欄の右端の▼をクリックして「GestureManager1」にします。
この状態で、保存・コンパイル(再構築)・実行を行います。パネル上でタッチをしてみたら自動的にジェスチャリストビューの内容が反映されるのだろう、と期待してみましたが、うんともすんとも反応ありません。他に何らかのプロパティがあるのかと見ても、それらしきものは見当たりません。ヘルプの「GestureCtrls.TGestureListView」には、
TGestureListView は、TGestureManager コンポーネントおよび TGesturePreview コンポーネントに接続できる、2 つのプロパティを公開します。TGestureListView は、ユーザーがジェスチャを管理、表示、および選択できるアプリケーションを設計するときに、非常に便利です。 |
とありますが、正直、何をどうすればよいのか、さっぱり分かりませんし、何が便利なのかも分かりません。
仕方がありませんので、試しに、上記のパネル Panel1 の OnGesture イベントハンドラを下記のようにしてみます。
procedure TForm1.Panel1Gesture(Sender: TObject;
const EventInfo: TGestureEventInfo; var Handled: Boolean);
var
id : integer ;
begin
id := EventInfo.GestureID ;
Panel1.Caption := IntToStr(id)+':('
+ IntToStr(EventInfo.Location.X) + ','
+ IntToStr(EventInfo.Location.Y) + ')' ;
if (id <> 0) then
GestureListView1.AddGesture(id);
end; |
この状態で、保存・コンパイル(再構築)・実行を行ってみます。いくつか標準ジェスチャの動きを試してみます。
なるほど、このように表示されるのだな、とは分かりますが、ジェスチャリストビューのGestureManagerプロパティを「GestureManager1」に指定した意味は全くありませんし、このAddGestureメソッドのヘルプでも、
直接 AddGesture メソッドを呼び出さないでください。そのジェスチャリストビューコントロールは、GestureManager プロパティで指定した、関連付けられたジェスチャマネージャコントロールからその項目を追加するように設計されています。 |
のように記載されていて、まるで自動的に内容が追加されるような感じに読めます。
しかし・・・
なお、この AddGestureメソッドの引数の GestureID値は、0値や、対話型ジェスチャの259〜の値を入れると例外が発生します。
次に、 [Gestures]内のジェスチャプレビュー GesturePreview を配置してみます。1つ目ですので Nameプロパティは GesturePreview1 となります。
↓
<オブジェクトインスペクタ>にて、GestureProviderプロパティ欄の右端の▼をクリックして「GestureListView1」にします。
この状態で、保存・コンパイル(再構築)・実行を行ってみます。いくつか標準ジェスチャの動きを試して、ジェスチャリストビューに項目を追加します。
ジェスチャリストビューに追加された項目をクリックすると、ジェスチャプレビューにその動きが表示されます。
こう考えてみると、使い方としては逆で、ジェスチャリストビューには予め利用できる標準ジェスチャ一覧を表示させておいて、ジェスチャプレビューも追加しておいて、パネル上で利用出来るジェスチャの解説を行う、というような使い方の方が自然なのかもしれません。タッチ/マウスジェスチャを何らかの機能に割り当てて、その機能解説を行うとか、ユーザーカスタマイズをさせる等も含めて。
次に、 [Gestures]内のジェスチャレコーダー GestureRecorder を配置してみます。1つ目ですので Nameプロパティは GestureRecorder1 となります。ラベルとエディットも1つずつ配置しておきます。ラベルの Captionプロパティは、「ジェスチャ名:」としておきます。
↓
<オブジェクトインスペクタ>にて、GestureManagerプロパティ欄の右端の▼をクリックして「GestureManager1」にします。Colorプロパティを「clWhite」にします。
ジェスチャレコーダー GestureRecorder1 の OnGestureRecorded イベントハンドラを下記のようにします。
procedure TForm1.GestureRecorder1GestureRecorded(Sender: TObject;
RecordedGesture: TGestureCollectionItem);
begin
RecordedGesture.Name := Edit1.Text ;
end; |
この状態で、保存・コンパイル(再構築)・実行を行ってみます。
ジェスチャ名を入力して
ジェスチャレコーダーの箇所でタッチ操作orマウスドラッグ
↓
軌跡が出ます
↓
指/マウスボタンを離すと登録されます
なぜか ジェスチャリストビューに出ます
パネル上で操作して動作確認します
この場合、ジェスチャ名に同じ名前を入れて登録してしまうと、例外が発生し、以降、おかしな状態になってしまいます。ですのでそれを避けるため、少しややこしいですが、同じ名前を入れてしまったら、「~1」「~2」・・・と付けるようにしてみます。
procedure TForm1.GestureRecorder1GestureRecorded(Sender: TObject;
RecordedGesture: TGestureCollectionItem);
var
s : string ;
i : integer ;
begin
s := Edit1.Text ;
try
RecordedGesture.Name := s ;
except
i := 1 ;
while (i > 0) do begin
Edit1.Text := s + '~' + IntToStr(i) ;
try
RecordedGesture.Name := Edit1.Text ;
i := 0 ;
except
Inc(i);
end;
end;
end;
end; |
なお、このイベントハンドラ内で、RecordedGesture.GestureIDの値によりカスタムジェスチャの ID を取得する事が出来ます。カスタムジェスチャのID値は、-1、-2、・・・となるようです。また、GestureManager1.CustomGestureCount の値により、カスタムジェスチャの数を取得する事が出来ます。
パネル上で登録したカスタムジェスチャの操作をすると、1つ目はそれなりに認識することはできるのですが、何故かは不明ですが、2つ目以降がほとんど認識されません。もしかすると、カスタムジェスチャを作成した後に パネル Panel1 の Touch プロパティ〜Gesturesプロパティ〜の利用ジェスチャのチェックが行われていないのかもしれません。という訳で上記のイベントハンドラで強制的にチェックを行わせるようにしてみます。
procedure TForm1.GestureRecorder1GestureRecorded(Sender: TObject;
RecordedGesture: TGestureCollectionItem);
・・・
Panel1.Touch.SelectGesture(RecordedGesture.GestureID) ;
end; |
多少強引のような気もしますが・・・。ちなみにこの SelectGestureメソッドのヘルプには説明文の記載がありませんので、実質これで正解なのかどうかは「?」ですが、想定通り、認識はできるようになっています。
なお、作成したカスタムジェスチャ情報は、起動時にでもジェスチャマネージャ GestureManager1 の FileNameプロパティに保存ファイル名を指定しておいて、そのファイルが存在すれば LoadFromFileメソッドで開き、各カスタムジェスチャの利用チェックをオン状態にするようにしておき、プログラム終了時にでも SaveToFileメソッドで保存するようにしておけば再利用可能です。
となってくると、ジェスチャリストビューは、操作したジェスチャ履歴などを表示させる方法もあるでしょうけれども、標準ジェスチャ・カスタムジェスチャの一覧を表示しておく、という事でも良いかもしれません。ジェスチャリストビューにはグループ化の機能もありますので、それを利用して、いろんな使い分けをするという事でも良いかもしれません。
このほか、ジェスチャ関係では、様々なプロパティやイベントやメソッドもありますが、取り合えずこの辺りで終わりにしておきます。イロイロと面白そうな事は出来そうな気がします。
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
>Delphi入門編
>Delphi2010
▲2010/11/26
2010/11/27
▼2010/11/28
シェアウェア
Script!World
データベース
|