« 2012年6月 | トップページ | 2012年9月 »

2012年7月

2012年7月17日 (火)

C# : LINQ (Enumerable メソッドサンプル一覧)

<目次はここです>

C#を勉強した結果、要素の集まり(Collection)に対する処理としてLINQ式が便利なのが分かりました。
使い方のサンプルコード一覧を作りました。

サンプルコード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace gomi {
    class Program {
        static void Main(string[] args) {
            {

                Console.WriteLine("\n------------------------->  {0}", "要素列挙(基本)");
                int[] a = { 1, 2, 3, 4 };
                Console.WriteLine("要素数={0}", a.Count());
                foreach (int s in a) Console.Write(s + ", ");
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "ソート OrderBy");
                int[] a = { 1, 4, 3, 2 };
                var c = a
.OrderBy(x => x);
                foreach (int s in c) Console.Write(s + ", ");
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "ソート (逆順) OrderByDescending");
                int[] a = { 1, 4, 3, 2 };
                var c = a.
OrderByDescending(x => x);
                foreach (int s in c) Console.Write(s + ", ");
            }
            {
               Console.WriteLine("\n------------------------->  {0}", "抽出 where");
                int[] a = { 1, 2, 3, 4 };
                Console.WriteLine("要素数={0}", a.
Count(x => 0 == x % 2));
                var c = a.
Where(x => 0 == x % 2);
                foreach (int s in c) Console.Write(s + ", ");
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "一意(重複不可)Distinct");
                int[] a = { 1,
2, 2, 3 };
                var c = a.
Distinct();
                foreach (int s in c) Console.Write(s + ", ");

            }
            {

                Console.WriteLine("\n------------------------->  {0}", "連結 Concat ");
                int[] a = { 1, 2,
3 };
                int[] b = {
3, 4, 5 };
                var c = a.
Concat(b);
                foreach (int s in c) Console.Write(s + ", ");
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "連結 Union (一意の要素だけを返す)");
                int[] a = { 1, 2,
3 };
                int[] b = {
3, 4, 5 };
                var c = a.
Union(b);
                foreach (int s in c) Console.Write(s + ", ");
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "要素を含んでいるか Contains");
                int[] a = { 1, 2, 3, 4 };
                Console.WriteLine("指定( 2)要素含む? {0}", a.
Contains(2));
                Console.WriteLine("指定(10)要素含む? {0}", a.
Contains(10));
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "差集合(XX以外) Except");
                int[] a = { 1, 2,
3 };
                int[] b = {
3, 4, 5 };
                var c = a.
Except(b);
                foreach (int s in c) Console.Write(s + ", ");
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "全ての要素が条件を満たしているか All");
                int[] a = { 1, 2, 3, 4 };
                Console.WriteLine("全ての要素は0より大きい? {0}", a.
All(x => 0 < x));
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "平均 Average");
                int[] a = { 1, 2, 3, 4 };
                Console.WriteLine("平均={0}", a.
Average());
            }
            {

                Console.WriteLine("\n------------------------->  {0}", "指定keywordで2つの集合の要素を連結 join");
                List<商品> a = new List<商品> { new 商品 { ID = 1, Name = "鉛筆" }, new 商品 { ID = 2, Name = "ボールペン" } };
                List<金額> b = new List<金額> { new 金額 { ID = 1, Price = 100 }, new 金額 { ID = 2, Price = 200 } };
                var c = a.
Join(b, 商品 => 商品.ID, 金額 => 金額.ID, (商品, 金額) => new { ID = 商品.ID, Name = 商品.Name, Price = 金額.Price });
                foreach (var obj in c) Console.Write(obj.ID + ": " + obj.Name + ", " + obj.Price + "\n");
            }

            Console.Write("\n KEY入力で終了します:");
            Console.ReadKey();

        }

        class 商品 {
            public int ID { get; set; }
            public string Name { get; set; }
        }

        class 金額 {
            public int ID { get; set; }
            public int Price { get; set; }
        }

    }
}

 

実行結果

------------------------->  要素列挙(基本)
要素数=4
1, 2, 3, 4,

------------------------->  ソート OrderBy
1, 2, 3, 4,

------------------------->  ソート (逆順) OrderByDescending
4, 3, 2, 1,

------------------------->  抽出 where
要素数=2
2, 4,

------------------------->  一意(重複不可)Distinct
1, 2, 3,

------------------------->  連結 Concat
1, 2, 3, 3, 4, 5,

------------------------->  連結 Union (一意の要素だけを返す)
1, 2, 3, 4, 5,

------------------------->  要素を含んでいるか Contains
指定( 2)要素含む? True
指定(10)要素含む? False

------------------------->  差集合(XX以外) Except
1, 2,

------------------------->  全ての要素が条件を満たしているか All
全ての要素は0より大きい? True

 ------------------------->  平均 Average
平均=2.5

 ------------------------->  指定keywordで2つの集合の要素を連結 join
1: 鉛筆, 100
2: ボールペン, 200
 

KEY入力で終了します:

■Ref.
 ・
Enumerable メソッド                               msdn
 ・
LINQ クエリ式 (C# プログラミング ガイド)  msdn
 ・
C# 4がやってきた 川俣 晶さんの記事
   
@IT総合トップ > @IT CORE > Insider.NET > C# 4入門 > 第1回 dynamic型

2012年7月16日 (月)

C# : File Viewer を作ってみました <目次>

■作成に至る経緯
 最近多数のEXCELファイルを見る必要に迫られるました。
しかし2007以降のエクセルはウィンド上部に大きなリボンメニューがあるため、ファイルを表示する面積は小さいです。さらに多数のファイルを見るとなると、見たいファイルをメニューから選択するのも面倒です。
(後で知ったのですがリボンは非表示に出来るようです)

■言語としてC#を選んだ理由
 そこでファイル閲覧ソフト(FileViewer)を作ることにしました。最大の問題はExcelファイルの表示です。エクセルファイルの内部構造を解析し表示するなんていうことはとても出来ません。そこでマイクロソフトの C# で表示出来るか調べたところ、WebBrowser コンポーネントで表示できることが分かりました。

C#の勉強からアプリ作成までの過程をブログに書いてきました。やっと下図に示すようなそれなりの物ができました。
まとめとして今まで書いた記事への目次を、このページを書きました。

Fileviewer20120716_4

■目次
 1. Microsoft Visual C# Express
   これは無料のコンパイラです。ここからダウンロード出来ます。
 2. Frame 内にExcel 表示 & Excel 起動
   C# を使えば WebBrowserコンポーネントでエクセルを表示出来ることが分かりました。
   ただしコンポーネント内に表示させるにはWindowsの設定が必要です。
 3. リンク集 <自分用メモ> 、 ファイル関連のリンク集
   C# の学習を始めました。javaと比較すると文法にまとまりがないように感じました。
   ただクエリ式とかラムダ式などは実用性抜群だと思います。
 4.java、C# : メソッド呼出し、通信
   最初は大部分を使い慣れているjavaで作り、エクセル表示部だけをC#で作ろうと思いましたが、
   javaとC#の連携の方が面倒くさそうだったので結局連携は諦めました。
 5.File Viewer 作成してみました
   Visual C# の操作方法やUIの配置方法を学びました。
 6.ListBox を使った Drop、Collection、Filter の演習
   最初は画面にファイルドロップという単純なUIを考えていたのですが、欲が出てファイル選択ListBox
   を付加することにしました。ListBoxの使い方を学びました。
 7.ListBox の表示文字、色。 コレクションのソート、クエリ
   ListBox学習その2。 表示を分かり易くする方法を学びました。
 8.ListBox を使って「メニュー」サンプルコード作成
   ListBox学習その3。ListBox内のアイテムを削除するメニューを追加しました。

 9.LINQ (Enumerable メソッドサンプル一覧)
   LINQ式が便利だと分かったので、サンプルコード一覧を作成しました。

■備考
 ・OS設定が必要です
  WebBrowser コンポーネント(本ソフト)内にEXCELファイルを表示するためにはWindowsの設定が必要です。ここを参照して下さい。

2012年7月15日 (日)

C# : ListBox を使って「メニュー」サンプルコード作成

<目次はここです>

今回は「マウス右ボタン」で表示される「ショートカットメニュー」を作成しました。
メニューには「ContextMenuという古いタイプ」と「ContextMenuStripという新しいタイプ」があるようです。以下のサンプルプログラムでは「 bOldType」の値で新旧メニューを切り替えることができます。
Listbox20120715
■機能
 ・選択された1項目をListBoxから削除
 ・ListBox内の全項目を削除

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;

namespace Test20120715 {
    public partial class Form1 : Form {

        private dynamic mItemDelete;
        private dynamic mItemDeleteAll;

        public Form1() {
            InitializeComponent();
            listBox1.Items.AddRange(createDummyData());
            Boolean
bOldType = true;
            if (bOldType) {
                listBox1.ContextMenu = createContextMenu();             
  // 旧メニュー
            } else {
                listBox1.ContextMenuStrip = createContextMenuStrip(); 
// 新メニュー
            }
        }

        /// ダミーデータ
        private dynamic createDummyData() {
            string[] ret = { "AA", "BB", "CC" };
            return ret;
            //    var p = Directory.GetFiles(@"C:\bin").Select((n) => Path.GetFileName(n));
            //   return p.ToArray();
        }

        /// ListBox 内のアイテムが選択された時に実行
        private void listBox1_
SelectedIndexChanged(object sender, EventArgs e) {
            Boolean b = (0 < listBox1.SelectedItems.Count);
            if (b) {
                Console.WriteLine(listBox1.SelectedItem.ToString());
            }
            mItemDelete.Visible = mItemDelete.Enabled = b;
            mItemDeleteAll.Visible = mItemDeleteAll.Enabled = 0 < listBox1.Items.Count;
        }

        /// 古タイプのメニュー
        private ContextMenu createContextMenu() {

            ContextMenu menu = new ContextMenu();
            MenuItem itemDelete = new MenuItem("選択中のアイテムを削除", new System.EventHandler(this.itemDelete_Click));
            MenuItem itemDeleteAll = new MenuItem("全てのアイテムを削除", new System.EventHandler(this.itemDeleteAll_Click));
            menu.MenuItems.Add(itemDelete);
            menu.MenuItems.Add(itemDeleteAll);
            mItemDelete = itemDelete;
            mItemDeleteAll = itemDeleteAll;
            mItemDelete.Visible = mItemDeleteAll.Visible = false;

            return menu;
        }

        /// 新タイプのメニュー
        private ContextMenuStrip createContextMenuStrip() {

            ContextMenuStrip menu = new ContextMenuStrip();
            ToolStripButton itemDelete = new ToolStripButton("選択中のアイテムを削除");
            ToolStripButton itemDeleteAll = new ToolStripButton("全てのアイテムを削除");
            menu.ShowImageMargin = false;
            menu.Items.Add(itemDelete);
            menu.Items.Add(itemDeleteAll);
            itemDelete.Click += new System.EventHandler(this.itemDelete_Click);
            itemDeleteAll.Click += new System.EventHandler(this.itemDeleteAll_Click);
            mItemDelete = itemDelete;
            mItemDeleteAll = itemDeleteAll;
            mItemDelete.Visible = mItemDeleteAll.Visible = false;

            return menu;
        }

        /// メニューで1項目削除が選択された時のアクション
        private void
itemDelete_Click(object sender, EventArgs e) {
            if (sender is MenuItem || sender is ToolStripButton) {
               
listBox1.Items.Remove(listBox1.SelectedItem);
            } else {
                Debug.Assert(false, "Error:" + sender);
            }
        }

        /// メニューで全項目削除が選択された時のアクション
        private void
itemDeleteAll_Click(object sender, EventArgs e) {
            if (sender is MenuItem || sender is ToolStripButton) {
            
    listBox1.Items.Clear();
                mItemDelete.Visible = mItemDeleteAll.Visible = false;

            } else {
                Debug.Assert(false, "Error:" + sender);
            }
        }
    }
}

■Ref.
 ・
ContextMenuStrip クラス msdn
 ・
ContextMenu       クラス  msdn

2012年7月14日 (土)

C# : ListBox の 表示文字、色。コレクションのソート、クエリ。

<目次はここです>

前回に引き続いてListBoxを使ったサンプルプログラムを作成しました。
Listbox20120714b_2

■演習内容
 ①java の ListCellRenderer に相当する処理
  ・ListBox に表示される文字を指定。 (例:ファイル名を表示)
  ・ファイル拡張子によって表示色を変更
  ・選択された時の背景色を設定

 ②コレクション
  ・ジェネリック
  ・ソート

 ③クエリ
  ・foreach(<T> x in collection){} の代わりにクエリ使用

 ④特殊フォルダ名取得
  ・MyDocuments      :
System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
  ・Currentフォルダ     :
Environment.CurrentDirectory
  ・フォフダ内のファイル一覧取得 :
Directory.GetFiles( @"C:\1_temp" )

Form1.Designer.cs

namespace Test20120714 {
    partial class Form1 {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows フォーム デザイナーで生成されたコード

        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent() {
            this.listBox1 = new System.Windows.Forms.ListBox();
            this.SuspendLayout();
            //
            // listBox1
            //
            this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
            | System.Windows.Forms.AnchorStyles.Left)
            | System.Windows.Forms.AnchorStyles.Right)));

            this.listBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;
            this.listBox1.FormattingEnabled = true;
            this.listBox1.ItemHeight = 12;
            this.listBox1.Location = new System.Drawing.Point(12, 19);
            this.listBox1.Name = "listBox1";
            this.listBox1.Size = new System.Drawing.Size(309, 148);
            this.listBox1.TabIndex = 0;

            this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.listBox1_DrawItem);
            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(342, 197);
            this.Controls.Add(this.listBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion
        private System.Windows.Forms.ListBox listBox1;
    }
}

 

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace Test20120714 {
    public partial class Form1 : Form {

        public Form1() {
            InitializeComponent();
            setDummyData();
        }

        /// ダミーデータ追加
        private void setDummyData() {
            List<MyFile> list =
new List<MyFile>(); // Collection に Generics 使用
            listBox1.BeginUpdate();
            
foreach (string file in Directory.GetFiles(Environment.CurrentDirectory)) {
                list.Add(new MyFile(file));
            }
            
{// foreach の代わりに クエリを使用
            
   string myDocuments = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
               
var scoreQuery = from score in Directory.GetFiles(myDocuments) select new MyFile(score);
                list.AddRange(scoreQuery);
            }
          
list.Sort(CompareFile);  // ソート
            listBox1.
DataSource = list;
            listBox1.EndUpdate();
        }

        /// ソートで使用
        private int
CompareFile(MyFile f1, MyFile f2) {
            return f1.Extension.CompareTo(f2.Extension); 
// この例では拡張子でソート
        }

        /// DrawMode プロパティを DrawMode.OwnerDrawFixed または DrawMode.OwnerDrawVariable に設定
        /// ListBox1.DrawItem に  System.Windows.Forms.DrawItemEventHandler を追加

        private void listBox1
_DrawItem(object sender, DrawItemEventArgs e) {
            if (-1 == e.Index) {
// ListBoxが空のときにListBoxが選択されるとe.Indexが-1になる
                return;
            }
            object item = ((ListBox)sender).Items[e.Index];
            
Brush myBrush = Brushes.Black;                                            // デフォルトは黒色                
            if (item is MyFile) {
                MyFile p = ((MyFile)item);
                string ext = p.Extension;
                if (ext == ".xls" || ext == ".xlsx") {
                    myBrush = Brushes.Blue;
                } else if (ext == ".ppt") {
                    myBrush = Brushes.Violet;
                } else if (ext == ".jpg" || ext == ".jpeg" || ext == ".tiff" || ext == ".gif") {
                    myBrush = Brushes.LawnGreen;
                } else if (ext == ".exe") {
                    myBrush = Brushes.Red;
                }
            }
            e.DrawBackground();
            if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) {
   
             e.Graphics.FillRectangle(Brushes.Lavender, e.Bounds);  // 選択された Item の背景色設定
            }
            string txt = item is MyFile ? ((MyFile)item).FileName : item.ToString();
// ListBox に表示する文字列
            e.Graphics.DrawString(txt, e.Font, myBrush, e.Bounds, StringFormat.GenericDefault);
            e.DrawFocusRectangle(); // If the ListBox has focus, draw a focus rectangle around the selected item.

        }
    }

    /// ファイルを表すクラス
    class MyFile {
        private readonly string path;
        public string FileName { get; private set; } 
// ファイル名 (親パスを除く
        public string Extension { get; private set; }
// 拡張子

        public MyFile(string path) {
            this.path = path;
            FileName = Path.GetFileName(path);
            Extension = Path.GetExtension(path);
       }

        /// ListBox.Items.Contains()で使用
        public override bool
Equals(object obj) {
            if (obj == null || this.GetType() != obj.GetType()) {
                return false;
            } else {
                return this.path.Equals(((MyFile)obj).path);
            }
        }

        /// Equals で等しいと判断されるものは同じhashCodeを返す必要あり        
        public override int
GetHashCode() {
            return this.path.GetHashCode();
        }

        public override string ToString() {
            return FileName;
        }
    }
}

 

foreach List<MyFile> list = new List<MyFile>();
foreach (string file in Directory.GetFiles(@"C:\1_temp")) {
        list.
Add(new MyFile(file));
}
Query List<MyFile> list = new List<MyFile>();
var scoreQuery =
from score in Directory.GetFiles(@"C:\1_temp")
    
select new MyFile(score);
list.
AddRange(scoreQuery);
Query
+ラムダ式
List<MyFile> list = new List<MyFile>();
list.
AddRange(Directory.GetFiles(@"C:\1_temp").Select((n) => new MyFile(n)));

 

■Ref
 ・foreach(x in collection){}               msdn
 ・
演算子一覧                     msdn 。 3項演算子 string s = 0 < x ? "A":"B";

 ・ListBox.DrawItem イベント            msdn
 ・
ListBox.Sort メソッド                msdn
 ・
ListControl.DataSource プロパティ       msdn

 ・List.Sort メソッド (ジェネリック Comparison)  msdn
 ・
System.Collections.Generic 名前空間     msdn

C# : ListBox を使った Drop、Collection、Filter の演習

<目次はここです>

ListBox にドロップしたファイルの名前を表示するサンプルプログラムを作成しました。
機能は以下の通りです。
 ・ファイルをDropした場合、拡張子が ".txt" ならListBoxに追加
 ・フォルダをDropした場合、そのフォルダの中のある拡張子が ".txt" ファイルをListBoxに追加

Listbox20120714

■演習目的
 ・Drop 使用方法
 ・Collection 使用方法
 ・Collection に対するフィルタ使用方法
 ・ファイル/フォルダ判別方法
 ・ファイル名(拡張子)の取得方法

■サンプルコード

Form1.Designer.cs

namespace Test20120714 {
    partial class Form1 {
        /// <summary>
        /// 必要なデザイナー変数です。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
        protected override void Dispose(bool disposing) {
            if (disposing && (components != null)) {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region Windows フォーム デザイナーで生成されたコード 
        /// <summary>
        /// デザイナー サポートに必要なメソッドです。このメソッドの内容を
        /// コード エディターで変更しないでください。
        /// </summary>
        private void InitializeComponent() {
            this.listBox1 = new System.Windows.Forms.ListBox();
            this.SuspendLayout();
            //
            // listBox1
            //

            this.listBox1.AllowDrop = true;
            this.listBox1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
            | System.Windows.Forms.AnchorStyles.Left)
            | System.Windows.Forms.AnchorStyles.Right)));
            this.listBox1.FormattingEnabled = true;
            this.listBox1.ItemHeight = 12;
            this.listBox1.Location = new System.Drawing.Point(26, 19);
            this.listBox1.Name = "listBox1";
            this.listBox1.Size = new System.Drawing.Size(345, 184);
            this.listBox1.TabIndex = 0;

            this.listBox1.DragDrop += new System.Windows.Forms.DragEventHandler(this.listBox1_DragDrop);
            this.listBox1.DragEnter += new System.Windows.Forms.DragEventHandler(this.listBox1_DragEnter);

            //
            // Form1
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(402, 229);
            this.Controls.Add(this.listBox1);
            this.Name = "Form1";
            this.Text = "Form1";
            this.ResumeLayout(false);

        }
        #endregion
        private System.Windows.Forms.ListBox listBox1;
    }
}

 

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Test20120714 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
        }

        private void listBox1_DragDrop(object sender, DragEventArgs e) {
            
System.Collections.ArrayList list = new System.Collections.ArrayList(); // ファイル名保存変数
            foreach (string path in (string[])e.Data.GetData(DataFormats.FileDrop, false)) {
                if (File.GetAttributes(path) ==
FileAttributes.Directory) {
                    list.AddRange(
Directory.GetFiles(path));                // Dropされたフォルダ内のファイルのみ追加
                } else {
                    list.Add(path);                                                 
// Dropされたファイルを追加
                }
            }
            IEnumerable<string> query1 = list.OfType<string>().
Where(x => Path.GetExtension(x)==".txt"); // 拡張子フィルタ
            foreach (string path in query1) {
//             if (!listBox1.Items.Contains(path)) {                           
// 既に ListBox に登録済のファイルは追加しない
                    listBox1.Items.Add(path);                              
      // listBox に追加
//             }
            }
        }

        private void listBox1_DragEnter(object sender, DragEventArgs e) {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.All;
            else
                e.Effect = DragDropEffects.None;
        }
    }
}

■Ref.
 ・
Visual C# アプリケーションにファイルのドラッグ アンド ドロップ機能を提供する方法 マイクロソフト
 ・
File/Directoryクラス ファイルとディレクトリの操作         @IT
 ・
パス名やファイル名からベース名と拡張子を取得するには? @IT
 ・
Directory クラス                                                   msdn

 ・ListBox.ObjectCollection クラス                                         msdn
 ・
System.Collections 名前空間                                           msdn
 ・
フィルター処理                                                    msdn
 

2012年7月 9日 (月)

C# : File Viewer 作成してみました

<目次はここです>

C# の WebBrowser コントロール を使って FileViewer を作成してみました。
見ることが出来るのは、Excel, Word, PowerPoint, 画像, pdf などです。
Cfileviewer

Form1.cs (注意: Frame1 の AllowDrop プロパティを True にして下さい )

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;


namespace ExcelViewer {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();

            //     webBrowser1.Navigate(new Uri("http://www.yahoo.co.jp/"));
            //     webBrowser1.Navigate(@"C:\Temp\サンプル.xlsx");

        }

        private void Form1_DragDrop(object sender, DragEventArgs e) {
            string[] files = (string[])e.Data.GetData(
DataFormats.FileDrop, false);
            string name = files[0];
            string statusbarText = null;
            if (name.ToLower().EndsWith("
.url")) {
                string url;
                using (StreamReader sr = new StreamReader(name)) {
                    sr.ReadLine();                               
// 空読み
                    string line = sr.ReadLine();
                    url = line.Substring(4, line.Length - 4);
                }
                if (url != null) {
                  
webBrowser1.Navigate(new Uri(url));
                    statusbarText = name;
                }
            } else if (checkExtention(name)) {
               
webBrowser1.Navigate(name);
                statusbarText = name;
            }
            if (statusbarText == null) {
                statusbarText = "Error (このファイルは処理できません):" + name;

                //        ファイルに関連付けられたアプリ起動
                //        System.Diagnostics.Process.Start(@"C:\Temp\サンプル.xlsx");

            }
            toolStripStatusLabel1.Text = statusbarText;

            for (int i = 0; i < files.Length; i++) {
                // Console.WriteLine(files[i]);
            }

        }

        private void Form1_DragEnter(object sender, DragEventArgs e) {
            if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
                e.Effect = DragDropEffects.All;
            } else {
                e.Effect = DragDropEffects.None;
            }
        }

        private bool checkExtention(String absolutePath) {
            string[] office = { ".xls", ".xlsx", ".doc", ".ppt" };                                    
// MS Office 
            string[] image = { ".jpeg", ".jpg", ".png", ".tiff", ".gif", ".bmp" };               
// 画像
            string[] web = { ".htm", ".html" };                                                         
// html
            string[] other = { ".pdf", ".txt" };                                                         
// その他
            IEnumerable<string> p = office.Concat(image).Concat(web).Concat(other); 
// 配列の結合
            string ext = Path.GetExtension(absolutePath).ToLower();    
// ファイル名から拡張子取得
            return p.Contains(ext);

        }

        private void button1_Click(object sender, EventArgs e) {
            Application.Exit();
        }

    }
}

■設定
 ・OSの設定が必要です
   WebBrowser コントロール内に表示するためにWindowsの設定が必要です。

    ・あっちさんブログPOPOLOG --> [Win7] Internet Explorer で EXCEL ファイルを外部起動する方法
    ・ C# :Frame 内にExcel 表示 & Excel 起動

■実行環境
 ・OS:Windows 7
 ・コンパイラ:Microsoft Visual C# 2010 Express

2012年7月 8日 (日)

C# : リンク集 <ファイル関連>

<目次はここです>

■名前 ( System.IO.Path

string path = @"c:\temp\MyTest.txt";

Console.WriteLine( Path.GetDirectoryName(path) ); // c:\temp
Console.WriteLine( Path.GetFileName(        path) ); // MyTest.txt

■リストアップ ( Directory.GetFiles )

string[] files = Directory.GetFiles(@"C:\temp", "*", System.IO.SearchOption.AllDirectories);
foreach(string f in files){
          Console.WriteLine(f);
}

■読み書き  ( StreamReader クラス )

using (StreamReader sr = new StreamReader(@"TestFile.txt"))  {
          string line;
         
while ((line = sr.ReadLine()) != null)  {
                   
Console.WriteLine(line);
           }
}

■変化監視 ( FileSystemWatcher

void test()  {
        FileSystemWatcher watcher =
new FileSystemWatcher();
        watcher.Path = @"c:\temp";
        watcher.Filter = "*.txt";                        
// Only watch text files.
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite;       

        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);

        watcher.EnableRaisingEvents = true;       // Begin watching.
        Console.WriteLine("フォルダ監視開始");
    }

void OnChanged(object source, FileSystemEventArgs e) {
       Console.WriteLine("File: " +  e.FullPath + " " + e.ChangeType);
}

java、C# : メソッド呼出し、通信 <自分用メモ>

<目次はここです>

■java から C# のメソッドを呼び出す
 ・JNI
   ・
Java Native Interface                                                      、java6 documents, sun.com

 ・JAN
   ・
JNIより簡単にJavaとC/C++をつなぐ「JNA」とは               、 @IT
   ・
Java JNA and C# DLL (Howto, Tutorial)                   、freakxnet

■データの送受信
 ・ソケット
   ・
JavaとC#.netでのSocket通信                                     、@IT

   ・C#での自PC内プロセス間通信                、くまさんのブログ「吟遊詩人の戯言」
   ・
[C#][Program]C# .NETリモーティングを使ったプロセス間通信、tetsuarossaさんのブログ「プログラミングのこととか」
   ・
IpcServerChannel のサンプル                 、madn
   ・
IpcClientChannel のサンプル                  、msdn

C# : リンク集 <自分用メモ>

<目次はここです>

 ■C#専門 リンク
 ・@IT
   ・
連載:C#入門
   ・C#プログラミングTips
   ・C#記事一覧

 ・未確認飛行 C
   ・C# によるプログラミング入門

 ・msdn
   ・
Visual C# デベロッパーセンター

■Tip リンク
 
・ドロップ           : madan  /  @IT
 ・特殊ディレクトリのパス :DOBON.NET

■基本
 ・
Windowsアプリケーションのスケルトンを知る

■他言語MIX
 ・
C#からVisual Basicの関数を使う
 ・Win32 APIの呼び出し
 ・java から呼び出し

■新しいスタイル
 ・LINQサンプルコード一覧 このブログ記事
 ・ラムダ式
 ・dynamic型, var型

■クエリ、collection, 配列
 ・配列の連結: Concat

■バックグラウンド処理
 ・時間のかかる処理をバックグラウンドで実行するには?[2.0のみ、C#、VB] @IT
 ・10 行でズバリ!! [C#] Silverlight - バックグラウンド スレッドの利用       MS

■文字列
 ・
文字列処理に関するヒント
 ・StrConv : 全角文字 <---> 半角文字

■メモ
 ・終了    :  Environment.Exit(0);
Application.Exit(); DOBON.NET プログラミング道
 ・標準出力 : Console.WriteLine("ABC漢字");  書式
 ・定数    : const , readonly、 未確認飛行 C > 定数
 ・assert   : Debug.Assert(false, "Error:" + sender);
 ・パス     : string name =
@"C:\Temp\サンプル.xlsx"
 ・Equals, = = : 自作クラスのEqualsメソッドをオーバーライドして、等価の定義を変更する
 ・set,get   : 自動プロパティー, C# Ver3から?   public string FileName {  get; private set; }
 ・is, as         : instanceof
 ・色の名前  : Colors by Name  msdn

 ・
foreach (int i in FromTo(10, 20)) { Console.Write("{0}\n", i); }}
 ・関連付けられたアプリ起動 : System.Diagnostics.Process.Start(@"C:\Temp\サンプル.xlsx");
 ・ファイル自動close       : using StreamReader クラス


C# :Frame 内にExcel 表示 & Excel 起動

<目次はここです>
C#アプリでエクセルを表示するプログラムのサンプルです。

Windows 7の設定が必要なのですが、xp と違うので手間取ってしまいました。
備考:表示の拡大縮小は 「CTRL」キー +「マウスホイール」回転 で可能です。

C

C#サンプルコード (「C:\Temp」フォルダに「サンプル.xlsx」が必要です)
namespace ExcelViewer {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();

            webBrowser1.Navigate(new Uri("
http://www.yahoo.co.jp/"));
            webBrowser2.Navigate(@"
C:\Temp\サンプル.xlsx");
      //   System.Diagnostics.Process.Start(@"
C:\Temp\サンプル.xlsx");
        }
    }
}

■実行環境
 ・OS               : Windows 7
 ・Excel            : Excel 2007
 ・Visual Studio : 2010 、C# 2010 Express

■リファレンス
 ・あっちさんブログ POPOLOG 
   [Win7] Internet Explorer で EXCEL ファイルを外部起動する方法
 ・Microsoft サポート
   Visual C# 2005 または Visual C# .NET で WebBrowser コントロールを使用して Office ドキュメントを開く方法

 ・@IT
   .NET TIPS > Excelファイルにアクセスするには?[C#、VB]

■おまけ(ノートPCが安い)
 昨日「価格.com」を見ていたら 4GBメモリ積んだLenovoノートPC が
3万円を切っていました!
 先月出たばっかりの新製品です。親用に買うか迷っています。
   --> 追伸:購入し7/14届きました。私は比較するノートPC無いですがかなり良いと思います。

 価格.com --> Lenovo G580 26897LJ [グロッシーブラウン] \2,9531 @ 2012/07/08

2012年7月 3日 (火)

生物 : カミキリムシ <シロスジカミキリ>

今日の朝、廊下にカミキリ虫が居ました。

触角を除く胴体の大きさは約 5cm。結構でかいです。
調べてみると、シロスジカミキリであることが分りました。
日本最大種のカミキリだそうです。


触角を囲むように配置された、真黒で丸くない大きな複眼の目に迫力あります。
体の横にある一直線の黄色いラインもカッコ良い。

触ると、ギィギィ音を出します。力も強いです。
子供のころ、シロスジカミキリに手首を咬まれひどい目にあったことがあります。
咬まれた跡が残ったどころではなく、皮膚とその下の肉が切り裂かれました。

 決して手に載せたりしないようにして下さい。

1 2_3
3 4_3

このカミキリはその後何処かへ飛び立って行きました。
無事一生で一回の熱い夏を楽しんで欲しい。がんばれカミキリ。


■リンク
 ・昆虫エクスプローラ > 
昆虫図鑑 > 甲虫目 > カミキリムシ > シロスジカミキリ
 ・以前見た綺麗な色の「
ラミーカミキリ

« 2012年6月 | トップページ | 2012年9月 »