- 締切済み
StringGridの中身をCSV形式で保存するには、保存の際に、ファイル拡張子を自動で「.csv」を付与するには?
こんにちは。 StringGridの中身をCSVデータとして保存したいのですが、 その際に、『自分の好きな名前』で『デスクトップ』に保存できるようにしたいと考えています。 ソース1では、CSV形式での保存は行えるのですが、 名前をつけるやり方とデスクトップの指定方法が分かりません。 opendialog,savedialogを使うと思うのですが、 上手く組み合わせることが出来ずに困っています。 ソース2では、理想どおりの結果を出力できるはずなんですが、 実行すると空の結果が出力されます。どこが間違っているか分からず、困り果てています。 ・間違っている部分がどこか? ・保存する際に自動で端子に.csvを付与するにはどうすれば良いか? アドバイス頂けると助かります。 宜しくお願いしします。 -----------ソース1:------------------------------------------ procedure TForm2.GridSaveCSV(SGrid:TStringGrid; fName: String); var stList :TStringList; ARow :Integer; begin stList:=TStringList.Create; try for ARow:=0 to SGrid.RowCount-1 do stList.Add(SGrid.Rows[ARow].CommaText); stList.SaveToFile(fName); finally stList.Free; end; end; //CSVFileからStringGridへ読込み1 procedure TForm2.GridLoadCSV(SGrid:TStringGrid; fName:string); var stList: TStringList; ARow: Integer; begin stList:=TStringList.Create; try stList.LoadFromFile(fName); SGrid.RowCount:= stList.Count; for ARow:=0 to stList.Count-1 do SGrid.Rows[ARow].CommaText:= stList[ARow]; finally stList.Free; end; end; procedure TForm2.Button3Click(Sender: TObject); var fName: String; begin fName := 'csvtest.csv'; GridSaveCSV(StringGrid1,fName); end; -------------------------------------------------------------- -----------ソース2:------------------------------------------ procedure TForm2.Button8Click(Sender: TObject); var F : TextFile; Str : String; CellA,CellB,CellC,CellD,CellE : String; RowCNT : Integer; begin if not SaveDialog1.Execute then exit; if FileExists(SaveDialog1.FileName) then //↑ここのFileNameの使い方が良く分かりません>< //保存するときに、自動で.csvが付与されるようにしたいと思っています。 if Application.MessageBox('上書きしますか','注意',MB_YESNO ) = 7 then exit; //_ AssignFile(F,SaveDialog1.FileName); Rewrite(F); RowCNT := 0; try while not (StringGrid1.Cells[0,RowCnt] = '') do begin CellA := StringGrid1.Cells[0,RowCnt]; CellB := StringGrid1.Cells[1,RowCnt]; CellC := StringGrid1.Cells[2,RowCnt]; CellD := StringGrid1.Cells[3,RowCnt]; CellE := StringGrid1.Cells[4,RowCnt]; Str := Format('%s,%s,%s,%s,%s'[CellA,CellB,CellC,CellD,CellE]); // ↑この辺りが怪しいと思っています。 WriteLn (F,Str); Inc(RowCNT); end; finally CloseFile(F); end; end;
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- nag0720
- ベストアンサー率58% (1093/1860)
最初に何の言語かを書きましょう。見たところDelphiのようですが、なじみのない人は分からないです。 >間違っている部分がどこか? Str := Format('%s,%s,%s,%s,%s'[CellA,CellB,CellC,CellD,CellE]); このコードの、[CellA,・・・]の前にカンマがありません。正しくは、 Str := Format('%s,%s,%s,%s,%s',[CellA,CellB,CellC,CellD,CellE]); (コンパイルエラーにならなかったんでしょうか) >保存する際に自動で端子に.csvを付与するにはどうすれば良いか? SaveDialogのプロパティを設定してください。 SaveDialog1.FileName := 'csvtest.csv'; // デフォルトのファイル名 SaveDialog1.InitialDir := 'C:\'; // デフォルトのフォルダ SaveDialog1.Filter := 'CSVファイル(*.csv)|*.csv'; SaveDialog1.FilterIndex := 1; SaveDialog1.DefaultExt := '.csv'; デスクトップフォルダはちょっと分かりません(Windows APIを使えば分かるようですが) WindowsXPなら、通常は、 C:\Documents and Settings\(ユーザー名)\デスクトップ ですが、OSのバージョンによっても変わりますし、Windowsの設定によっても変わりますので。 なお、ソース1とソース2の出力ファイルの内容は、データによっては必ずしも同じにはなりません。 セルの中の文字列にスペースが含まれるときは、ソース1は引用符(")で括られますが、ソース2はそのまま出力されます。
お礼
nag0720 さん 言語について、記載をせずすみませんでした。 丁寧に回答を頂き、ありがとうございます!! ソースの「,」については、私の入力ミスでした。 そのままだとコンパイルエラーですね^^; 実は、他にもう1つの掲示板でも同様の質問をさせて頂いていたのですが、 何も出力されない原因は、 while not (StringGrid1.Cells[0,RowCnt] = '') doの記載で、 GridのデータCells[0,0]が空行('')のためでした。 (基本的なことで、お恥ずかしいです。。) × while not (StringGrid1.Cells[0,RowCnt] = '') do ○ for RowCnt:=0 to StringGrid1.RowCount-1 do と書き換え、Inc(RowCNT);を削除することで、想定どおりの結果を出力できました。 ・保存する際に自動で端子に.csvを付与するにはどうすれば良いか? この点は、SaveDialogのプロパティの設定で、 DefaultEXTをcsvに変え、 Fillerプロパティのフィルタ名を「CSVファイル(*.csv)」、 フィルタを「*.csv」に設定するで想定どおりの出力が出来ました! 頂いたアドバイスを使えば、ソース上で識別子を変更できるので、 テキスト形式等の選択もできるように挑戦してみようと思います。 ソース1とソース2の出力ファイルの内容が変わるのは知りませんでした。 どうしてそうなるのか、もう少し勉強してみようと思います。 また、結果的に、ソース2を使用する理由にもなりました。 (こちらの方が、私の想定する結果が出力されるので・・。) ここ数週間、色々調べながら悩み続けていたので、本当に助かりました。 参考になるアドバイスをありがとうございました!!