さてさて、StringGridの行の挿入なんですが、皆さんはどういう方法を考えられますか?
できれば、その利点は?(メモリーが少なそう、早そうとか。
私は、難しい事はできないので、シンプルに、
行を一行足して、StringGrid1.RowCount := StringGrid1.RowCount + 1;
下から、ループコピーしていけばいいかなー?と。
for i := 0 to 行数-1 do
StringGrid1[最後の行-i] := StringGrid1[最後の行のi-1];
で、StringGridの先頭行のデータを消す。
調べては見たけど、よく分からない方法も多かったので、自分が分かる方法で書いてみました。
出来るかは分かりませんが、StringGridの内容をTStringList型に入れちゃって、先頭に1行追加して、元に戻すって方法も。
この方が、後で途中の行に挿入する場合とかは、便利かなー?と思ったり。
私の方法でも、ループの途中で条件分岐を付ければ良いだけか。
みなさんは、どういう方法で実現していますか?
その通りです。
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;
簡単なグラフソフトを作ることが出来ました。
https://www.petitmonte.com/bbs/answers?question_id=3281
TMyGridこれを使う理由は、この辺のようなのですが、まだ具体的には分かりませんでした。
使い方が分かっても、これだけの使い方が分かるだけでは、応用もできないので。
VCLの中身を、地道に調べるしかないんですかねー。
回答して頂いた方、ありがとうございました。
ふと、解決済みなのですが・・・、
勉強のためにRowMovedやスピード競争等を試してみましたが・・・、上の方法だと、削除する列を下に移動させて、列の削除するだけなので、データが残ってしまいませんか?
削除して、追加を繰り返すと、ひょっこりこしたはずのデータが出てきてしまいます。
//削除列のセル内容をクリア
StringGrid1.Rows[StringGrid1.RowCount].Clear;
をfor後に追加した方がいいのかなー?と。
確かに行削除した場合は、行カウントを減らしても
一見消えたように見えますが残っていますので
私は以下のように確実に消しています。
〜略〜
with StringGrid1 do
for i:=1 to ColCount-1 do
Cells[i,iRow] := '' ;
ツイート | ![]() |