リストのインデックスが範囲を超えています・・・

解決


kamo  2008-02-19 03:20:52  No: 29829

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;

というやりかただと「リストのインデックスが範囲を超えています」という例外が発生してしまいます
たぶんループ中に最終値が変わってしまうから発生するんじゃないかと思うんですがうまく回避する方法はないでしょうか・・・


DEKO  2008-02-19 03:39:11  No: 29830

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]));

複数箇所に「リストのインデックス〜」の原因がありますね。


DEKO  2008-02-19 03:45:29  No: 29831

ListBox1.Items.Add(ExpandFileName(PL.Strings[ListBox1.Count]));

ListBox1.Items.Insert(0, ExpandFileName(PL.Strings[ListBox1.Count]));

の方がいいかも知れませんね。
上記の例だとリストの順序が逆になってしまいますので。


KHE00221  2008-02-19 03:47:49  No: 29832

デリートさせる理由が分からない

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;


kamo  2008-02-19 03:54:21  No: 29833

どうもありがとうございます
無事解決することができました

>KHE00221さん
今考えるとそうでした・・・
今後は気を付けます


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

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






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