┏第38号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ──<メニュー>─────────────────────── ■.NET質問箱 ・Microsoft Officeでコピーした図をPictureBoxに表示するには? ・用紙のサイズをコンボボックスに表示して、選択して印刷する ・FileSystemWatcherでファイル名が小文字になる ■コンピュータ雑学 ・BASICの歴史とMicrosoftの誕生 ─────────────────────────────── ─────────────────────────────── ■.NET質問箱 ─────────────────────────────── 「.NET質問箱」では、「どぼん!のプログラミング掲示板」に書き込 まれた.NETプログラミングに関する投稿を基に、さらに考察を加え、 Q&A形式にまとめて紹介します。 [URL]どぼん!のプログラミング掲示板 http://dobon.net/vb/bbs.html ●Microsoft Officeでコピーした図をPictureBoxに表示するには? 【質問】 Microsoft Office Wordなどで作成した図をクリップボードにコピー した時、このデータを取得してPictureBoxに表示するために次のよう なコードを書いたのですがうまくいきません。どのようにすればでき ますか? ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Dim data As IDataObject = Clipboard.GetDataObject() 'クリップボードにあるデータが拡張メタファイル形式か調べる If data.GetDataPresent(DataFormats.EnhancedMetafile) Then '拡張メタファイル形式でデータを取得する PictureBox1.Image = _ CType(data.GetData(DataFormats.EnhancedMetafile), Image) End If ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ IDataObject data = Clipboard.GetDataObject(); //クリップボードにあるデータが拡張メタファイル形式か調べる if (data.GetDataPresent(DataFormats.EnhancedMetafile)) { //拡張メタファイル形式でデータを取得する PictureBox1.Image = (Image) data.GetData(DataFormats.EnhancedMetafile); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 【回答】 この問題の解決法は、DOBON.NET掲示板へのピラルクさんの投稿や、 ニュースグループでのマイクロソフトのLion Shiさんの投稿が参考に なります。 [URL]microsoft.public.dotnet.general RE: Paste Word graphics into picturebox From:Lion Shi http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&inlang=ja&selm=zkPjolNhCHA.1496%40cpmsftngxa09 Lion Shiさんの投稿によると、Microsoft Officeの図をクリップボー ドにコピーした時、そのデータは上記のコードのように EnhancedMetafile形式では取得できないということです。 クリップボードにコピーされたデータは、EnhancedMetafile形式の他 に、Office Drawing Shape Format、MetaFilePict、PNG+Office Art、 JFIF+Office Art、GIF+Office Art、PNG、JFIF、GIF、 ActiveClipboard、HTML Format形式に関連付けられており、このうち、 HTML Format以外はMemoryStreamオブジェクトとしてデータを取得で きます。 つまり、Microsoft Officeでコピーした図を、例えばPNG形式でデー タを取得する場合は、次のようになります。ここではフォームにピク チャボックス"PictureBox1"があり、このPictureBox1にクリップボー ドにある図を表示するものとします。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ Dim data As IDataObject = Clipboard.GetDataObject() 'クリップボードにあるデータがPNG形式か調べる If data.GetDataPresent("PNG") Then 'PNG形式でデータをMemoryStreamとして取得する Dim ms As MemoryStream = CType(data.GetData("PNG"), MemoryStream) 'Imageオブジェクトに変換する PictureBox1.Image = Image.FromStream(ms) End If ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ IDataObject data = Clipboard.GetDataObject(); //クリップボードにあるデータがPNG形式か調べる if (data.GetDataPresent("PNG")) { //PNG形式でデータをMemoryStreamとして取得する MemoryStream ms = (MemoryStream) data.GetData("PNG"); //Imageオブジェクトに変換する PictureBox1.Image = Image.FromStream(ms); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ "PNG"以外の形式を試してみたところ、上記のコードで"PNG"の部分を 以下の文字列に変更した場合にのみ成功するようです。 "PNG+Office Art" "JFIF+Office Art" "GIF+Office Art" "JFIF" "GIF" ○この記事の基になった掲示板のスレッド [題名] クリップボードからの画像の取り込みについて [投稿者(敬称略)] わんこ, ピラルク [URL] http://dobon.net/vb/bbs/log3-2/825.html ─────────────────────────────── ●用紙のサイズをコンボボックスに表示して、選択して印刷する 【質問】 PrintDocumentクラスを使って印刷する際に、プリンタで印刷可能な 用紙のサイズをコンボボックスに一覧表示して、選択された用紙サイ ズで印刷されるようにしたいのですが、どのようにすればよいのでし ょうか? 【回答】 プリンタでサポートされている用紙サイズは、PrintDocumentオブジ ェクトのPrinterSettings.PaperSizesプロパティで取得できます。 フォームにPrintDocumentオブジェクト"PrintDocument1"とコンボボ ックス"ComboBox1"がすでに配置されている時、PrintDocument1で指 定されているプリンタでサポートされている用紙サイズをComboBox1 に表示するには、次のようにします。ComboBox1にはPaperSizeオブジ ェクトを追加し、ComboBox1のDisplayMemberプロパティを"PaperName "とすることにより、ComboBox1にはPaperSizeのPaperNameプロパティ で取得できる文字列が表示されるようにしています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ 'ComboBox1の項目をクリアする ComboBox1.Items.Clear() '表示するプロパティをPaperNameとする ComboBox1.DisplayMember = "PaperName" 'PaperSizeをComboBox1に追加していく Dim ps As System.Drawing.Printing.PaperSize For Each ps In PrintDocument1.PrinterSettings.PaperSizes ComboBox1.Items.Add(ps) Next ps ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //ComboBox1の項目をクリアする ComboBox1.Items.Clear(); //表示するプロパティをPaperNameとする ComboBox1.DisplayMember = "PaperName"; //PaperSizeをComboBox1に追加していく foreach (System.Drawing.Printing.PaperSize ps in PrintDocument1.PrinterSettings.PaperSizes) { ComboBox1.Items.Add(ps); } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ComboBox1で選択された用紙サイズで印刷するには、次のようにしま す。単に、DefaultPageSettings.PaperSizeプロパティをComboBox1. SelectedItemに変更しているだけです。(PrintDocument1の PrintPageイベントハンドラは省略されています。PrintPageイベント ハンドラがないと、印刷はできません。印刷する方法に関しては、 DOBON.NETの「印刷する」などをご覧ください。) [URL]DOBON.NET .NET Tips - 印刷する http://dobon.net/vb/dotnet/graphics/printdocument.html ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ '用紙サイズをComboBox1で選択されているサイズにする PrintDocument1.DefaultPageSettings.PaperSize = _ CType(ComboBox1.SelectedItem, System.Drawing.Printing.PaperSize) '印刷する PrintDocument1.Print() ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ //用紙サイズをComboBox1で選択されているサイズにする PrintDocument1.DefaultPageSettings.PaperSize = (System.Drawing.Printing.PaperSize) ComboBox1.SelectedItem; //印刷する PrintDocument1.Print(); ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ○この記事の基になった掲示板のスレッド [題名] 紙サイズの得取 [投稿者(敬称略)] star76, 管理人 [URL] http://dobon.net/vb/bbs/log3-2/718.html ─────────────────────────────── ●FileSystemWatcherでファイル名が小文字になる 【質問】 ファイルの変更を監視するためにFileSystemWatcherクラスを使って いますが、Changedイベントハンドラで取得できる FileSystemEventArgsオブジェクトのFullPathやNameプロパティのフ ァイル名が小文字になってしまいます。正しいファイル名を取得する にはどのようにすればよいのでしょうか? 【回答】 これは.NET Frameworkのバグのようです(.NET Framework 1.1でも修 正されていないようです)。よってこの問題を解決するには、今のと ころ小文字のファイル名から正しいファイル名を取得する何らかの方 法を考えるしかないようです。 このような小文字のファイル名から正しいファイル名を取得するため の方法が、ニュースグループで紹介されていました。 [URL]Newsgroups:microsoft.public.dotnet.framework RE: FileSystemWatcher returns changed files in lower case From:Donald Xie http://groups.google.co.jp/groups?hl=ja&lr=&ie=UTF-8&inlang=ja&selm=06c301c362dc%24ac383dc0%24a501280a%40phx.gbl この記事によると、ルートフォルダから順番にDirectoryInfoクラス のGetFileSystemInfosプロパティを使って一つずつ正しいフォルダ名 (最後はファイル名)を取得していくという方法でうまくいくとのこ とです。 上に紹介した記事にコードもありますが、私なりに書いたものを以下 に紹介します。このコード(メソッド)は、短いファイル名から長い ファイル名を取得するためにも使えるため、"GetLongPath"という名 前をつけています。 ‥‥▽VB.NET ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ''' ''' 短いファイル名から長いファイル名を取得する ''' ''' 短いファイル名(フルパス) ''' 長いファイル名 Public Shared Function GetLongPath(ByVal path As String) As String 'ルートディレクトリを取得 Dim root As String = System.IO.Path.GetPathRoot(path) 'ルートディレクトリ以降を'\'で分割 Dim folders As String() = path.Substring(root.Length). _ Split(System.IO.Path.DirectorySeparatorChar) Dim res As String = root Dim name As String For Each name In folders Dim di = New DirectoryInfo(res) 'ディレクトリ(またはファイル)を探す Dim fsi As System.IO.FileSystemInfo() = _ di.GetFileSystemInfos(name) If fsi.Length = 1 Then res = fsi(0).FullName Else Throw New Exception("ERROR") End If Next name Return res End Function ‥‥△VB.NET ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ‥‥▽C# ここから▽‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ /// /// 短いファイル名から長いファイル名を取得する /// /// 短いファイル名(フルパス) /// 長いファイル名 public static string GetLongPath(string path) { //ルートディレクトリを取得 string root = System.IO.Path.GetPathRoot(path); //ルートディレクトリ以降を'\'で分割 string[] folders = path.Substring(root.Length) .Split(System.IO.Path.DirectorySeparatorChar); string res = root; foreach (string name in folders) { System.IO.DirectoryInfo di = new DirectoryInfo(res); //ディレクトリ(またはファイル)を探す System.IO.FileSystemInfo[] fsi = di.GetFileSystemInfos(name); if (fsi.Length == 1) res = fsi[0].FullName; else throw new Exception("ERROR"); } return res; } ‥‥△C# ここまで△‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥ ○この記事の基になった掲示板のスレッド [題名] FileSystemWatcherのイベントで得られるファイル名のアルフ ァベットがなぜか小文字になる現象 [投稿者(敬称略)] とざマン, ピラルク [URL] http://dobon.net/vb/bbs/log3-2/870.html ─────────────────────────────── ■コンピュータ雑学 ─────────────────────────────── ここでは、話すと人に嫌われるなまぬるいコンピュータに関する雑学 を紹介します。 ●BASICの歴史とMicrosoftの誕生 BASIC(Beginner's All-purpose Symbolic Instruction Code)は初心 者でも使いやすいプログラミング言語として、FORTRAN IIとALGOL 60 を基礎に、1964年アメリカのDartmouth大学で数学者のJohn Kemenyと Thomas Kurtzによって開発されました(5月1日午前4時に初めて BASICプログラムが実行されたとされています)。 1974年、Popular Electronics誌で、世界初のパーソナルコンピュー タ、MITS(Micro Instrumentation and Telemetry Systems)社の Altair 8080が紹介されると、これを見たPaul AllenとBill Gatesが、 1975年、世界初のマイクロコンピュータ用言語である、Altair 8800 用BASICインタープリタを開発しました。これをきっかけに、BASICが プログラミング言語として広まることになります。 Harvard大学の学生であったBill GatesとHoneywellの社員だったPaul Allenは、Paul AllenがHarvard大学にあったPDP-10を使ってAltairの エミュレータを作り、Bill GatesがBASICのコードを書きました。彼 らは開発に8週間を費やしたといわれていますが、Bill Gatesはこの 時書き上げたプログラムこそ人生で最高のプログラムだと語っている そうです。 Bill GatesとPaul Allenは1975年7月11日にMITS社とBASICのライセン ス契約を結びました。同月、Bill Gatesが$910、Paul Allenが$606を 出資し、Micro-Softを設立しました(その後、Microsoftとなります)。 つまりMicrosoftの最初の商品はBASICだったわけで、これが今の Visual Basic .NETに引き継がれているのです。 [URL]BASIC programming language - Wikipedia, the free encyclopedia http://en.wikipedia.org/wiki/BASIC_programming_language [URL]William H. Gates IV Page http://voteview.uh.edu/gates.htm =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  (Microsoft MVP for Visual Basic, Oct 2003-Oct 2004)  http://dobon.net  dobon_info@yahoo.co.jp ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/vb/bbs.html ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 - 2004 DOBON! All rights reserved. ===============================