stringgridで、プログラム側から、点灯してるセルの位置を変更するには

解決


Delphi大好き  2009-09-14 18:58:23  No: 35678

stringgridで、プログラム側から、フォーカスのあるセル(点灯してるセル)の位置を変更する方法は無いでしょうか?

stringgridを、手動でデータベースを読み込んでいます。
stringgridを直接入力する他に、テキストボックスからも入力できるようにしています。
その際、「更新」、「次項」ボタンで、入力内容の反映と、下の行への移動を行えるようにしています。

ここで問題なのですが、
「次項」ボタンを押して、フォーカスが下の行に移っても、stringgridの点灯しているセルは、動かずそのままの位置です。

下の方の質問の、「StringGidのセル内の文字の色を変更したい」を参考にして、
任意の行を点灯させるようにしてみたのですが、
「次項」ボタンを押して、プログラムからフォーカスを移しても、再描画がされない為か、
点灯しているセルは「次項」ボタンを押す前と変わりません。

「次項」ボタンに、
StringGrid1DrawCell(Sender);を追加して試してみましたが、エラーで駄目でした。

何か良い方法は無いでしょうか?

環境は、WinXP  SP3  Delphi3  です。
よろしくお願いしますm(__)m。


igy  2009-09-14 19:06:29  No: 35679

はずしているかもしれませんが、
Col プロパティ
Row プロパティ
を設定するのは、どうですか?


Delphi大好き  2009-09-14 21:12:42  No: 35680

igyさんありがとうございます、コード無しですいません^^;
悩んでいる部分は以下です。

省略多数ですが、以下の感じです。
「次項」ボタンを押しても、
StringGrid1DrawCellは実行されないみたいです。
何かよい方法は無いでしょうか??

var
  y1:integer=1;
  x1:integer=1;

procedure TForm1.Button4Click(Sender: TObject);
begin{次項ボタン}
//次項移動処理…(省略
  StringGrid1.RowCount :=  StringGrid1.RowCount + 1;

  x1 := StringGrid1.Col;
  y1 := StringGrid1.Row;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if (col = x1) and (row = y1) then begin
    StringGrid1.canvas.Brush.Color := clWhite;
    StringGrid1.Canvas.FillRect(rect);
    StringGrid1.Canvas.Font.Color := clBlack;
    drawtext(StringGrid1.canvas.Handle,
            PChar(StringGrid1.cells[col,row]),
            Length(StringGrid1.cells[col,row]),
            rect,DT_LEFT);
end;


TS  2009-09-14 21:57:13  No: 35681

> StringGrid1.RowCount :=  StringGrid1.RowCount + 1;
//StringGridの行を1行増やす

> x1 := StringGrid1.Col;
> y1 := StringGrid1.Row;
//現在の行を変数x1,y1に代入する

igy さんの言っておられる事は
   
StringGrid1.Col := StringGrid1.Col + 1;
StringGrid1.Col := StringGrid1.Row + 1;
これだと右下に移動になると思います。実際には最終列かどうか
等も考えないといけません。


TS  2009-09-14 21:58:53  No: 35682

誤記
>StringGrid1.Col := StringGrid1.Row + 1;
StringGrid1.Row := StringGrid1.Row + 1;


igy  2009-09-14 21:59:45  No: 35683

試していませんが、
>  if (col = x1) and (row = y1) then begin

   if gdFocused in State then begin
に変更したら、どうなりますか?

あるいは、

Button4Clickで、StringGridのInvalidate メソッドを呼んでみるとか。


GT-BASS  2009-09-14 22:06:21  No: 35684

こんにちは。

次項移動処理後
StringGrid1.Refresh;
を行ったらいかがですか?
これで再描画されますよね。


igy  2009-09-14 22:27:33  No: 35685

>  x1 := StringGrid1.Col;
>  y1 := StringGrid1.Row;

をTSさんが書かれている

StringGrid1.Col := StringGrid1.Col + 1;
StringGrid1.Row := StringGrid1.Row + 1;

のように、Col, Rowプロパティを設定するものに置き換え、先ほど書いた

>  if (col = x1) and (row = y1) then begin

if gdFocused in State then begin

に置き換えればよさそうな気もしますが・・・・


D  2009-09-15 03:10:26  No: 35686

>stringgridの点灯しているセルは、動かずそのままの位置です。
  選択セルを移動させたいということでしょうか。
もしそうなのであれば、Selectionプロパティを使う方法もあります。

procedure TForm1.Button4Click(Sender: TObject);
var
  l_GridRect: TGridRect;
begin
  StringGrid1.RowCount  := StringGrid1.RowCount + 1;

  l_GridRect            := StringGrid1.Selection;
  l_GridRect.Top        := StringGrid1.RowCount - 1;
  l_GridRect.Bottom     := l_GridRect.Top;
  StringGrid1.Selection := l_GridRect;
end;

あと、

>  if (col = x1) and (row = y1) then begin
>    StringGrid1.canvas.Brush.Color := clWhite;
>    StringGrid1.Canvas.FillRect(rect);
>    StringGrid1.Canvas.Font.Color := clBlack;

  これだとOnDrawCellが呼ばれても他のセルと同じ色になる気がします。
通常のセルの色を変えているのならこれでいいのでしょうけれども。


TS  2009-09-15 03:43:44  No: 35687

D さんの発言の続きです
 
procedure TForm1.StringGrid1DrawCell
の中で選択セルの描画は
if gdSelected in State thenで行います。

参考
https://www.petitmonte.com/bbs/answers?question_id=6506


Delphi大好き  2009-09-15 22:33:52  No: 35688

皆さんありがとうございます、昨日無事解決しました。
今引っ越し中で家にネット回線が繋がってないので、返信遅れました。

Dさんありがとうございます、
ご指摘の箇所ですが、試行錯誤中の時のを載せてしまったみたいです^^;
列の一番端を「→」で点滅させて、代わりにカーソルを白くしようとしたときに書いたの一部を乗せてしまいました^^;
つぎはぎできちんと処理を理解せず変更を繰り返してるので、自分でも半分パニクってます^^;

既に解決してしまいましたが、機会があったら、
Dさんの処理方法も参考にしてみたいと思います。

自分の覚え間違いと記述ミスで、
igyさんとTSさんのご指摘通りでした。
igyさんとTSさん、GT-BASSさん、Dさん、改めてありがとうございます。

RowCountを  +1しても、Rowは変わらないのですね。

Rowをきちんと+1して、GT-BASSさんがご指摘した、
StringGrid1.Refresh;したら、正常描画されました。

if gdFocused in State then にもしてみたのですが、
マウスやキーボード入力でカーソルを移したときと、次項ボタンで移動したときで色を区分けする事が出来て、
便利に仕上がりました。

皆さんありがとうございます、
とても助かりましたm(__)m。

以下変更したコードです。

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if gdFocused in State then begin
    StringGrid1.canvas.Brush.Color := clAqua;
    StringGrid1.Canvas.FillRect(rect);
    StringGrid1.Canvas.Font.Color := clBlack;
    drawtext(StringGrid1.canvas.Handle,
            PChar(StringGrid1.cells[col,row]),
            Length(StringGrid1.cells[col,row]),
            rect,DT_LEFT);
  end; 
//・・・省略
end;

procedure TForm1.Button4Click(Sender: TObject);
begin//次項ボタン
//…省略
  StringGrid1.RowCount  := StringGrid1.RowCount + 1;
  StringGrid1.Row := StringGrid1.Row + 1;
  x1 := StringGrid1.Col;
  y1 := StringGrid1.Row;
  StringGrid1.Refresh;
end;


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

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






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