customDbgrid.rowが正しく取得できない

解決


egg  2012-09-11 13:57:58  No: 42910

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位置を取得する方法を知る必要があるので、教えていただけると助かります。

よろしくお願いします。


egg  2012-09-11 14:03:10  No: 42911

ごめんなさい。
コードの訂正です。

procedure TForm1.DBGrid1CellClick(Column: TColumn); 
var
  Row:integer;
begin 
  Row:=TDBG(DBGrid1).Row; 
  ShowMessage(IntToStr(Row)); 
end;


Mr.XRAY  2012-09-11 20:47:32  No: 42912

こんにちは,

>見えている範囲のRowを返すものなのでしょうか? 

という表現も疑問がありますが,
[Vcl.Grids.TCustomGrid.Row]
http://docwiki.embarcadero.com/Libraries/ja/Vcl.Grids.TCustomGrid.Row

行番号ですね.つまり,一番上の行番号が 0 となるわけです.
したがって,「customDbgrid.rowが正しく取得できない」わけではなく,
正しく取得できていると思いますよ.

>ここで取得したRowを使用してデータ ベースの更新
>ちなみにDbgrid1.selectedField等はどこでも正しく取得できます。

ということなので,いまいち動作仕様が理解できないので,とりあえず Row の件だけ.
単純に,現在のレコードを操作する,というわけではない? んですよね.


egg  2012-09-11 22:00:27  No: 42913

なるほど。

動作仕様をきちんと理解していなかったことからバグかと
思い込んでいたようです。

調べたところ行移動にはlocateを使う方法があることが
わかりましたので、そちらの方法で試したいと思います。

おかげですっきりして次に進めます。
Mr.XRAYさん、本当にありがとうございました。


egg  2012-09-12 05:11:14  No: 42914

すみません解決をチェックしてませんでした!


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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