こんんちは、
不可思議な現象で困っています。
FormにStringGridが配置してあるとEditでTABキーを押しても次へフォーカスが移りません。StringGridを削除すると、移動します。
何故でしょうか?
StringGridを配置したまま、EditからTABキーでフォーカスを移動させることは出来るでしょうか?
StringGridではStringColumnを設定しなかった場合には、EditからTABキーでフォーカス移動します。
StringGridやStringColumnのプロパティはデフォルトから変更していません。
StringColumnの有無でEditからのTAB移動の挙動が違っています。
EditのonKeyDownでTABキーを拾って、無理やりフォーカスを移動させようと思いましたが、pnKeyDownではTABキーが捕まりません。
VCLのonKeyPressと言うイベントはFMXでは存在しない様です。
StringGridにStringColumnを設定したままでEditからTABでフォーカスを移動する事が出来ないでしょうか?
当方、
Windows10+DELPHI XE6 with FMX
です。
手元のXE8と10.3で試してみましたが、問題なく動作するようです。でちょっと調べてみましたが、QPの
[RSP-9838] FMX: TCustomGrid.DialogKey() is not checking for IsFocused and will capture Tab key even if not focused - Embarcadero Technologies
https://quality.embarcadero.com/browse/RSP-9838
がそれっぽい気がします。解決策でなくてすいません。
HFUKUSHIさん、
ありがとうございます。
ログインしないと閲覧出来ない様です。アカウントが良く分かりません。
ちょっと確認してみます。
何やら、XE6のバグ的なものと言う事でしょうか?
参照してみました。
現象は確かにこしらの現象と同じ様です。
ただ、どの様に解釈すれば良いのでしょう?
Resolvedとされていて日付がついていますが、その解決方法が記載されていません。
その日付のコメントも見つかりますが、解決方法の記述もなく、リンクが張ってあるわけでもない様です。
解決・未解決の状態も不明瞭な感じです。
HFUKUSHIさんによりますと、XE8ではその様は現象はみられないとの事です。
XE6では解決されていないと言う事でしょうか?
> Resolvedとされていて日付がついていますが、その解決方法が記載されていません。
> その日付のコメントも見つかりますが、解決方法の記述もなく、リンクが張ってあるわけでもない様です。
> 解決・未解決の状態も不明瞭な感じです。
HFUKUSHI さんが挙げている QP を見てみると、
> 解決状況:修正済み
> 修正バージョン:XE8
と書かれていますね。
あのあとソースを見てみたのですが、TCustomGrid.DialogKeyの実装がXE7とXE8でそれっぽく直されていたので、
XE8で修正されたものと思われます。FMXはアレなんで最新版を使ったほうがいいとは思いますが、
XE7以前の場合の簡易的な回避策としてはStringGridを派生してDialogKeyをoverrideし、IsFocusedがFalseのときは
inheritedを呼び出さない、とかそんな感じになるかと。試してみてまた報告します。
igyさん、HFUKUSHIさん
ありがとうございます。
見方が分かってきました。
XE8以降なら修正されているのですね。
いずれはアップグレードするとして、当面はStringGidの使用を回避するか、自分でStringGridを修正するかでしょうか。
HFUKUSHIさんから示唆があります。
ちょっと試してみたいと思います。
ちょっと試してみたのですが、TABキーを効くようにすることは簡単でも、StringGridの内側と外側をフォーカスが順番に移動するように
するためにはそこそこいろんなことが必要っぽいです。試したコードです。
type
TStringGrid = class(FMX.Grid.TStringGrid)
protected
procedure DialogKey(var Key: Word; Shift: TShiftState); override;
end;
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
Edit2: TEdit;
StringColumn1: TStringColumn;
end;
procedure TStringGrid.DialogKey(var Key: Word; Shift: TShiftState);
begin
if (Key <> vkTab) or (IsFocused = True) then
begin
inherited DialogKey(Key,Shift);
end;
end;
上にも書きましたけど、FMXで最新版を使わない理由はない(VCLなら古いバージョンもありですが)ので、
可能であれば最新版(10.3.3とか10.4.1)に移行してしまうのがよいと思います。
HFUKUSHIさん
ありがとうございました。
ちょっとトライしてみましたが、自分では良く分かりませんでした。
HFUKUSHIさんのコードを使用してみました。
TABキーで、EditからFocusが移動できました。
取り敢えず、問題を回避出来ました。
将来的には最新版のDELPHIへ移行したいと思います。
ツイート | ![]() |