2

TStringGrid でセルを選択すると、セルの内容全体が選択され、カーソルが選択範囲の最後に配置されます。これは問題です。

私のグリッドは FoxPro データベースへの TADOConnnection への Live Binding を介して入力されています。たとえば、フィールドのサイズとデータ型を含む FieldDefs を持つ TADODataSet があります。

object DSProtocol: TADODataSet
    Connection = CONProtocol
    CursorType = ctStatic
    LockType = ltBatchOptimistic
    CommandText = 'select jobc from protocol'
    FieldDefs = <
        item
            Name = 'jobc'
            Attributes = [faFixed]
            DataType = ftFixedChar
            Size = 200
        end>
end

基礎となるデータベース スキーマを変更できません。ほとんどの場合、フィールドは格納される情報に対して大きすぎます。jobcに格納される最大の長さの値は 8 文字であり、おそらく 10 文字を超えることはありません。

UI の場合、jobc を保持する列のサイズを 200 文字で表示する理由はありません。10 文字を表示するのに十分な大きさが必要なだけです。ただし、TStringGrid セルは、そのフィールドの内容と、それを埋めるのに十分なスペース文字で埋められます。 (なぜ?わからない) 選択すると、内容全体が選択され、選択範囲の最後にカーソルが置かれ、最終的に内容が消えたように見えます。

TSTringGrid イベントを使用してこの動作をオーバーライドできるようには思えません。

(非推奨)を追加するための迅速で汚い修正を試みました:

keybd_event(VK_HOME, 0, 0, 0);
keybd_event(VK_HOME, 0, KEYEVENTF_KEYUP, 0);

OnGetEditMask イベントに渡されますが、このイベントは編集開始時と編集終了時に複数回呼び出されるようです。ありがたいことに、これはうまくいきませんでした。

select all が呼び出されている場所を正確に特定するために、親クラスをさかのぼって追跡しようとしましたが、システム ユニットの asm コードの追跡が失われました。ユニットに D- コンパイラ ディレクティブを追加して、デバッガーがそれらのユニットをスキップできるようにすることができると読みましたが、明らかな理由から、VCL ユニットのいずれかを変更することを本当に躊躇しています。

この時点で解決策を探しています (SQL クエリを変更しますか? ライブ バインディング プロパティ? フィールド プロパティ?) 理想的には、セルの初期値を同時に保存できるように、これがどこで発生するかを正確に知りたいと考えています。(編集中にエスケープすると初期値が復元されるという通常のスプレッドシートタイプの動作を追加したい)。

私がたどる必要があるクラス チェーンは次のように見えますTInplaceEdit-> TCustomMaskEdit-> TCustomEdit->TWinControl どこかにあると思います。

4

0 に答える 0