- PR -

Spread におけるキー操作の無効化について

投稿者投稿内容
ピタル
会議室デビュー日: 2007/07/19
投稿数: 5
投稿日時: 2007-07-19 12:55
こんにちは、質問があります。

Spreadを使うにあたって上下左右キーを無効にするため調べたところ、
Spreadのヘルプに以下のコードのが載っていました。

---------------------------------------------------------------------
Dim im As New FarPoint.Win.Spread.InputMap

'非編集セルでの[F2]キーを無効とします
im = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenFocused)
im.Put(New FarPoint.Win.Spread.Keystroke(Keys.F2, Keys.None), FarPoint.Win.Spread.SpreadActions.None)

'編集中セルでの[F2]キーを無効とします
im = FpSpread1.GetInputMap(FarPoint.Win.Spread.InputMapMode.WhenAncestorOfFocused)
im.Put(New FarPoint.Win.Spread.Keystroke(Keys.F2, Keys.None), FarPoint.Win.Spread.SpreadActions.None)

----------------------------------------------------------------------

だたこのコードだと
FpSpread1.ActiveSheet.OperationMode = OperationMode.RowMode
の場合無効化ができません。
OperationMode.Normal の場合は問題なく無効化できたのですが、
RowMode で上下左右キーを無効にできる方法はないでしょうか?

お知恵をお貸しいただければ幸いです。
宜しくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-19 13:31
引用:

ピタルさんの書き込み (2007-07-19 12:55) より:

FpSpread1.ActiveSheet.OperationMode = OperationMode.RowMode の場合無効化ができません。
OperationMode.Normal の場合は問題なく無効化できたのですが、RowMode で上下左右キーを無効にできる方法はないでしょうか?


ByRow の時は CurrentCell の扱いが違うのでないような気がしますね。 もっと上位のところで捕捉して捨てないとダメかもしれません。 たとえばですが、Spread コントロール自体のプロセス キー関係のメソッドなどです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ピタル
会議室デビュー日: 2007/07/19
投稿数: 5
投稿日時: 2007-07-19 16:30
じゃんぬねっとさん返信ありがとうございます。

>もっと上位のところで捕捉して捨てないとダメかもしれません。
>たとえばですが、Spread コントロール自体のプロセス キー関係のメソッドなどです。

とのことですが、具体的にどういったコードを書いてよいかわからず止まってしまいました。
勉強不足ですみません。


色々イベントなどを試してみて

Private Sub FpSpread1_LeaveCell(ByVal sender As Object, ByVal e As _
  FarPoint.Win.Spread.LeaveCellEventArgs) Handles FpSpread1.LeaveCell

End Sub

のメソッドの中に先ほどのキー無効化コードを書くと反応がありました。
ただLeaveCellはユーザーがセルから離れるときに発生するイベントという定義
らしく、一回目は実行されてしまいます(2回目からキーを無効化できました)。

もう少しよい方法があれがご教授願います。


じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-19 16:57
引用:

ピタルさんの書き込み (2007-07-19 16:30) より:

のメソッドの中に先ほどのキー無効化コードを書くと反応がありました。
ただLeaveCellはユーザーがセルから離れるときに発生するイベントという定義らしく、一回目は実行されてしまいます(2回目からキーを無効化できました)。


"キーが無効になって反応しなくなった" という解釈でよろしいでしょうか。 ヘンな話ですね。 Leave イベントならば OK などというシナリオが想定できません。 そもそも最初のコードを書いた場所は当初はどちらだったのでしょうか?

脱線話: 移動させたくないだけならば、LeaveCellEventArgs 引数の Cancel プロパティを true にするだけなのですが、これだとキーによる操作だという判定ができないですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ピタル
会議室デビュー日: 2007/07/19
投稿数: 5
投稿日時: 2007-07-19 17:18
じゃんぬねっとさん、返信ありがとうございます。

>"キーが無効になって反応しなくなった" という解釈でよろしいでしょうか。

はい。Rightキー無効化のコードを書いたのですが、一度目は右にフォーカスが
動いたのですが、2回目からは無反応でしたので、希望通り無効化できたと思っているのですが…。
しかし1回目から無効化にしたいのと、挙動に関しては私もよくわかっていません。

>そもそも最初のコードを書いた場所は当初はどちらだったのでしょうか?

Spreadの初期表示をするときのInit_Spread()というメソッドを作って、
そこに書いておりました。
試しにLoadイベントにも書いてみたのですが、そのときもRowModeでのキーの無効化はできなかったです。

>移動させたくないだけならば、LeaveCellEventArgs 引数の Cancel プロパティを
>true にするだけなのですが、これだとキーによる操作だという判定ができないですね。

脱線話なのでしょうか?
初心者でしてわからないことが多いのですが、なんでも試してみたいと思います。
ピタル
会議室デビュー日: 2007/07/19
投稿数: 5
投稿日時: 2007-07-19 17:25
何度も失礼いたします。

>移動させたくないだけならば、LeaveCellEventArgs 引数の Cancel プロパティを
>true にするだけなのですが、これだとキーによる操作だという判定ができないですね。

試しにやってみました。
じゃんぬねっとさんのおっしゃるとおりでした。
意味がわかりました(汗)
試してから書き込みするようにいたします。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-19 17:34
引用:

ピタルさんの書き込み (2007-07-19 17:18) より:

はい。Rightキー無効化のコードを書いたのですが、一度目は右にフォーカスが
動いたのですが、2回目からは無反応でしたので、希望通り無効化できたと思っているのですが…。
しかし1回目から無効化にしたいのと、挙動に関しては私もよくわかっていません。


なるほど、わかりました。 ところで同様に Down と Up キーは無効化できましたか?

引用:

Spreadの初期表示をするときのInit_Spread()というメソッドを作って、そこに書いておりました。試しにLoadイベントにも書いてみたのですが、そのときもRowModeでのキーの無効化はできなかったです。


ヘンですね。 無効化が効かないわけでないならばタイミング的にはそれで問題ないハズです。 Spread コントロール自体の Enter イベントで同じコードを書いた場合に希望どおりの制御になったりするでしょうか?

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ピタル
会議室デビュー日: 2007/07/19
投稿数: 5
投稿日時: 2007-07-19 18:12
じゃんぬねっとさん、返信ありがとうございます。

解決いたしました!
RowModeでもキーの無効化はできるようです。

引用:
じゃんぬねっとさんの書き込み (2007-07-19 17:34)より:

同様に Down と Up キーは無効化できましたか?



まずこれを試してみました。無効化できました。


引用:
じゃんぬねっとさんの書き込み (2007-07-19 17:34)より:

Spread コントロール自体の Enter イベントで同じコードを書いた場合に希望どおりの制御になったりするでしょうか?



次いでEnterイベントの中に書くと希望どおり一度目からキーを無効化することができました。
さすがにLoadイベントで無効化できないのはおかしいと思い、もう一度試してみたところ、
なぜか無効化にならないので、Loadイベントの中でも書く場所をメソッド呼び出し後など色々試してみました。
・・・書いた場所が悪かったようです。
どうやら、RowMode と定義した後に無効化コードを書くとできるようです。
今まで RowMode と定義する前に書いてたので上書き?のような現象が起こっていたのでしょうか。

丁寧にお付き合いいただいて本当にありがとうございます。

スキルアップ/キャリアアップ(JOB@IT)