Delphi7
type
TDBG = class(TCustomDBGrid);
として
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
TDBG(DBGrid1).Row;
ShowMessage(IntToStr(Row));
end;
DBGrid1
レコード数 30(スクロールしないで 初めから見えている件数は22件)
カラム数 4
option [dgTitles]+[dgIndicator]+[dgColLines]+[dgRowLines]+[dgTabs]+[dgConfirmDelete]+[dgCancelOnExit]+[dgColumnResize]
上記のコードでDBGrid1のクリックしたセルのRowを取得したいのに、正しい値 が取得できない。
現状では、アプリケーションを起動して 一番初めから表示されているレコード数 (22件)分 しか正しい値で取得できない。 23件目をクリックしてもShowMessage は22を返してきてしまい、そのあと22件目をクリックする と21を返す。
つまり、22件目以上をクリックする と、そのクリックした位置を22件目とし て誤認する(単純に言えば今表示されている部分の一番下を22件目、一番上を1件目として認識してしまう)
ためしにDBGrid1のHeightを広げて初め から表示される件数を24件に変えたとこ ろ、24件目を最大値として 同じ現象がおきた。
ここで取得したRowを使用してデータ ベースの更新を行っているため、Rowが ずれると予定外の場所が更新されてし まって困る。
現在以上のような問題が起きています。
22件目以降のRowも正しく取得する方法に何か心当たりのある方は、教えていただけると嬉しいです。
ちなみにDbgrid1.selectedField等はどこでも正しく取得できます。
そもそもCustomDBGrid.Rowの仕様が見 えている範囲のRowを返すものなのでしょうか?
だとすれば正しいクリックしたRow位置を取得する方法を知る必要があるので、教えていただけると助かります。
よろしくお願いします。
ごめんなさい。
コードの訂正です。
procedure TForm1.DBGrid1CellClick(Column: TColumn);
var
Row:integer;
begin
Row:=TDBG(DBGrid1).Row;
ShowMessage(IntToStr(Row));
end;
こんにちは,
>見えている範囲のRowを返すものなのでしょうか?
という表現も疑問がありますが,
[Vcl.Grids.TCustomGrid.Row]
http://docwiki.embarcadero.com/Libraries/ja/Vcl.Grids.TCustomGrid.Row
行番号ですね.つまり,一番上の行番号が 0 となるわけです.
したがって,「customDbgrid.rowが正しく取得できない」わけではなく,
正しく取得できていると思いますよ.
>ここで取得したRowを使用してデータ ベースの更新
>ちなみにDbgrid1.selectedField等はどこでも正しく取得できます。
ということなので,いまいち動作仕様が理解できないので,とりあえず Row の件だけ.
単純に,現在のレコードを操作する,というわけではない? んですよね.
なるほど。
動作仕様をきちんと理解していなかったことからバグかと
思い込んでいたようです。
調べたところ行移動にはlocateを使う方法があることが
わかりましたので、そちらの方法で試したいと思います。
おかげですっきりして次に進めます。
Mr.XRAYさん、本当にありがとうございました。
すみません解決をチェックしてませんでした!
ツイート | ![]() |