再現ソースを本文に書いていましたが、共有ファイルへもあげました。
ボタン1、ボタン2の順でClickすると再現します。
http://www.freeml.com/delphi-users/file/249105
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
友達の服をこっそり借りちゃお!「おしゃれ泥棒」
http://ad.freeml.com/cgi-bin/sa.cgi?id=hnTz1
-----------------------------------------------------[freeml by GMO]--
Button2のイベントの
> ClientDataSet1.GotoBookmark(pointer(DBGrid1.SelectedRows[0]));
...を、
DBGrid1.SelectedRows.Refresh; // ←この行を追加
ClientDataSet1.GotoBookmark(pointer(DBGrid1.SelectedRows[0]));
...とすると如何でしょう?
ありい
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
戦国時代の武将達とともに天下統一を目指そう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hnVbI
> 試したところ、値の変更が発生した行だけ選択が解除されるようです。
> これですと少し期待する動作とは違います。選択されたままになってほしいです。
なるほど。軽く整理させてください。
例えば、1~10までの10行があった場合に、2~4の
3行がグリッド上、選択されていたとします。
で、その後、仮に3行目の3が903に変更された場合は、
グリッド上は1,2,4...10,903という順番になると
思います。
#フィールド'int'にはインデックスが設定されていますから。
その時に、moruさんが期待されている状態は、
1)2,4,5が選択されている
2)2,4,903が選択されている
...の、1の状態で大丈夫でしょうか?
そして現状、
> DBGrid1.SelectedRows.Refresh; // ←この行を追加
を挟むと、4の行の選択が外れてしまう、ということです
よね。
問題は、DBGridで行を選択 → 行の値を変更 とすると、
DBGridで保持している選択Bookmarkが古くなり利用できなく
なってしまうことですね。
すると少し強引な手になりますが...
Pr_nBookmarkPos: integer をprivateに定義して、
1)CDSのBeforeEditで選択されているレコードの位置を把握する
2)CDSのAfterPostで選択されているレコードが変更されたら、再度
選択しなおす(Bookmarkを更新する)
...これで少しは近付けると良いのですが。
#削除のことは考えていません(^^; 良くテストしてみて下さいね。
ありい
procedure TForm1.ClientDataSet1BeforeEdit(DataSet: TDataSet);
var
bs: TBookmarkStr;
i: integer;
begin
Pr_nBookmarkPos := -1;
bs := DataSet.Bookmark;
if DBGrid1.SelectedRows.Find(bs, i) then begin
// グリッド選択されいてるレコード番号を記録
Pr_nBookmarkPos := DataSet.RecNo;
//Pr_nBookmarkPos := i;
end;
end;
procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
var
nDef: integer;
begin
nDef := DataSet.RecNo;
try
if Pr_nBookmarkPos > 0 then begin
// グリッド選択されているレコードのPOST
DBGrid1.SelectedRows.Refresh; // 一旦DBGrid1のブックマークを綺麗に
DataSet.RecNo := Pr_nBookmarkPos; // 元レコードに移動
DBGrid1.SelectedRows.CurrentRowSelected := true; // 選択ブックマークに追加
end;
finally
DataSet.RecNo := nDef;
end;
end;
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hpuAQ
ありい様、ありがとうございます。
返信遅くなりすみません。
また、ソースまで提示いただいてありがとうございます。
>#フィールド'int'にはインデックスが設定されていますから。
サンプルソースがよくありませんでしたが、もし並び順を制御するフィールドがフィールド'int'よりも1つ前にある場合、並び順は変わりませんがBookmarkは無効になってしまうという状況です。(CloneCursorしても同じ問題にあたります)
> もし並び順を制御するフィールドがフィールド'int'よりも1つ前にある場合、
> 並び順は変わ りませんがBookmarkは無効になってしまうという状況です。
> (CloneCursorしても同じ問題にあたります)
そうですね。ソートが有効・無効に関わらず、選択 → 変更の順で、その行の
Bookmarkが無効になります。
整理させて頂いたのは、もし前メールの2)を期待されている場合には、少し
コードが変わってくるので確認させて頂きました。
> しかし、SelectedRows.Refresh;してからもう一度範囲選択するようにして み
> ます。
> これで範囲選択を保持してほしいケースはカバーできそうです。
そう思います(^^)
#単純にDBGridの複数行選択が、選択されている行番号だけ押さえていてくれて
いれば、こんな苦労しなくて良いのに...と思いました(^^;
ありい
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hqbii