下の質問に関連するのですが、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項目目にデータを入れようとすると例外が出て止まってしまいます。どこがいけないのでしょうか?どうかアドバイスお願いします。
ラフに書いちゃいますけど、
var
Lst : TListItem;
begin
:
:
Lst.SubItems.Add(LSL[0];
Lst.SubItems.Add(LSL[1]);
Lst.SubItems.Add(LSL[2]);
:
:
とやっていけば入ります。
DelhpiのヘルプでTListItemを検索してみてください。
載ってますので。
ごめんなさい。ちょっと書き足りませんでした。
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]);
:
ですね。
返答ありがとうございます。
平蔵さんに書いていただいたソースを参考にしてHelpなども調べてやってみましたがやはり同じ例外が出てしまい、実行することができませんでした。
例外というのは、実行するとclasses.pasが見つかりませんというようなダイアログが出て、無視を選択するとそのまま例外が出て止まってしまいます。一番初めに書いたソースの
ListView1.Items[ListView1.Items.Count-1].SubItems.Add(LSL[1]);
の部分を削って実行すると何の問題もなく実行できます。これはどこがいけないのでしょうか?アドバイスお願いします。
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;
今Halbowさんが書かれたソースをそのままコピペして実行しましたが、やはり先ほどと同じ例外が出てしまいます。
以下、例外の内容です。
---------------------------
デバッガ例外が発生
---------------------------
プロジェクト Project1.exe が EStringListError クラスの例外を生成しました。
'リストのインデックスが範囲を超えています (1)'
プロセスは停止しています。再開するにはステップ実行または実行を選択してください。
---------------------------
OK ヘルプ(H)
---------------------------
何分初心者なものでどこが原因でこうなってしまうのかさっぱり分かりません。
ちなみに当方の開発環境はWin2000&Delphi6 Personalです。
Halbow です。
> EStringListError クラスの例外
これは、読み込む方の TStringList のエラーですね。
csv ファイルのなかで二番目の項目がないものがありませんか?
最初の質問にありましたとおり、
aaa,bbb
ccc,ddd
eee,fff
これだけの内容をメモ帳に写し取り、C: のところに aaa.csv の
名前でセーブしてから試してみてください。
確実に、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がデフォルトのショートカットのようです
これにより、その関数がどこから呼ばれているかわかりますので、上と同じ要領で変数の状態を確認します。
追加です
csv ファイルの最後の行が改行だけになっていませんか?
これも確かめてください。
Halbowさんのご指摘どおりaaa.csvのデータの2項目目が欠けていました。
2項目目をエディタで追加して、再度実行させたところ正常に実行できました。
的確なアドバイスをしていただきどうもありがとうございました。
にしのさんも書き込んでくださってたんですね、気付いていませんでした。すみません。
月曜にDelphiwoはじめたばかりで、色々なTipsサイトを見たりしてプログラミングしているのですが、デバッグに関しては全く勉強していませんでした。やっぱりプログラミングの上達にはデバッグは必須条件なんですね・・・。前スレに引き続きアドバイスありがとうございました。
ツイート | ![]() |