StringGridに行の挿入

解決


ぺろ  2009-04-19 10:57:09  No: 34105  IP: 192.*.*.*

さてさて、StringGridの行の挿入なんですが、皆さんはどういう方法を考えられますか?
できれば、その利点は?(メモリーが少なそう、早そうとか。

私は、難しい事はできないので、シンプルに、
行を一行足して、StringGrid1.RowCount := StringGrid1.RowCount + 1;
下から、ループコピーしていけばいいかなー?と。

for i := 0 to 行数-1 do
  StringGrid1[最後の行-i] := StringGrid1[最後の行のi-1];
で、StringGridの先頭行のデータを消す。
調べては見たけど、よく分からない方法も多かったので、自分が分かる方法で書いてみました。

出来るかは分かりませんが、StringGridの内容をTStringList型に入れちゃって、先頭に1行追加して、元に戻すって方法も。
この方が、後で途中の行に挿入する場合とかは、便利かなー?と思ったり。
私の方法でも、ループの途中で条件分岐を付ければ良いだけか。

みなさんは、どういう方法で実現していますか?

編集 削除
HOta  2009-04-19 11:05:27  No: 34106  IP: 192.*.*.*

その通りです。

編集 削除
Mr.XRAY  2009-04-19 11:56:24  No: 34107  IP: 192.*.*.*

Mr.XRAYです.以下は私が使用している方法です.

type
  TMyGrid = class(TStringGrid);

の様に定義して...

Windows XP(SP3) + Delphi5,6,7,2007-R2 Pro
Windwos Vista + Delphi2007-R2 Pro
全てで動作しています.
メモリ使用量とか,早そうとかは考えたことはありません.
もしかしたら,TStringList等に退避して戻す方法の方が高速かも知れません.

//===============================================
//  行の挿入
//  3行目に挿入
//===============================================
procedure TForm1.Button2Click(Sender: TObject);
var
    i : Integer;
    k : Integer;
begin
    k := 3;
    StringGrid1.RowCount := StringGrid1.RowCount+1;
    for i:=StringGrid1.RowCount-1 downto k+1 do begin
      TMyGrid(StringGrid1).RowMoved(i-1,i);
    end;
end;
//===============================================
//  行の削除
//  4行目を削除
//===============================================
procedure TForm1.Button3Click(Sender: TObject);
var
    i : Integer;
    k : Integer;
begin
    k := 4;
    for i:=k to StringGrid1.RowCount-1 do begin
      TMyGrid(StringGrid1).RowMoved(i+1,i);
    end;
    StringGrid1.RowCount := StringGrid1.RowCount-1;
end;

編集 削除
ぺろ  2009-04-19 17:43:57  No: 34108  IP: 192.*.*.*

簡単なグラフソフトを作ることが出来ました。

https://www.petitmonte.com/bbs/answers?question_id=3281
TMyGridこれを使う理由は、この辺のようなのですが、まだ具体的には分かりませんでした。
使い方が分かっても、これだけの使い方が分かるだけでは、応用もできないので。
VCLの中身を、地道に調べるしかないんですかねー。

回答して頂いた方、ありがとうございました。

編集 削除
ぺろ  2009-04-27 13:56:22  No: 34109  IP: 192.*.*.*

ふと、解決済みなのですが・・・、
勉強のためにRowMovedやスピード競争等を試してみましたが・・・、上の方法だと、削除する列を下に移動させて、列の削除するだけなので、データが残ってしまいませんか?

削除して、追加を繰り返すと、ひょっこりこしたはずのデータが出てきてしまいます。

  //削除列のセル内容をクリア
  StringGrid1.Rows[StringGrid1.RowCount].Clear;

をfor後に追加した方がいいのかなー?と。

編集 削除
通りすがり  2009-04-27 14:11:43  No: 34110  IP: 192.*.*.*

確かに行削除した場合は、行カウントを減らしても
一見消えたように見えますが残っていますので
私は以下のように確実に消しています。

〜略〜
with StringGrid1 do
   for i:=1 to ColCount-1 do
      Cells[i,iRow] := '' ;

編集 削除