[cbuilder:40041] StringList について

14 views
Skip to first unread message

吉沢

unread,
Nov 5, 2008, 12:32:52 AM11/5/08
to "C++Builderメーリング"
いつも質問ばかりですみません。
TStringListの Delete について良く分からず困っております。
以下のリストの様にDeleteを使ってファイル内容を削除出来ると思った
のですが、消去されるのは、1行間隔になっていました。
なぜこの様になるか、お教え下されば幸いです。

TStringList *sl;
AnsiString SFbame = "ABC";

__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
sl = new TStringList;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int len;
if( OpenDialog1->Execute() == false ){
return;
}

sl->LoadFromFile(OpenDialog1->FileName);

// ここで読み込んだファイルの1部を消去したい
for(int i=0; i<sl->Count; i++){
sl->Delete(i);
}

sl->SaveToFile(SFname);

}


--

ゆーち

unread,
Nov 5, 2008, 12:54:40 AM11/5/08
to cbui...@sfdata.ne.jp
こんちは。ゆーちです。
#メール、送れないと思うけど・・・

Delete(i) で、要素がひとつ少なくなって、Count プロパティもひとつ
少なくなります。

N個のうちの 0 番目のアイテムを削除すると要素数は(N-1)個になり、
0番目には1番目だった要素がシフトしてきます。

ループ変数は +1 されて次の要素を削除しますから、1つ間隔で消され
ることになる、という図式は正しい動きです。

for( ; 0 < list->Count; )
{
list->Delete(0);
}
ってな感じで目的の動作になりますね。

ただ、要素がひとつ削除されるたびに、残りすべての要素がシフトされ
ることになりますので、効率が悪いです。

for( int i = list->Count - 1; 0 <= i; i-- )
{
list->Delete(i);
}
とやると、比較的効率がよろしいかと。

吉沢

unread,
Nov 5, 2008, 1:21:14 AM11/5/08
to cbui...@sfdata.ne.jp
吉沢です。

ゆーちさん、早々に丁寧なご説明ありがとうございます。
良くわかりました。

ありがとうございました。

--


Reply all
Reply to author
Forward
0 new messages