StringGridに行の挿入

解決


ぺろ  2009-04-19 19:57:09  No: 34105

さてさて、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 20:05:27  No: 34106

その通りです。


Mr.XRAY  2009-04-19 20:56:24  No: 34107

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-20 02:43:57  No: 34108

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

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

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


ぺろ  2009-04-27 22:56:22  No: 34109

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

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

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

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


通りすがり  2009-04-27 23:11:43  No: 34110

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

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


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

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






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