stringgridで、プログラム側から、フォーカスのあるセル(点灯してるセル)の位置を変更する方法は無いでしょうか?
stringgridを、手動でデータベースを読み込んでいます。
stringgridを直接入力する他に、テキストボックスからも入力できるようにしています。
その際、「更新」、「次項」ボタンで、入力内容の反映と、下の行への移動を行えるようにしています。
ここで問題なのですが、
「次項」ボタンを押して、フォーカスが下の行に移っても、stringgridの点灯しているセルは、動かずそのままの位置です。
下の方の質問の、「StringGidのセル内の文字の色を変更したい」を参考にして、
任意の行を点灯させるようにしてみたのですが、
「次項」ボタンを押して、プログラムからフォーカスを移しても、再描画がされない為か、
点灯しているセルは「次項」ボタンを押す前と変わりません。
「次項」ボタンに、
StringGrid1DrawCell(Sender);を追加して試してみましたが、エラーで駄目でした。
何か良い方法は無いでしょうか?
環境は、WinXP SP3 Delphi3 です。
よろしくお願いしますm(__)m。
はずしているかもしれませんが、
Col プロパティ
Row プロパティ
を設定するのは、どうですか?
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;
> 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;
これだと右下に移動になると思います。実際には最終列かどうか
等も考えないといけません。
誤記
>StringGrid1.Col := StringGrid1.Row + 1;
StringGrid1.Row := StringGrid1.Row + 1;
試していませんが、
> if (col = x1) and (row = y1) then begin
を
if gdFocused in State then begin
に変更したら、どうなりますか?
あるいは、
Button4Clickで、StringGridのInvalidate メソッドを呼んでみるとか。
こんにちは。
次項移動処理後
StringGrid1.Refresh;
を行ったらいかがですか?
これで再描画されますよね。
> 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
に置き換えればよさそうな気もしますが・・・・
>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が呼ばれても他のセルと同じ色になる気がします。
通常のセルの色を変えているのならこれでいいのでしょうけれども。
D さんの発言の続きです
procedure TForm1.StringGrid1DrawCell
の中で選択セルの描画は
if gdSelected in State thenで行います。
参考
https://www.petitmonte.com/bbs/answers?question_id=6506
皆さんありがとうございます、昨日無事解決しました。
今引っ越し中で家にネット回線が繋がってないので、返信遅れました。
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;
ツイート | ![]() |