CSVファイルをTListViewに読み込むには?

解決


たなか  2003-07-11 02:36:53  No: 4088

下の質問に関連するのですが、ViewStyleがvsReportのTListViewに下記の様なデータが入っているCSVファイルを読み込ませたいのですが例外が出てとまってしまいます。
aaa,bbb
ccc,ddd
eee,fff

自分なりに考えたソースは
procedure TForm1.FormCreate(Sender: TObject);
var
  FSL: TStringList;
  LSL: TStringList;
  i: integer;
begin
  FSL := TStringList.Create;
  LSL := TStringList.Create;
  FSL.LoadFromFile('aaa.csv');
  for i := 1 to FSL.Count-1 do
  begin
  LSL.CommaText:=FSL[i];
  ListView1.Items.Add.Caption:=LSL[0];
  ListView1.Items[ListView1.Items.Count-1].SubItems.Add(LSL[1]);
 end;
end;

で、1項目目にデータを入れることには成功したのですが2項目目にデータを入れようとすると例外が出て止まってしまいます。どこがいけないのでしょうか?どうかアドバイスお願いします。


平蔵  2003-07-11 04:13:35  No: 4089

ラフに書いちゃいますけど、
var
  Lst : TListItem;
begin
 :
 :
  Lst.SubItems.Add(LSL[0];
  Lst.SubItems.Add(LSL[1]);
  Lst.SubItems.Add(LSL[2]);
      :
      :
とやっていけば入ります。
DelhpiのヘルプでTListItemを検索してみてください。
載ってますので。


平蔵  2003-07-11 04:16:15  No: 4090

ごめんなさい。ちょっと書き足りませんでした。
var
  Lst : TListItem;
begin
 :
 :
  Lst := ListView1.Items.Add;
  Lst.Caption := LSL[0]);
  Lst.SubItems.Add(LSL[1]);
  Lst.SubItems.Add(LSL[2]);
  Lst.SubItems.Add(LSL[3]);
      :
ですね。


たなか  2003-07-11 05:03:38  No: 4091

返答ありがとうございます。
平蔵さんに書いていただいたソースを参考にしてHelpなども調べてやってみましたがやはり同じ例外が出てしまい、実行することができませんでした。
例外というのは、実行するとclasses.pasが見つかりませんというようなダイアログが出て、無視を選択するとそのまま例外が出て止まってしまいます。一番初めに書いたソースの
ListView1.Items[ListView1.Items.Count-1].SubItems.Add(LSL[1]);
の部分を削って実行すると何の問題もなく実行できます。これはどこがいけないのでしょうか?アドバイスお願いします。


Halbow  URL  2003-07-11 05:42:08  No: 4092

Halbow です。

こちらでは平蔵さんの方法でうまくいってますよ。

procedure TForm1.Button1Click(Sender: TObject);
var
  FSL: TStringList;
  LSL: TStringList;
  i: integer;
  Lst : TListItem;
begin
  FSL := TStringList.Create;
  LSL := TStringList.Create;
  try
    FSL.LoadFromFile('c:\aaa.csv');
    for i := 0 to FSL.Count-1 do
    begin
      LSL.CommaText:=FSL[i];
      Lst := ListView1.Items.Add;
      Lst.Caption:=LSL[0];
      Lst.SubItems.Add(LSL[1]);
    end;
  finally
    FSL.Free;
    LSL.Free;
  end;
end;


たなか  2003-07-11 06:05:14  No: 4093

今Halbowさんが書かれたソースをそのままコピペして実行しましたが、やはり先ほどと同じ例外が出てしまいます。
以下、例外の内容です。

---------------------------
デバッガ例外が発生
---------------------------
プロジェクト Project1.exe が EStringListError クラスの例外を生成しました。
'リストのインデックスが範囲を超えています (1)'
プロセスは停止しています。再開するにはステップ実行または実行を選択してください。
---------------------------
OK   ヘルプ(H)   
---------------------------

何分初心者なものでどこが原因でこうなってしまうのかさっぱり分かりません。
ちなみに当方の開発環境はWin2000&Delphi6 Personalです。


Halbow  2003-07-11 06:47:17  No: 4094

Halbow です。

> EStringListError クラスの例外

これは、読み込む方の TStringList のエラーですね。
csv ファイルのなかで二番目の項目がないものがありませんか?

最初の質問にありましたとおり、

aaa,bbb
ccc,ddd
eee,fff

これだけの内容をメモ帳に写し取り、C: のところに aaa.csv の
名前でセーブしてから試してみてください。


にしの  2003-07-11 06:48:08  No: 4095

確実に、1行あたり2つの項目がありますか?
なければ、

LSL.CommaText:=FSL[i];
Lst := ListView1.Items.Add;
Lst.Caption:=LSL[0];
Lst.SubItems.Add(LSL[1]);

ここを、
LSL.CommaText:=FSL[i];
Lst := ListView1.Items.Add;
if LSL.Count > 0 then Lst.Caption:=LSL[0];
if LSL.Count > 1 then Lst.SubItems.Add(LSL[1]);
というようにしないとエラーになります。

それと、気になった点が1つ。
デバッガの使い方はわかっていますか?
# 初心者だから云々は無しで。ヘルプにありますし。

まず、エラーが起きたら、どこの行が原因か見つけます。
だいたいの場所でよいです。
それがたとえばイベント(OnClickなど)であれば、そのプロシージャの最初に実行される行の左側をダブルクリックすると、ブレイクポイントになります。
これで実行すると、ブレイクポイントで止まるので、1行ずつ実行していきます。
例外が発生すれば、どこの行でおきたかわかるので、今度はその例外が発生する手前まで実行します。
手前の状態で、変数の内容を確認します。
# プロジェクトオプションで、最適化をはずしておくとよいでしょう
これでだいたいわかります。

イベントでなく、どこかの関数であれば、その関数の最初の行にブレイクポイントを置きます。
止まったら、メニューの[表示][デバッグ][呼び出し履歴]を選びます。
# Ctrl+Alt+Sがデフォルトのショートカットのようです
これにより、その関数がどこから呼ばれているかわかりますので、上と同じ要領で変数の状態を確認します。


Halbow  2003-07-11 06:49:51  No: 4096

追加です

csv ファイルの最後の行が改行だけになっていませんか?
これも確かめてください。


たなか  2003-07-11 06:53:19  No: 4097

Halbowさんのご指摘どおりaaa.csvのデータの2項目目が欠けていました。
2項目目をエディタで追加して、再度実行させたところ正常に実行できました。
的確なアドバイスをしていただきどうもありがとうございました。


たなか  2003-07-11 07:14:33  No: 4098

にしのさんも書き込んでくださってたんですね、気付いていませんでした。すみません。
月曜にDelphiwoはじめたばかりで、色々なTipsサイトを見たりしてプログラミングしているのですが、デバッグに関しては全く勉強していませんでした。やっぱりプログラミングの上達にはデバッグは必須条件なんですね・・・。前スレに引き続きアドバイスありがとうございました。


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

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






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