TEditでTABキーを押してもフォーカスが移動しません

解決


yTake  2020-10-25 16:34:23  No: 149270

こんんちは、

不可思議な現象で困っています。

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
です。


HFUKUSHI  2020-10-25 20:11:30  No: 149271

手元の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
がそれっぽい気がします。解決策でなくてすいません。


yTake  2020-10-25 23:17:45  No: 149272

HFUKUSHIさん、
ありがとうございます。

ログインしないと閲覧出来ない様です。アカウントが良く分かりません。
ちょっと確認してみます。

何やら、XE6のバグ的なものと言う事でしょうか?


yTake  2020-10-26 15:38:41  No: 149273

参照してみました。
現象は確かにこしらの現象と同じ様です。

ただ、どの様に解釈すれば良いのでしょう?
Resolvedとされていて日付がついていますが、その解決方法が記載されていません。
その日付のコメントも見つかりますが、解決方法の記述もなく、リンクが張ってあるわけでもない様です。

解決・未解決の状態も不明瞭な感じです。

HFUKUSHIさんによりますと、XE8ではその様は現象はみられないとの事です。
XE6では解決されていないと言う事でしょうか?


igy  2020-10-26 21:11:30  No: 149274

> Resolvedとされていて日付がついていますが、その解決方法が記載されていません。
> その日付のコメントも見つかりますが、解決方法の記述もなく、リンクが張ってあるわけでもない様です。
> 解決・未解決の状態も不明瞭な感じです。

HFUKUSHI さんが挙げている QP を見てみると、
> 解決状況:修正済み
> 修正バージョン:XE8
と書かれていますね。


HFUKUSHI  2020-10-27 00:10:59  No: 149275

あのあとソースを見てみたのですが、TCustomGrid.DialogKeyの実装がXE7とXE8でそれっぽく直されていたので、
XE8で修正されたものと思われます。FMXはアレなんで最新版を使ったほうがいいとは思いますが、
XE7以前の場合の簡易的な回避策としてはStringGridを派生してDialogKeyをoverrideし、IsFocusedがFalseのときは
inheritedを呼び出さない、とかそんな感じになるかと。試してみてまた報告します。


yTake  2020-10-27 11:33:03  No: 149276

igyさん、HFUKUSHIさん

ありがとうございます。

見方が分かってきました。

XE8以降なら修正されているのですね。
いずれはアップグレードするとして、当面はStringGidの使用を回避するか、自分でStringGridを修正するかでしょうか。
HFUKUSHIさんから示唆があります。
ちょっと試してみたいと思います。


HFUKUSHI  2020-10-27 12:58:28  No: 149277

ちょっと試してみたのですが、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)に移行してしまうのがよいと思います。


yTake  2020-10-27 21:21:53  No: 149278

HFUKUSHIさん
ありがとうございました。
ちょっとトライしてみましたが、自分では良く分かりませんでした。
HFUKUSHIさんのコードを使用してみました。
TABキーで、EditからFocusが移動できました。
取り敢えず、問題を回避出来ました。
将来的には最新版のDELPHIへ移行したいと思います。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加