5

これは、以前の質問 Delphi TStringGrid の複数選択、 Delphi 文字列グリッドに関する選択された行の決定のフォロー アップです。それは別の質問です。

オブジェクトの ONSelectCell イベント TSelectCellEvent = procedure (Sender: TObject; ACol, ARow: Longint; var CanSelect: Boolean) を詳しく調べていました。

TStringGrid.Selection.Top,Bottom プロパティが (イベント自体の中で) 必ずしも正確ではないことに気付きました。基本的に、誰かが複数の行を選択してから 1 つの行だけに変更した場合、selection.* プロパティは更新されませんが、複数の行を選択した場合は更新されます。

ARow パラメーターは、1 つまたは複数の行が選択されているかどうかに関係なく更新されますが、これは、1 つの行のみが選択されていると判断できる場合にのみ役立ちます。

たとえば、選択された行が 1 つだけの場合は Arow パラメータを使用し、複数の行が選択されている場合は Selection.* プロパティを使用して、現在選択されている行を特定します。

もっと簡単な方法があるはずです....

ありがとうございました!

4

4 に答える 4

4
于 2011-05-18T06:15:31.200 に答える
0
for RowIndex := StringGrid1.Selection.Top to StringGrid1.Selection.Bottom do
begin
  DoSomethingWithRow(RowIndex);
end;

はい、あなたの言いたいことはわかります。OnSelectCell イベントの後に Selection プロパティが更新されているように見えるため、イベント内では古い値しかありません (つまり、select イベントの前)。これに対する答えは、上記のコードを stringgrid の OnMouseUp イベントに移動することです。それはうまくいくようです。

于 2011-05-17T00:53:38.603 に答える
0

私はこれを自分で解決することができました.OnDrawCellイベントをonSelectCellイベントと組み合わせて使用​​ することになりました.これは混乱するだろうと思っていましたが、それほど悪くはありません.

同じ問題に遭遇した他の人のための私の解決策の概要を次に示します。以下に 2 つの重要な事実を示します。

  1. TStringGrid.Selection プロパティは、OnDrawCell で常に正確です。
  2. TStringGrid.Selection プロパティは、OnSelectCell IFF でのみ正確です。複数の行が選択されています。

公衆
  以前のハイライトカウント: 整数; // onDraw 内の必要なコードが行選択ごとに 1 回だけ呼び出されるようにするためのフラグ。onFormCreate で '1' に初期化します。


プロシージャ Grid.OnDrawCell(...)
始める
...
SelectionCount := Grid.Bottom - Grid.Top;**
if ((SelectionCount = 1) AND (previousHighlightCount 1)) then  
始める                                                                               
   GridUpdateEdits; //1 つの行に対してグリッドを適切に更新するためのルーチン。*    
   前のHighlightCount:= 1;
終わり
そうしないと
  前のHighlightCount:= PrtEdtGrid.SelectionCount; // 複数選択された行のルーチンは onSelectCell イベントにあり、onSeelctCell は複数選択に対して機能します。
....
終わり;


答えてくれた人ありがとう!!

于 2011-05-17T20:18:41.380 に答える
0

StringGrid1.Selection.Top から StringGrid1.Selection.Bottom は、 onkeypress イベントを使用して選択/選択解除しているため、私にとっては完璧に機能しました。

于 2013-08-27T18:39:39.603 に答える