TStringGrid の入力について

解決


歩如  2009-02-14 01:09:23  No: 33357

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-14 02:05:45  No: 33358

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


歩如  2009-02-14 02:54:13  No: 33359

回答どうもありがとうございます。

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

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

環境は  
Delphi2007 WindowsVista です


別のEditで  2009-02-14 03:44:56  No: 33360

>でも、複数のセルは選択されてます。
おや? D2007では、そう仕様が変更されたの?
でも、セルに直接入力する方法ではダメだね。
別の入力方法に変更しないと。


TS  2009-02-14 04:35:44  No: 33361

理解されてなさそうですので、そもそもさんの説明をもう一度良く
読んでみて下さい。

私は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 20:37:48  No: 33362

こんな感じ?

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 18:15:17  No: 33363

歩如 さん失礼しました、KHE00221 さんのコードを試してみて
気付きました、最初に複数のセルを選択して文字入力すると
複数のセルの入力ができました。

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

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


歩如  2009-02-18 20:08:09  No: 33364

すみません。
いろいろ触っているうちに複数選択ができなくなりました。
複数選択できるようにする方法を
探しているのですがわかりません。
複数選択のプロパティってあるのでしょうか?


歩如  2009-02-18 20:21:02  No: 33365

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

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


Ru  2009-02-18 20:22:11  No: 33366

何を触ったか知りませんがTStringGrid.Optionsの内容確認してみてください。
詳細はヘルプ見てください。


TS  2009-02-19 01:16:40  No: 33367

Helpに  Options プロパティ
goRangeSelect  各セルの範囲を一度に選択できる。
Options に goEditing が含まれている場合,goRangeSelect は無視される
とありますが、

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

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


歩如  2009-02-20 20:44:27  No: 33368

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

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

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


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

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






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