m3u形式のプレイリストをリストボックスに表示させようとしているんですが、
procedure TForm1.Button1Click(Sender: TObject);
var
PL: TStringList;
i: Integer;
begin
if OpenDialog1.Execute then
begin
PL := TStringList.Create;
try
PL.LoadFromFile(OpenDialog1.FileName);
for i:=0 to PL.Count do
begin
if LeftStr(PL.Strings[i], 4) = '#EXT' then
begin
PL.Delete(i);
end;
if PL.Strings[i] = '' then
begin
PL.Delete(i);
end;
ListBox1.Items.Add(ExpandFileName(PL.Strings[ListBox1.Count]));
end;
finally
PL.Free;
end;
end;
end;
というやりかただと「リストのインデックスが範囲を超えています」という例外が発生してしまいます
たぶんループ中に最終値が変わってしまうから発生するんじゃないかと思うんですがうまく回避する方法はないでしょうか・・・
for i:=0 to PL.Count do
↓
for i:=PL.Count-1 downto 0 do
begin
PL.Delete(i);
end;
↓
begin
PL.Delete(i);
Continue;
end;
ListBox1.Items.Add(ExpandFileName(PL.Strings[ListBox1.Count]));
↓
ListBox1.Items.Add(ExpandFileName(PL.Strings[i]));
複数箇所に「リストのインデックス〜」の原因がありますね。
ListBox1.Items.Add(ExpandFileName(PL.Strings[ListBox1.Count]));
↓
ListBox1.Items.Insert(0, ExpandFileName(PL.Strings[ListBox1.Count]));
の方がいいかも知れませんね。
上記の例だとリストの順序が逆になってしまいますので。
デリートさせる理由が分からない
var
StringList: TStringList;
I: Integer;
begin
if OpenDialog1.Execute = True then
begin
StringList := TStringList.Create;
StringList.LoadFromFile(OpenDialog1.FileName);
for I:=0 to StringList.Count -1 do
begin
if Copy(StringList[I],1,4) <> '#EXT' then
begin
ListBox1.Items.Add(ExpandFileName(StringList[I]));
end;
end;
StringList.Free;
end;
end;
どうもありがとうございます
無事解決することができました
>KHE00221さん
今考えるとそうでした・・・
今後は気を付けます
ツイート | ![]() |