初めて質問させていただきます。
次のデータから例えば'SIRO'の行だけを取り出し、StringGridに表示したくて
サンプルをまねて作ってみたのですが、'SIRO'でない行が空白で残ります。
'SIRO'でない時はfor〜の中で Rows[i]の[i]を1減らせば良いかな
とも思いましたがうまく行きません。
何方かご指導よろしくおねがいします。
------------------------
IRO,
KURO,1,6,7,
SIRO,2,A,5,
SIRO,3,B,10.9,
KIIRO,4,1,6,
SIRO,5,6,7,
-------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
SL1, SL2 : TStringList;
MaxCol, i : Integer;
begin
if OpenDialog1.Execute then
begin
SL1 := TStringList.Create;
SL2 := TStringList.Create;
try
SL1.LoadFromFile( OpenDialog1.FileName );
with StringGrid1 do
begin
RowCount := SL1.Count;
MaxCol := 0;
for i := 1 to RowCount - 1 do
begin
SL2.CommaText := SL1.Strings[i];
if MaxCol < SL2.Count then MaxCol := SL2.Count;
if SL2[0] = 'SIRO' Then // 'SIRO'だけ抜き出し
begin
SL2.Delete(0); //最初の項目を削除
Rows[i].Assign(SL2);
end ;
end;
end;
finally
SL2.Free;
SL1.Free;
end;
end;
end;
TStringList上でデータの整形をした方がいいのでは?
TStringGridは行削除が出来ないので面倒です。
下記を参考にして見て下さい。
procedure TForm1.Button1Click(Sender: TObject);
var
TextBuf, LineBuf: TStringList;
MaxCol, I : Integer;
begin
MaxCol := 1;
TextBuf:= TStringList.Create;
LineBuf:= TStringList.Create;
try
TextBuf.LoadFromFile('aaa.txt');
// 該当データ以外の削除及び書込データの整形
for I:= TextBuf.Count - 1 downto 0 do
begin
LineBuf.CommaText:= TextBuf[I];
if AnsiCompareText(LineBuf[0], 'SIRO') <> 0 then
TextBuf.Delete(I)
else
begin
LineBuf.Delete(0);
if LineBuf.Count > MaxCol then MaxCol:= LineBuf.Count;
TextBuf[I]:= LineBuf.CommaText;
end;
end;
// グリッドの行列数設定
StringGrid1.ColCount:= MaxCol;
if (TextBuf.Count > 0) then
StringGrid1.RowCount:= TextBuf.Count else
StringGrid1.RowCount:= 1;
// データ書込
for I:= 0 to TextBuf.Count - 1 do
StringGrid1.Rows[I].CommaText:= TextBuf[I];
finally
LineBuf.Free;
TextBuf.Free;
end;
end;
Basserさん、思いどおりに読み込めました。
早速回答ありがとうございました。
>TStringGridは行削除が出来ない
そうだったんですね。それを知らずに苦労していました。
>TStringList上でデータの整形をした方がいいのでは?
実はそれも上手く使いこなせていません。
いただいたリストを印刷して勉強します。
>if AnsiCompareText(LineBuf[0], 'SIRO') <> 0 then
・・・は、True か False かどうかの事でしょうね。
どれも基礎的なことなのでしょうが、まだhelpも
迷路と呪文の様に見えます。
今度ともよろしくお願いします。
ツイート | ![]() |