趣味でプログラミングしています。
C#のSystem.Windows.Forms.SaveFileDialogを使ってテキストファイルを保存するときに、
Windows付属のメモ帳のような『文字コード』をユーザが指定できるようにしたいのですが、これは可能でしょうか。
メモリ等の関係上、VC#を入れることができず、csc.exeで直接コンパイルしています。(オンラインすらできない…)
なのでCommonFileDialog等は使えません。
その場合は決め打ち等しかないのでしょうか。
できればメモ帳のやつみたいに文字コードを指定できたら良いのですが…
『C# SaveFileDialog 文字コード』で検索してみましたが、
良くてもCommonFileDialogを使う方法、関係のないものだと『ファイルの書き込みについて』でした…
やはり無理なのでしょうか?
[情報]
言語: C#
.NET Framework: 4.0
コンパイラ: csc
種類: WinForm
[追記1]
失礼しました。
イメージとしてはこちらにある、画像の『文字コード(E):』の部分です。
C#のSaveFileDialogを使ってみると文字コード指定できるComboxがありません。
(まあ、WinAPIでもそうだけど)
公式でプロパティを調べてもそれらしきものすら見当たらず…
あのコンボボックスとかの部分でユーザに選択させたいのですが、これって無理でしょうか?
[追記2]
一応、別途用意すること自体は頭の片隅にありましたが、ユーザー目線で考えると煩わしいかなぁと思ったので今回の質問に至りました。
(説明下手ですみません…)
[追記3]
皆様ありがとうございます。
今すぐには試せない環境で、調べてみるとDLLのアクセスが必要であることがわかったため、その使い方を一旦学んでから今回の質問を閉じる事にします。
(今回初めてNuGetと言うものを使いましたのでちょっと手間取っています……)
[追記3]
CommonSaveFileDialogをやってみました。
NuGetで 適当なところに Microsoft.WindowsAPICodePack.dll をDLし、
net48ディレクトリに入っている Microsoft.WindowsAPICodePack.dll を
今回のプロジェクトの、VC#等でいうReleaseディレクトリ内に相当する場所( binディレクトリ ) に配置。
そして、Cygwin上で
C:/Windows/Microsoft.NET/Framework/v4.0.30319/csc /nologo -reference:./bin/Microsoft.WindowsAPICodePack.dll /target:winexe /out:.\bin\Main.eXe .\src\main.cs .\src\sub\MainForm.cs
とコンパイルしました。
コードは、
C#
1using System; 2using System.Windows.Forms; 3 4using Sample.Forms; 5 6using Microsoft.WindowsAPICodePack; 7using Microsoft.WindowsAPICodePack.Dialogs; 8 9namespace Sample{ 10 class EntryPoint{ 11 [STAThread] 12 static void Main( string[] args ){ 13 try{ 14 // メインウィンドウの生成と起動 15 Application.Run( new MainForm( args ) ); 16 17 CommonSaveFileDialog dialog = new CommonSaveFileDialog(); 18 19 // ここで処理する 20 21 }catch( System.Exception err ){ 22 MessageBox.Show( err.Message, "例外発生" ); 23 } 24 } 25 } 26}
としました。
すると、
src\main.cs(17,17): error CS0246: 型または名前空間名 'CommonSaveFileDialog' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 src\main.cs(17,51): error CS0246: 型または名前空間名 'CommonSaveFileDialog' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。 make: *** [makefile:69: .\bin\Main.eXe] Error 1
とエラーを吐きます。
ちなみに sub\MainForm.cs に書こうとすると usingディレクティブを追加しただけで下記のエラーを吐きます。
src\sub\MainForm.cs(8,17): error CS0234: 型または名前空間名 'WindowsAPICodePack' は名前空間 'Microsoft' に存在しません。アセンブリ参照が不足しています。 make: *** [makefile:72: .\bin\Testor.eXe] Error 1
と出ます。
DLLのファイル名自体に "." を含んでいるためかと思い、
./bin/WindowsAPICodePack.dll
のようにしてみましたが変わらず。
"/" がスイッチと解釈されているのかと思い、(コンパイル時に) -reference:.\bin\WindowsAPICodePack.dll のようにしてみましたが、
それでも変わらず。
メッセージ的には「名前空間が違う」か「(usingしている)名前空間が足りない」的な意味でしょうけど、
「WindowsAPICodePack CommonSaveFileDialog」と検索しても
using Microsoft.WindowsAPICodePack;
を追加しろ…とだけなので……
[構成]
+ binディレクトリ + WindowsAPICodePack.dll + (ここに実行ファイルが生成される) + srcディレクトリ + main.cs + subディレクトリ + MainForm.cs + (ここからコンパイルしたりしている)
※ NuGet は ここからダウンロードしました。
回答3件
あなたの回答
tips
プレビュー