SQLの窓

2013年10月29日


Android で Post と Get

HashMap を使って以下のように使用します

Map map = new HashMap();
map.put("url", "");
map.put("charset", "SHIFT_JIS");
map.put("action", "regist");
map.put("name", "lightbox");
map.put("title", "日本語");
map.put("comment", "本文");

new HttpPost() {
	@Override
	protected void onPostExecute(String result) {
		System.out.println(result);
	}
}.execute(map);

HttpPost.java
package jp.winofsql;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;

import android.os.AsyncTask;
import android.util.Log;

// *********************************************************
// POST して テキストを取得する
// *********************************************************
public class HttpPost extends AsyncTask<Map, Void, String> {

	@Override
	protected String doInBackground(Map... params) {
		
		StringBuffer get_data = null;
		
		Map<String,String> myArg = params[0];

		try {
			// ターゲット
			URL url = new URL(myArg.get("url"));
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setConnectTimeout(30000);
			http.setReadTimeout(30000);
			http.setDoOutput(true);
			http.setRequestMethod("POST");
			// 接続
			http.connect();
			
			OutputStreamWriter osw = new OutputStreamWriter(http.getOutputStream());
			BufferedWriter bw = new BufferedWriter(osw);
			
			Iterator<String> it =  myArg.keySet().iterator();
			String key = null;
			String value = null;
			String data = "";
			while(it.hasNext()) {
				key = it.next().toString();
				if ( key.equals("url") ) {
					continue;
				}
				value = myArg.get(key);
				if ( !data.equals("") ) {
					data += "&";
				}
				data += key + "=" + URLEncoder.encode(value, myArg.get("charset")) ;
			}
			
			Log.i("",data);
				
			bw.write( data );

			bw.close();
			osw.close();
			
			// 以下読み込み3セット
			InputStream i_stream = http.getInputStream();
			// UTF-8 でリーダーを作成
			InputStreamReader i_stream_reader = new InputStreamReader(i_stream, myArg.get("charset"));
			// 行単位で読み込む為の準備   
			BufferedReader b_reader = new BufferedReader(i_stream_reader);
			
			// 行の一括読みこみ
			String line_buffer;
			get_data = new StringBuffer();
			// BufferedReader は、readLine が null を返すと読み込み終了 
			while ( null != (line_buffer = b_reader.readLine() ) ) {   
				// コマンドプロンプトに表示   
				get_data.append( line_buffer );
				get_data.append( "\n" );
			}
			
			// 接続解除
			http.disconnect();
		}
		catch(Exception e) {
			Log.i("HttpPost", e.getMessage());
		}
		return get_data.toString();
	}
	

}

Get は 実行時の引数に URL と キャラクタセットを指定します

new HttpGet() {
	@Override
	protected void onPostExecute(String result) {
		System.out.println(result);
	}
}.execute("http://matome.naver.jp/feed/hot","UTF-8");

HttpGet.java
package jp.winofsql;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.AsyncTask;
import android.util.Log;

// *********************************************************
// GET して テキストを取得する
// *********************************************************
public class HttpGet extends AsyncTask<String, Void, String> {

	@Override
	protected String doInBackground(String... params) {
		StringBuffer get_data = null;

		try {
			// ターゲット
			URL url = new URL(params[0]);
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド
			http.setRequestMethod("GET");
			// 接続
			http.connect();

			
			// 以下読み込み3セット
			InputStream i_stream = http.getInputStream();
			// UTF-8 でリーダーを作成
			InputStreamReader i_stream_reader = new InputStreamReader(i_stream, params[1]);
			// 行単位で読み込む為の準備   
			BufferedReader b_reader = new BufferedReader(i_stream_reader);
			
			// 行の一括読みこみ
			String line_buffer;
			get_data = new StringBuffer();
			// BufferedReader は、readLine が null を返すと読み込み終了 
			while ( null != (line_buffer = b_reader.readLine() ) ) {   
				// コマンドプロンプトに表示   
				get_data.append( line_buffer );
				get_data.append( "\n" );
			}
			
			// 接続解除
			http.disconnect();					
		}
		catch(Exception e) {
			Log.i("HttpGet", e.getMessage());
		}						
		return get_data.toString();	
	}

}
関連する記事

Framework4.5(C#)ストア : HttpClient で Post と Get する汎用 static クラス
Framework4(C#) : WebClient で Post と Get する汎用 static クラス
Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス



posted by lightbox at 2013-10-29 21:37 | Android | このブログの読者になる | 更新情報をチェックする

Framework4.5(C#)ストア : HttpClient で Post と Get する汎用 static クラス

UrlEncode をキャラクタセットを指定して送れるようになっています。受信データは、Content-Type でキャラクタセットが指定されておれば、自動的に変換されています。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace winofsql {

	class Tool {

		// 戻される文字列は、サーバー側で Content-Type に Charset が
		// 指定されておれば自動変換されます

		// *********************************************
		// UTF-8 POST
		// *********************************************
		public static async Task<string> Post(string url, Dictionary<string, string> param) {
			string result = "";

			try {
				HttpClient httpClient = new HttpClient();
				httpClient.MaxResponseContentBufferSize = int.MaxValue;
				HttpContent content = new FormUrlEncodedContent(param);
				var response = await httpClient.PostAsync(url, content);
				String text = await response.Content.ReadAsStringAsync();

				result = text;
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

			return result;

		}

		// *********************************************
		// エンコード指定 POST
		// *********************************************
		public static async Task<string> Post(string url, string encoding, Dictionary<string, string> param) {
			string result = "";
			string query_string = "";
			byte[] data1 = null;
			byte[] data2 = null;
			string data3 = null;

			foreach (KeyValuePair<string, string> kvp in param) {
				if (query_string == "") {
					query_string += "";
				}
				else {
					query_string += "&";
				}

				data1 = Encoding.GetEncoding(encoding).GetBytes(kvp.Value);
				data2 = WebUtility.UrlEncodeToBytes(data1, 0, data1.Length);
				data3 = Encoding.GetEncoding(encoding).GetString(data2, 0, data2.Length);
				query_string += kvp.Key + "=" + data3;
			}

			try {

				HttpClient httpClient = new HttpClient();
				HttpContent content = new StringContent(query_string);
				content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
				var response = await httpClient.PostAsync(url, content);
				String text = await response.Content.ReadAsStringAsync();

				result = text;
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

			return result;

		}

		// *********************************************
		// URL のみ呼び出し GET
		// *********************************************
		public static async Task<string> Get(string url) {
			string result = "";

			HttpClient httpClient = new HttpClient();

			HttpResponseMessage response = null;
			try {
				response = await httpClient.GetAsync(url);
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}
			// 接続に失敗
			if (response == null) {
				return result;
			}

			try {
				response.EnsureSuccessStatusCode();
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}
			// HTTP 応答の失敗
			if (!response.IsSuccessStatusCode) {
				return result;
			}

			// 内容を文字列として取得
			try {
				String text = await response.Content.ReadAsStringAsync();

				result = text;
			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

			return result;

		}

		// *********************************************
		// データ呼び出し( UTF-8 ) GET
		// *********************************************
		public static async Task<string> Get(string url, Dictionary<string, string> param) {

			string query_string = "";

			foreach (KeyValuePair<string, string> kvp in param) {
				if (query_string == "") {
					query_string += "?";
				}
				else {
					query_string += "&";
				}
				query_string += kvp.Key + "=" + WebUtility.UrlEncode(kvp.Value);
			}

			return await Get(url + query_string);

		}

		// *********************************************
		// データ呼び出し( エンコード指定 ) GET
		// *********************************************
		public static async Task<string> Get(string url, string encoding, Dictionary<string, string> param) {

			string query_string = "";
			byte[] data1 = null;
			byte[] data2 = null;
			string data3 = null;

			foreach (KeyValuePair<string, string> kvp in param) {
				if (query_string == "") {
					query_string += "?";
				}
				else {
					query_string += "&";
				}
				data1 = Encoding.GetEncoding(encoding).GetBytes(kvp.Value);
				data2 = WebUtility.UrlEncodeToBytes(data1, 0, data1.Length);
				data3 = Encoding.GetEncoding(encoding).GetString(data2, 0, data2.Length);

				query_string += kvp.Key + "=" + data3;
			}

			return await Get(url + query_string);

		}

	}
}


呼び出し
string result = await winofsql.Tool.Post(
	"http://localhost/lightbox/sample/test.php",
	"shift_jis",
	new Dictionary<string, string>() { { "field1", "日本語" }, { "field2", "表示" } });

if (result.PadRight(5).Substring(0, 5) == "ERROR") {
	Debug.WriteLine(result);
}

関連する記事

Framework4(C#) : WebClient で Post と Get する汎用 static クラス
Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス
Android で Post と Get


posted by lightbox at 2013-10-29 21:02 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

Framework4(C#) : WebClient で Post と Get する汎用 static クラス

テストしたのは、Windows7 + Visual Studio 2010 + WPF アプリケーションです。

Web アクセスには、UrlEncode が必要になりますが、HttpUtility.UrlEncode はプロジェクトのプロパティで、『.NET Framework 4』にして System.Web を参照します。最初にプロジェクトを作成した場合、『.NET Framework 4 Client Profile』にセットされている場合があり、その場合  System.Web を参照できません。

HttpUtility.UrlEncode は、Windows Phone(OS 7.1) にもある事はあるのですが、エンコード結果が UTF-8 系列しか指定できないので、Encoding を指定する第二引数がありません。参照も、System.Windows の中の System.Net にあります。ですから、このクラスは Windows Phone(OS 7.1) では使用できません。

%エンコーディングの仕様が違いますが、WEB へ送信する場合は、Uri.EscapeDataString でも使用可能で、Twitter への投稿ではこちら(RFC 3986)が良いと思いますが、文字列は UTF-8 に変換されてエンコーディングされます。
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using System.Web;

namespace winofsql {

	class Tool {

        public static string serverEncoding = "utf-8";

		// *********************************************
		// UTF-8 POST
		// *********************************************
		public static string Post(string url,
            Dictionary<string, string> param,
            UploadStringCompletedEventHandler UploadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( UploadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.UploadStringCompleted += UploadStringCompleted;
                }

                webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

            		// *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
            		// *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
                }
                
                webClient.UploadStringAsync(new Uri(url), "POST", data_string);

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// エンコード指定 POST
		// *********************************************
		public static string Post(string url,
            string encoding,
            Dictionary<string, string> param,
            UploadStringCompletedEventHandler UploadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( UploadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.UploadStringCompleted += UploadStringCompleted;
                }

                webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

            		// *******************************************************
                    // プロジェクトのプロパティの対象のフレームワークを 
                    //『.NET Framework 4』 にして System.Web を参照します
            		// *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
                }
                
                webClient.UploadStringAsync(new Uri(url), "POST", data_string);

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// URL のみ呼び出し GET
		// *********************************************
		public static string Get(
            string url,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

			string result = "";

			try {
				WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if ( DownloadStringCompleted != null ) {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                webClient.DownloadStringAsync(new Uri(url));

			}
			catch (Exception Err) {
				result = "ERROR: " + Err.Message;
			}

            return result;

		}

		// *********************************************
		// データ呼び出し( UTF-8 ) GET
		// *********************************************
		public static string Get(
            string url, 
            Dictionary<string, string> param,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

            string result = "";

            try
            {
                WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if (DownloadStringCompleted != null)
                {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

                    // *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
                    // *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.UTF8);
                }

                webClient.DownloadStringAsync(new Uri(url + "?" + data_string));

            }
            catch (Exception Err)
            {
                result = "ERROR: " + Err.Message;
            }

            return result;

		}

		// *********************************************
		// データ呼び出し( エンコード指定 ) GET
		// *********************************************
		public static string Get(
            string url,
            string encoding,
            Dictionary<string, string> param,
            DownloadStringCompletedEventHandler DownloadStringCompleted=null) {

            string result = "";

            try
            {
                WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.GetEncoding(serverEncoding);

                if (DownloadStringCompleted != null)
                {
                    // 呼び出し側でラムダ式を使う事を想定した
                    // イベント登録
                    webClient.DownloadStringCompleted += DownloadStringCompleted;
                }

                string data_string = "";

                foreach (KeyValuePair<string, string> kvp in param)
                {
                    if (data_string != "")
                    {
                        data_string += "&";
                    }
                    data_string += kvp.Key + "=";

                    // *******************************************************
                    // プロジェクトのプロパティの対象フレームワークを 
                    //『Framework 4』 にして System.Web を参照します
                    // *******************************************************
                    data_string += HttpUtility.UrlEncode(kvp.Value, Encoding.GetEncoding(encoding));
                }

                webClient.DownloadStringAsync(new Uri(url + "?" + data_string));

            }
            catch (Exception Err)
            {
                result = "ERROR: " + Err.Message;
            }

            return result;

		}

	}
}


使用方法のサンプル
Tool.serverEncoding = "utf-8";
Tool.Post("http://student.xii.jp/lightbox/php_sample_1/log.php",
	"utf-8",
	new Dictionary<string, string>() { { "send", "ok" }, { "text", "日本語" } },
(object _sender, UploadStringCompletedEventArgs _e) =>
{
	// Error プロパティがセットされているとエラー
	if (_e.Error != null)
	{
		// エラー処理
	}
	// 正常な結果
	else
	{
		// 正常処理
	}
});

関連する記事

Framework4.5(C#)ストア : HttpClient で Post と Get する汎用 static クラス
Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス
Android で Post と Get

いろいろな言語におけるバーセントエンコーディング





posted by lightbox at 2013-10-29 21:01 | VS(C#) | このブログの読者になる | 更新情報をチェックする

Framework4(C#) : Windows Phone OS 7.1 : WebClient で Post と Get する汎用 static クラス

Windows Phone では、Encoding に UTF-8 系しか無いので、アクセス先は UTF-8 限定となります。

  • utf-8 : UTF8Encoding
  • utf-16 : UnicodeEncoding (リトル エンディアン)
  • utf-16BE : UnicodeEncoding (ビッグ エンディアン)
  • utf-16LE :
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Text;
    
    namespace winofsql {
    
    	class Tool {
    
    		// *********************************************
    		// UTF-8 POST
    		// *********************************************
    		public static string Post(string url,
                Dictionary<string, string> param,
                UploadStringCompletedEventHandler UploadStringCompleted=null) {
    
    			string result = "";
    
    			try {
    				WebClient webClient = new WebClient();
    
                    if ( UploadStringCompleted != null ) {
                        // 呼び出し側でラムダ式を使う事を想定した
                        // イベント登録
                        webClient.UploadStringCompleted += UploadStringCompleted;
                    }
    
                    webClient.Headers["Content-Type"] = "application/x-www-form-urlencoded";
    
                    string data_string = "";
    
                    foreach (KeyValuePair<string, string> kvp in param)
                    {
                        if (data_string != "")
                        {
                            data_string += "&";
                        }
                        data_string += kvp.Key + "=";
    
                		// *******************************************************
                        // System.Windows 内の System.Web にあります
                		// *******************************************************
                        data_string += HttpUtility.UrlEncode(kvp.Value);
                    }
                    
                    webClient.UploadStringAsync(new Uri(url), "POST", data_string);
    
    			}
    			catch (Exception Err) {
    				result = "ERROR: " + Err.Message;
    			}
    
                return result;
    
    		}
    
    		// *********************************************
    		// URL のみ呼び出し GET
    		// *********************************************
    		public static string Get(
                string url,
                DownloadStringCompletedEventHandler DownloadStringCompleted=null) {
    
    			string result = "";
    
    			try {
    				WebClient webClient = new WebClient();
    
                    if ( DownloadStringCompleted != null ) {
                        // 呼び出し側でラムダ式を使う事を想定した
                        // イベント登録
                        webClient.DownloadStringCompleted += DownloadStringCompleted;
                    }
    
                    webClient.DownloadStringAsync(new Uri(url));
    
    			}
    			catch (Exception Err) {
    				result = "ERROR: " + Err.Message;
    			}
    
                return result;
    
    		}
    
    		// *********************************************
    		// データ呼び出し( UTF-8 ) GET
    		// *********************************************
    		public static string Get(
                string url, 
                Dictionary<string, string> param,
                DownloadStringCompletedEventHandler DownloadStringCompleted=null) {
    
                string result = "";
    
                try
                {
                    WebClient webClient = new WebClient();
    
                    if (DownloadStringCompleted != null)
                    {
                        // 呼び出し側でラムダ式を使う事を想定した
                        // イベント登録
                        webClient.DownloadStringCompleted += DownloadStringCompleted;
                    }
    
                    string data_string = "";
    
                    foreach (KeyValuePair<string, string> kvp in param)
                    {
                        if (data_string != "")
                        {
                            data_string += "&";
                        }
                        data_string += kvp.Key + "=";
    
                        // *******************************************************
                        // System.Windows 内の System.Web にあります
                        // *******************************************************
                        data_string += HttpUtility.UrlEncode(kvp.Value);
                    }
    
                    webClient.DownloadStringAsync(new Uri(url + "?" + data_string));
    
                }
                catch (Exception Err)
                {
                    result = "ERROR: " + Err.Message;
                }
    
                return result;
    
    		}
    
    	}
    }
    
    
    関連する記事
    
    いろいろな言語におけるバーセントエンコーディング
    
    Framework4.5(C#)ストア : HttpClient で Post と Get する汎用 static クラス
    Framework4(C#) : WebClient で Post と Get する汎用 static クラス
    Android で Post と Get
    
    
    
    
    posted by lightbox at 2013-10-29 21:00 | Windows Phone | このブログの読者になる | 更新情報をチェックする

    別の ADT(Android) で作成されたワークスペースを最新の ADT で開く場合の操作方法

    現在の状態
    
    
    
    現在最新の ADT では、以前必要だった空のプロジェクトを作成せずにインポートできますが、Metadata が含まれたワークスペースを開く場合は、SDK の場所の変更と、プロジェクトが使用する Android SDK のバージーョンを指定する必要がある場合があります。
    
    まず、プロジェクトが『自動にビルド』になっている事を確認
    
    
    
    SDK の場所の再設定
    
    
    
    
    
    
    
    プロジェクトの SDK のバージョンの選択
    
    
    
    
    
    
    これ以外にも、直接動作に支障が無い場合が多いですが、Manifest に SDK のターゲットを指定する場所があります。 
    
    
    
    
    posted by lightbox at 2013-10-29 13:13 | Android | このブログの読者になる | 更新情報をチェックする

    2013年10月27日


    WPF(C#) : 『DataGrid に、TKMP.DLL を使用して非同期にメールヘッダを受信する』 テンプレート

    SkyDrive へ移動
    
    
    メールサーバーは GMail の IMAP を使用してテストしています
    
    
    
    MainWindow.xaml.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Net;
    using System.Windows;
    using System.Windows.Input;
    using System.Collections.ObjectModel;
    using TKMP.Net;
    using System.IO;
    using TKMP.Reader;
    using System.Threading;
    
    namespace WPF_DataGrid1 {
    	public partial class MainWindow : Window {
    
    		private MainViewModel mvm = new MainViewModel();
    		private SynchronizationContext sc = null;
    		private ImapClient client = null;
    		private int endCounter = 0;
    
    		// *********************************************
    		// コンストラクタ
    		// *********************************************
    		public MainWindow() {
    			InitializeComponent();
    
    			this.dataGrid1.DataContext = mvm;
    		}
    
    		// 接続および、メールヘッダの取得
    		private void actButton_Click(object sender, RoutedEventArgs e) {
    
    			mvm.mail_data.Clear();
    
    			BasicImapLogon logon = new BasicImapLogon(this.userName.Text, this.password.Password );
    			client = new ImapClient(logon, "imap.gmail.com", 993);
    			client.AuthenticationProtocol = AuthenticationProtocols.SSL;
    
    			if (!client.Connect()) {
    				return;
    			}
    
    			// メールデータ一覧を格納するオブジェクト
    			IMailData[] md = client.GetMailList();
    
    			// データがありません
    			if (md == null) {
    				return;
    			}
    
    			// メールデータの数
    			mailCount.Text = md.Length.ToString();
    
    			// 読込み制限
    			int maxCount = 20;
    			int idx = 0;
    
    			// 接続解除用
    			endCounter = 0;
    
    			// 非同期で全て表示
    			foreach( var data in md ) {
    
    				idx++;
    				if (idx > maxCount) {
    					break;
    				}
    
    				// 個別にイベント登録
    				data.BodyLoaded += new EventHandler(MailData_BodyLoaded);
    				// 非同期処理開始
    				data.ReadBodyAnsync();
    
    			}
    
    		}
    
    		private void MailData_BodyLoaded(object sender, EventArgs e) {
    
    			IMailData MailData = (IMailData)sender;
    
    			// 本文無し( 本文が必要な場合は、false で、reader.MainText )
    			MailReader reader = new MailReader(MailData.DataStream, true);
    
    			//Console.WriteLine(reader.MainText);
    
    			// UI スレッドへの処理( この場合、post_state は null )
    			sc.Post((object post_state) => {
    
    				string from = "";
    				string subject = "";
    				string mdate = "";
    				// ヘッダの一覧より、目的のヘッダを探す
    				foreach (TKMP.Reader.Header.HeaderString headerdata in reader.HeaderCollection) {
    
    					if (headerdata.Name == "From") {
    						from = headerdata.Data;
    					}
    					if (headerdata.Name == "Subject") {
    						subject = headerdata.Data;
    					}
    					if (headerdata.Name == "Date") {
    						mdate = headerdata.Data;
    					}
    
    				}
    
    				// 行追加
    				mvm.mail_data.Add(new ItemViewModel() {
    					from = from,
    					subject = subject,
    					mdate = mdate
    				});
    
    			}, null);
    
    			// イベント削除
    			MailData.BodyLoaded -= new EventHandler(MailData_BodyLoaded);
    
    			// 接続解除用
    			endCounter++;
    			if (endCounter == 20) {
    				client.Close();
    			}
    		}
    
    		// UI スレッドへの処理用
    		private void Window_Loaded(object sender, RoutedEventArgs e) {
    			sc = SynchronizationContext.Current;
    		}
    
    		// ダブルクリック
    		private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
    			Debug.WriteLine(dataGrid1.SelectedIndex);
    
    		}
    
    
    	}
    }
    
    
    非同期でのサーバーとの通信処理はすべてキューとして扱われるため、 前の処理が終了する前に次の要求を発行すると、要求順に順次処理が行われます
    
    関連する記事 WPF(C#) : 『DataGrid に、バインド用クラスを使って自動的にカラムと行を生成する』 テンプレート
    posted by lightbox at 2013-10-27 23:08 | VS(C#) | このブログの読者になる | 更新情報をチェックする

    WPF(C#) : 『DataGrid に、バインド用クラスを使って自動的にカラムと行を生成する』 テンプレート

    SkyDrive へ移動
    
    
    
    ※ Window の背景にイラスト画像を使用しています
    
    DataGrid の重要なプロパティ
    
    ItemsSource="{Binding mail_data}"
    AutoGenerateColumns="True"
    CanUserAddRows="false"
    
    MainWindow.xaml
    <Window x:Class="WPF_MailGet.MainWindow"
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    	mc:Ignorable="d"
    	Title="MainWindow"
    	Height="719"
    	Width="805"
    	BorderBrush="Black"
    	BorderThickness="1">
    	<Window.Background>
    		<ImageBrush
    			ImageSource="/WPF_MailGet;component/Images/back_001.jpg"
    			Stretch="UniformToFill"
    			TileMode="None" />
    	</Window.Background>
    	<!-- このウインドウのリソース -->
    	<Window.Resources>
    
    		<Style
    			TargetType="{x:Type ListView}">
    			<Setter
    				Property="ItemContainerStyle">
    				<Setter.Value>
    					<Style
    						TargetType="ListViewItem">
    						<Setter
    							Property="VerticalContentAlignment"
    							Value="Top" />
    					</Style>
    				</Setter.Value>
    			</Setter>
    		</Style>
    		
    		<!-- 一覧データ 用の表示部品定義 -->
    		<DataTemplate
    			x:Key="ListFromTemplate">
    
    			<StackPanel
    				HorizontalAlignment="Left"
    				Width="60">
    				<TextBlock
    					Text="{Binding from}"
    					TextWrapping="Wrap"
    					Padding="4" />
    			</StackPanel>
    
    		</DataTemplate>
    		
    		<DataTemplate
    			x:Key="ListSubjectTemplate">
    			
    			<StackPanel
    				Margin="0,0,0,17"
    				Width="250">
    				<Border
    					BorderThickness="1"
    					BorderBrush="Black"
    					Padding="4"
    					Height="50">
    				<TextBlock
    					Text="{Binding subject}"
    					TextWrapping="Wrap" />
    				</Border>
    			</StackPanel>
    
    		</DataTemplate>
    	</Window.Resources>
    	
    	<Grid
    		AllowDrop="True">
    		<Grid.RowDefinitions>
    			<RowDefinition
    				Height="70*" />
    			<RowDefinition
    				Height="608*" />
    		</Grid.RowDefinitions>
    		
    		<!--実行ボタン-->
    		<Button
    			Name="actButton"
    			Content="データ表示"
    			Height="35"
    			HorizontalAlignment="Left"
    			Margin="40,26,0,0"
    			VerticalAlignment="Top"
    			Width="154"
    			Click="actButton_Click" />
    
    		<!--一覧表示-->
    		<DataGrid
    			Grid.Row="1"
    			Height="534"
    			HorizontalAlignment="Left"
    			Margin="40,0,0,0"
    			Name="dataGrid1"
    			VerticalAlignment="Top"
    			Width="700"
    			Background="#C5FFFFFF"
    			MouseDoubleClick="dataGrid1_MouseDoubleClick"
    			ItemsSource="{Binding mail_data}"
    			AutoGenerateColumns="True"
    			CanUserAddRows="false"
    			IsReadOnly="True">
    			<!--<DataGrid.Columns>
    				<DataGridTemplateColumn
    					Header="差出人"
    					CellTemplate="{StaticResource ListFromTemplate}">
    				</DataGridTemplateColumn>
    				<DataGridTemplateColumn
    					Header="件名"
    					CellTemplate="{StaticResource ListSubjectTemplate}">
    				</DataGridTemplateColumn>
    			</DataGrid.Columns>-->
    		</DataGrid>
    		
    	</Grid>
    </Window>
    
    
    コメント部分は、カラムをテンプレートで作成してカスタマイズする場合に使用します。
    
    MainWindow.xaml.cs
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Diagnostics;
    using System.Net;
    using System.Windows;
    using System.Windows.Input;
    using System.Collections.ObjectModel;
    
    namespace WPF_MailGet {
    	public partial class MainWindow : Window {
    
    		private MainViewModel mvm = new MainViewModel();
    		// *********************************************
    		// コンストラクタ
    		// *********************************************
    		public MainWindow() {
    			InitializeComponent();
    
    			this.dataGrid1.DataContext = mvm;
    		}
    
    		private void actButton_Click(object sender, RoutedEventArgs e) {
    
    			mvm.mail_data.Add(new ItemViewModel() {
    				from = "Button@event.DataGrid.wpf",
    				subject = "DataGrid は自動カラム作成が有効です",
    				mdate = "2013/10/26 19:00:30",
    			});
    		}
    
    		private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
    			Debug.WriteLine(dataGrid1.SelectedIndex);
    
    			mvm.mail_data.Add(new ItemViewModel() {
    				from = "DoubleClick@event.DataGrid.wpf",
    				subject = "CanUserAddRowsは、\n意図的に false にする必要があります",
    				mdate = "2013/10/26 19:00:30",
    			});
    
    			mvm.mail_data[0].mdate = "0000/00/00";
    
    		}
    
    	}
    }
    
    
    
    MainViewModel.cs
    
    using System;
    using System.ComponentModel;
    using System.Collections.ObjectModel;
    
    namespace WPF_MailGet {
    
    	// *********************************************
    	// バインドする一覧データのを定義するクラス
    	// *********************************************
    	public class MainViewModel : MainBaseModel {
    		// *****************************************************
    		// コンストラクタ
    		// *****************************************************
    		public MainViewModel() {
    			mail_data = new ObservableCollection<ItemViewModel>();
    		}
    
    		// *****************************************************
    		// バインド用のコレクションのプロパティ
    		// *****************************************************
    		public ObservableCollection<ItemViewModel> mail_data { get; set; }
    
    	}
    }
    
    
    ItemViewModel.cs
    
    using System;
    using System.ComponentModel;
    
    namespace WPF_MailGet {
    	// *********************************************
    	// バインドする一覧データの構造を定義するクラス
    	// *********************************************
    	public class ItemViewModel : ItemBaseModel {
    
    		// *********************************************
    		// from エントリ
    		// *********************************************
    		private string _from;
    		public string from {
    			get { return _from; }
    			set {
    				SetAndNotifyString(GetName(() => from), ref _from, value);
    			}
    		}
    
    		// *********************************************
    		// subject エントリ
    		// *********************************************
    		private string _subject;
    		public string subject {
    			get { return _subject; }
    			set {
    				SetAndNotifyString(GetName(() => subject), ref _subject, value);
    			}
    		}
    
    		// *********************************************
    		// mdate エントリ
    		// *********************************************
    		private string _mdate;
    		public string mdate {
    			get { return _mdate; }
    			set {
    				SetAndNotifyString(GetName(() => mdate), ref _mdate, value);
    			}
    		}
    
    	}
    }
    
    
    
    
    
    posted by lightbox at 2013-10-27 00:47 | VS(C#) | このブログの読者になる | 更新情報をチェックする

    2013年10月26日


    Seesaa ブログの『保存ボタンが表示されない』

    どうも、Google Chrome でたまーーに起こるようなのですが、キャッシュの削除で復帰されました。
    
    いずれにしても、ブラウザの不可思議なトラブルは『キャッシュの削除』が望ましいです。Google Chrome も、Firefox も、IE も、『CTRL+SHIFT+DEL』でショートカットで削除画面が表示されます。
    
    ところで、最近 Google Chrome ではキャッシュの実装がいろいろ変化があるような気がします。開発者ツールを表示している時だけ強制的にキャッシュを使用しない、というオプションがあり、実際それをしないと WEB アプリが不思議な動作をする場合があります。
    
    どうしても、キャッシュを削除したく無い場合は、そちらを使うといいかもしれません。
    
    
    
    
    
    タグ:トラブル
    posted by lightbox at 2013-10-26 17:48 | WEBブラウザ | このブログの読者になる | 更新情報をチェックする

    VS2012ストア(C#) : WebView テンプレート

    きちんとした、WebView の利用は Windows 8.1 + VS2013 で行ったほうがよさそうですが、API を使用したWEB アプリ関連のログイン処理はこれを使うしかありません。ほとんどたいした事はできませんが、テンプレートを作ってみました。
    
    Windows ストア用に作ったイラストを 5 枚同梱しています。以下はそのうちの一つを使ったものです
    
    
    
    
    
    イベントは、LoadCompleted で Navigate 後の処理を行う事ができます。
    
    ページ内で JavaScript を実行するには、以下のようにすれば大抵は実行可能のようです。
    
    this.webView.InvokeScript("eval", new[] { "history.back()" });
    
    
    
    
    
    posted by lightbox at 2013-10-26 00:22 | Win8 ストアアプリ | このブログの読者になる | 更新情報をチェックする

    2013年10月25日


    jQuery の Chosen プラグイン( 複数選択コンボボックス ) の使い方

    Chosen
    
    選択すると、ボタンが追加されて複数選択を右手のマウスだけで行う事ができます。
    必要なファイルは、js と css と chosen-sprite.png の3つのファイルだけです。
    


    <script>
    if ( !window.jQuery ) {
    	document.write("<"+"script src=\"//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js\"></"+"script>");
    }
    if ( window[window.location.hostname+'.loadChosen'] !== true ) {
    	window[window.location.hostname+'.loadChosen'] = true;
    	document.write("<"+"link rel=\"stylesheet\" href=\"http://winofsql.jp/jquery/plugins/chosen/chosen.css\">");
    	document.write("<"+"script src=\"http://winofsql.jp/jquery/plugins/chosen/chosen.jquery.min.js\"></"+"script>");
    }
    </script>
    <script type="text/javascript">
    $(function() {
    	// セレクタ
    	$(".chosen")
    		// プラグイン
    		.chosen({
    			width: "550px",
    			max_selected_options: 3
    		})
    		// 変更時のイベント
    		.change(function(evt, params){
    			console.log(evt.type);
    			if ( params.selected ) {
    				console.log(params.selected+" が選択されました");
    			}
    			if ( params.deselected ) {
    				console.log(params.deselected+" が選択解除されました");
    			}
    		})
    		// リストが開いた時のイベント
    		.on('chosen:showing_dropdown', function(evt, params) {
    			console.log(evt.type);
    			console.log(params);
    		})
    		// リストが閉じた時のイベント
    		.on('chosen:hiding_dropdown', function(evt, params) {
    			console.log(evt.type);
    			console.log(params);
    		})
    		// 最大値以上を選択した時に発生するイベント( リストは開かない )
    		.on('chosen:maxselected', function(evt, params) {
    			console.log("---------------");
    		})
    		;
    	}
    );
    
    
    </script>
    
    <form>
    <input type="submit" value="送信"><br>
    <select name="sel_01[]" data-placeholder="あなたの好きな色を選択して下さい" multiple class="chosen">
    	<option value="0"></option>
    	<option value="1">赤</option>
    	<option value="2">緑</option>
    	<option value="3">青</option>
    	<option value="4">紫</option>
    	<option value="5">ピンク</option>
    	<option value="6">オレンジ</option>
    	<option value="7">黄色</option>
    	<option value="8">茶色</option>
    </select>
    <br><br>
    <select name="sel_02" data-placeholder="あなたの好きな色を選択して下さい"class="chosen">
    	<option value="0"></option>
    	<option value="1">赤</option>
    	<option value="2">緑</option>
    	<option value="3">青</option>
    	<option value="4">紫</option>
    	<option value="5">ピンク</option>
    	<option value="6">オレンジ</option>
    	<option value="7">黄色</option>
    	<option value="8">茶色</option>
    </select>
    </form>
    
    
    
    
    
    posted by lightbox at 2013-10-25 02:21 | プラグイン:jQuery | このブログの読者になる | 更新情報をチェックする
    Seesaa の各ページの表示について
    Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。
    
    Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。
    
    また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。
    
    ※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです
    
    対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。
    
    
    ※ エキスパートモードで表示しています
    
    アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります
    
    
    <% if:page_name eq 'archive' -%>
    アーカイブページでのみ表示される内容
    <% /if %>
    
    <% if:page_name eq 'category' -%>
    カテゴリページでのみ表示される内容
    <% /if %>
    
    <% if:page_name eq 'tag' -%>
    タグページでのみ表示される内容
    <% /if %>
    
    この記述は、以下の場所で使用します


    Windows
    container 終わり

    フリーフォントで簡単ロゴ作成
    フリーフォントでボタン素材作成
    フリーフォントで吹き出し画像作成
    フリーフォントではんこ画像作成
    ほぼ自由に利用できるフリーフォント
    フリーフォントの書体見本とサンプル
    画像を大きく見る為のウインドウを開くボタンの作成

    Android SDK ポケットリファレンス
    改訂版 Webデザイナーのための jQuery入門
    今すぐ使えるかんたん ホームページ HTML&CSS入門
    CSS ドロップシャドウの参考デモ
    Google Hosted Libraries
    cdnjs
    BUTTONS (CSS でボタン)
    イラストAC
    ぱくたそ
    写真素材 足成
    フリーフォント一覧
    utf8 文字ツール
    右サイド 終わり
    base 終わり