■ TStringGrid の入力について

[Delphi Q & A 掲示板] [過去ログの一覧]


歩如 2009/02/13(金) 16:09:23
TStringGrid を使って表を作っているのですが
データを編集する場合に複数のセルを選択した場合
入力した値をすべてのセルに設定したいのですが
[123]と入りょくして最後の3しか表示されません。
どうすればよいのでしょうか?

---------------------------------------------------------------------
procedure TForm1.StringGridSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string);
var
 i: Integer;
 j: Integer;
begin
 for i := StringGrid.Selection.Left 
   to StringGrid.Selection.Right do begin
  for j := StringGrid.Selection.Top to 
   StringGrid.Selection.Bottom do begin
   StringGrid.Cells[i,j] := Value;
  end;
 end;
end;

---------------------------------------------------------------------

そもそも 2009/02/13(金) 17:05:45
OnSetEditText イベントは、Options プロパティに goEditing が指定されていない限り発生しない。
一方、goEditing が指定されていると、複数のセルを選択できない。
矛盾してるよ。
また、OnSetEditTextイベントは、ユーザーがテキストを変更するたびに発生するので、最後の入力文字しか表示されないのは当然。

歩如 2009/02/13(金) 17:54:13
回答どうもありがとうございます。

options の goEditing は true にしています。
ですから、OnSetEditText が発生するんですね。

でも、複数のセルは選択されてます。
先のソースコードで複数のエリアの内容が変更されました。
ただし、最後の1文字だけですが・・・

環境は 
Delphi2007 WindowsVista です

別のEditで 2009/02/13(金) 18:44:56
>でも、複数のセルは選択されてます。
おや? D2007では、そう仕様が変更されたの?
でも、セルに直接入力する方法ではダメだね。
別の入力方法に変更しないと。

TS 2009/02/13(金) 19:35:44
理解されてなさそうですので、そもそもさんの説明をもう一度良く
読んでみて下さい。

私はD2007を使用していませんので検証できませんが下記のコード
で動作が理解できるかもしれません。

D7で要望の動作をさせようとするなら、選択セルを独自の描画、記憶
させる仕掛けを作る必要があります。

別のEditさんが名前で示しておられる様に複数のセル入力用の別のEdit
を使った方が早いと思います。 

procedure TForm1.StringGrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: String);
var i,j: Integer;
begin
  with StringGrid1 do
    begin
      beep;
      if Value ='123' then
        for i := Selection.Left  to Selection.Right do
          for j := Selection.Top to Selection.Bottom do
            Cells[i,j] := Value;
    end;
end;

KHE00221 2009/02/14(土) 11:37:48 <初心者>
こんな感じ?

procedure TForm2.StringGrid1KeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
var
    Row,Col: Integer;
begin
    if goEditing in StringGrid1.Options then
    begin
      if Key = 13 then
      begin
        StringGrid1.Options := StringGrid1.Options - [goEditing];
        for Row := StringGrid1.Selection.Top to StringGrid1.Selection.Bottom do
        begin
          for Col := StringGrid1.Selection.Left to StringGrid1.Selection.Right do
          begin
            StringGrid1.Cells[Col,Row] := StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row];
          end;
        end;
      end;
    end
    else
    begin
      StringGrid1.Options := StringGrid1.Options + [goEditing];
    end;
end;

TS 2009/02/15(日) 09:15:17
歩如 さん失礼しました、KHE00221 さんのコードを試してみて
気付きました、最初に複数のセルを選択して文字入力すると
複数のセルの入力ができました。

私の書いたコードの if Value ='123' then を
if GetKeyState(VK_RETURN) < 0 then に変えて
KHE00221 さんのコードと同様の動作をするはずです。

>ただし、最後の1文字だけですが・・・
1文字入力する度にその文字にセルの値に変えるコード
を書いておられるからです。

歩如 2009/02/18(水) 11:08:09
すみません。
いろいろ触っているうちに複数選択ができなくなりました。
複数選択できるようにする方法を
探しているのですがわかりません。
複数選択のプロパティってあるのでしょうか?

歩如 2009/02/18(水) 11:21:02
バグだったのでしょうか?
そもそもさんがはじめにおっしゃられていた下記の状態になりました。
最初は複数選択状態で最終のセルに入力ができたので
OnSetEditText にコードを書いたのですが、
現在は前の状態に戻らなくなりました。


>OnSetEditText イベントは、Options プロパティに goEditing が指定されていない限り発生しない。
>一方、goEditing が指定されていると、複数のセルを選択できない。

Ru 2009/02/18(水) 11:22:11
何を触ったか知りませんがTStringGrid.Optionsの内容確認してみてください。
詳細はヘルプ見てください。

TS 2009/02/18(水) 16:16:40
Helpに Options プロパティ
goRangeSelect 各セルの範囲を一度に選択できる。
Options に goEditing が含まれている場合,goRangeSelect は無視される
とありますが、

>最初は複数選択状態で最終のセルに入力ができたので

上記の動作ができています,Delphi7ですけど。

歩如 2009/02/20(金) 11:44:27
[[解決]]

みなさんいろいろありがとうございました。
潜在的バグのような気がします。

最初のまま作っていたら、
いずれ複数選択ができない状況になっていたと思います。

正規の仕様で動作できるようにしたいと思います。
キー入力でキーを受け取り複数範囲の場合に
各セルにキー入力情報を入力するようにします

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library