いつもお世話になっています。
DBGridにデータを表示して1行選択した状態にします。
その選択された行で「→キー」が押下された場合
次の列へ移動したいのですが、
このDBGridのOptionsプロパティのdgRowSelectをTrueにした状態では
常に「→キー」押下時、SelectedIndex=0となっています。
(行選択状態で、「→キー」の列移動は不可能なのでしょうか?)
どなたか対処方法を教えてください。
よろしくお願い致します。
この場合、カーソルを移動させるのでしょうか?それとも列そのものを移動させるのでしょうか?
編集 削除HOtaさま
ありがとうございます
<この場合、カーソルを移動させるのでしょうか?それとも列そのものを移動させるのでしょうか?
カーソルを移動させます。
よろしくお願いします。
DBGridのOptionsプロパティのdgRowSelectをTrueだと、列の選択は出来ません。カーソルは、行全体を示しています。
編集 削除的外れかもしれませんがOptionsプロパティのdgRowSelectはfalseの状態で今選択している1行全体を描画してはいかがでしょうか。
もしくは http://www1.cncm.ne.jp/~ogawate/ にお望みのものがあるかと思います。
おしりに空白が入ってました。。。
http://www1.cncm.ne.jp/~ogawate/
通りすがおさま
ご返信ありがとうございます。
<的外れかもしれませんがOptionsプロパティのdgRowSelectはfalseの状態で今選択している1行全体を描画してはいかがでしょうか。
当初その方法で1行色を変えようとしたのですが、
選択されている行がうまく取得できません。
DrawColumnCellメソッド内で、gdSelected判定はダメ?・・・OTL
☆実現したいこと・・・
①選択行の場合、1行分セルの色を変更する。
②DBGridからフォーカスが外れても色の変更を保持。
☆以下、やったこと...
procedure TCustomFixDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;Column: TColumn; State: TGridDrawState);
begin
with Self.Canvas do
begin
if gdSelected in State then
begin
Brush.Color := clHilighted;
Font.Color := clWhite;
FillRect(Rect);
end;
end;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
var
rowno : Integer; //行位置保持用
//行位置の保持
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
rowno := DataSet.RecNo;
end;
//描画
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
with TDBGrid(Sender) do
begin
//保持している変数と選択されている行が一致する場合
if (DataSource.DataSet.RecNo = rowno) then
Canvas.Brush.Color := clred;
DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;
end;
もっといい方法があると思いますが自分のレベルではこれが限界です。
ちなみにFixDBGridは「AsRowSelect」プロパティをTrueにするだけでできます。
通りすがおさま。
返信が遅くなり大変申し訳ございません。
以下の方法で、実現できました。
(AsRowSelectの中身を追いかけると、色をハイライトにしたいだけなら
HighlightCellメソッドを変更するだけ?ただ、前回教えていただいた方法とまったく違うので自信がありません。)
// =============================================================== //
function TMyDBGrid.HighlightCell(DataCol, DataRow: Integer; const Value: string;
AState: TGridDrawState): Boolean;
begin
Result := inherited HighLightCell(DataCol,DataRow,Value,AState);
if DataLink.Active then
Result := Result or (DataLink.ActiveRecord = Row-Ord(dgTitles in Options));
end;
TDBGridに表示しているデータベースのコンポーネントは何でしょうか?
TTable,TQuery,TClientDataSetならNextでカーソル移動すればよいのでは。
TDBGridのOnKeyUpイベントで
if Key = vkLeft then
ClientDataSet1.Next;
てな感じで
上に上げるときはPriorで