SQLの窓

2013年11月08日


Microsoft Office で、『クリップアートを表示できません』と表示される場合の対処



Office の setup.exe を実行して、『クリップオーガナイザー』を追加インストールします。

※ 『マイコンピュータから実行』に設定します





セットアップが終了すると、以下のような表示がされますが、PC を再起動する必要はありません



posted by lightbox at 2013-11-08 19:00 | Microsoft Office | このブログの読者になる | 更新情報をチェックする

2013年11月04日


VS2010 WPF(C#) DataGrid + データベース バインド / DataGrid に MDB のデータを読み込んで表示するテンプレート

SkyDrive へ移動




解説ページ

DataGrid へデータベースの内容を表示する問い合わせのサンプルですが、XAML を利用する上でデータはバインドでコントロールに表示されます。その為、データベースのデータを扱う為のプライベートクラス( SELECT 文の列リストを格納するクラス )を作成して利用します。

DataGrid は、ある手順を踏むと、そのクラスから自動的に列を作成してくれる上に、バインドの Mode=OneWay のルールで、コレクションの内容を変更するだけでコントロールの表示を変更する事ができます。


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

2013年11月01日


WinJS ストア : 『背景画像をチェンジする2画面アプリ』のテンプレート

SkyDrive へ移動



( 自作のイラストを背景画像として使用しています )

製品になる前のサンプルコードから様変わりし、以前のままでは動作しなかったものを修正しました。以前から比べて、アプリバーのボタンの作成方法が変わり、画面定義にイベント記述ができないようになっていました。しかし、その他の大きな骨格は基本的に以前と変わっていませんでした。
default.js
(function () {
    "use strict";

    WinJS.Binding.optimizeBindingReferences = true;

    var app = WinJS.Application;
    var nav = WinJS.Navigation;
    var activation = Windows.ApplicationModel.Activation;

	// ************************************************
	// 開始処理
	// ************************************************
    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
        	if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {

        		nav.navigate("/HomePage.html");

            } else {
                // TODO: このアプリケーションは中断状態から再度アクティブ化されました。
                // ここでアプリケーションの状態を復元します。
            }
            args.setPromise(WinJS.UI.processAll());
        }
    };

	// ************************************************
	// Navigate された時の処理( 画面変更 )
	// ************************************************
    WinJS.Navigation.addEventListener("navigated", function (ev) {
    	Debug.writeln("navigated");
    	Debug.writeln(ev.detail.location);
		// 画面を切り替えるコンテンツエリア
    	var target = document.querySelector("#contentHost");
    	WinJS.Utilities.empty(target);
		// 画面の初期処理
    	WinJS.UI.Fragments.render(ev.detail.location, target).then(function () {

    		// ************************************************
    		// 戻るボタンがあった場合の処理
    		// ************************************************
    		var backButton = document.querySelector(".win-backbutton");
    		if (backButton) {
    			backButton.addEventListener('click', function () {
    				WinJS.Navigation.back();

    			}, false);
    			if (WinJS.Navigation.canGoBack) {
    				backButton.removeAttribute('disabled');
    			}
    			else {
    				backButton.setAttribute('disabled', 'true');
    			}
    		}

    		// ************************************************
    		// 画面が切り替わった時の処理
    		// ************************************************
    		if (ev.detail.location == "/HomePage.html") {
    			var body = document.getElementsByTagName("body")[0];
    			body.style.backgroundImage = "url(/images/back_001.jpg)";
    		}
    		if (ev.detail.location == "/NextPage.html") {
    			var body = document.getElementsByTagName("body")[0];
    			body.style.backgroundImage = "url(/images/back_002.jpg)";
    		}

    	});

    }, false);

	// ************************************************
	// イベント処理の登録
	// ************************************************
    var page = WinJS.UI.Pages.define("/default.html", {
    	ready: function (element, options) {
    		document.getElementById("home")
                .addEventListener("click", EVENT.navigateHome, false);
    		document.getElementById("play")
                .addEventListener("click", EVENT.navigateGame, false);
    		document.getElementById("rules")
				.addEventListener("click", EVENT.navigateRules, false);
    		document.getElementById("scores")
				.addEventListener("click", EVENT.navigateScores, false);
    		document.getElementById("credits")
				.addEventListener("click", EVENT.navigateCredits, false);
    	},
    });

	// ************************************************
	// 実際のイベント処理
	// ************************************************
    function navigateHome() {
    	Debug.writeln("メニュー");
    	document.getElementById("appbar").winControl.hide();
    	nav.navigate("/HomePage.html");
	}
    function navigateGame() {
    	Debug.writeln("ゲーム");
    	document.getElementById("appbar").winControl.hide();
    	nav.navigate("/NextPage.html");
    }
    function navigateRules() {
    	Debug.writeln("ルール");
    	document.getElementById("appbar").winControl.hide();
    }
    function navigateScores() {
    	Debug.writeln("スコア");
    	document.getElementById("appbar").winControl.hide();
    }
    function navigateCredits() {
    	Debug.writeln("クレジット");
    	document.getElementById("appbar").winControl.hide();
    }

    app.oncheckpoint = function (args) {
    };

    app.start();

	// ************************************************
	// 各ページから参照可能な名前空間の定義
	// ************************************************
    WinJS.Namespace.define("EVENT", {
    	navigateHome: navigateHome,
    	navigateGame: navigateGame,
    	navigateRules: navigateRules,
    	navigateScores: navigateScores,
    	navigateCredits: navigateCredits
    });


})();



default.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>JSBasic</title>

    <!-- WinJS 参照 -->
    <link href="//Microsoft.WinJS.1.0/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.1.0/js/base.js"></script>
    <script src="//Microsoft.WinJS.1.0/js/ui.js"></script>

    <!-- JSBasic 参照 -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>

</head>
<body>
	<!-- 画面切り替え用エリア -->
    <div id="contentHost"></div>

	<!-- アプリケーションバー -->
    <div
        id="appbar"
        data-win-control="WinJS.UI.AppBar"
        aria-label="Command Bar">

        <button 
            data-win-control="WinJS.UI.AppBarCommand" 
            data-win-options="{id:'home', label:'メニュー', icon:'&#xE10F;', section: 'global'}">
        </button>

        <button 
            data-win-control="WinJS.UI.AppBarCommand" 
            data-win-options="{id:'play', label:'ゲーム', icon:'&#xE102;', section: 'global'}">
        </button>

        <button 
            data-win-control="WinJS.UI.AppBarCommand" 
            data-win-options="{id:'rules', label:'ルール', icon:'&#xE104;', section: 'global'}">
        </button>

        <button 
            data-win-control="WinJS.UI.AppBarCommand" 
            data-win-options="{id:'scores', label:'スコア', icon:'&#xE113;', section: 'global'}">
        </button>

        <button 
            data-win-control="WinJS.UI.AppBarCommand" 
            data-win-options="{id:'credits', label:'クレジット', icon:'&#xE10C;', section: 'global'}">
        </button>

    </div>
</body>
</html>

第二画面にコンテンツは無く、背景画像のみ変更するようにしています。



※ アプリバーは動作します


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

VS2012 WPF(C#) : 『TKMP.DLL を使用したイベントによる非同期メール受信処理を Task(await) を使用して順次処理のように記述する』テンプレート

SkyDrive へ移動


Framework 4.5 では、Task<TResult> クラスによって非同期処理の結果を取得してあたかも同期処理のような記述を行う事ができるようになりましたが、既存の非同期処理をそのように書き換える為に、TaskCompletionSource<TResult> クラスを使用します。

単純に考えると、Task を戻り値とするメソッド内は全て管理されていて、その中で登録されたイベントは全て管理下に置かれるようです。イベントが終了するまで、メソッドが終わる事無く、TaskCompletionSource<TResult> クラスの TrySetResult( SetResult との違いは良く解りません )で、値をセットした時にメソッドが終了するように見えます。

こうする事によって、大きなメリットの一つとして、UI スレッドにふつうに戻って来て処理を行えるところであり、当然ループ内の一部として自然に行を追加しながら非同期を実現する事ができました



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;
using System.Threading.Tasks;

namespace WPF_DataGrid_MailGet1 {
	public partial class MainWindow : Window {

		private MainViewModel mvm = new MainViewModel();
		private ImapClient client = null;

		// *********************************************
		// コンストラクタ
		// *********************************************
		public MainWindow() {
			InitializeComponent();

			this.dataGrid1.DataContext = mvm;
		}

		// 接続および、メールヘッダの取得
		private async 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;

			// 非同期で全て表示
			foreach (var data in md) {

				idx++;
				if (idx > maxCount) {
					break;
				}

				// Framework 4.5 : 値を返す非同期処理
				MailReader reader = await ReadBodyAnsync( data );

				// UI スレッドに戻って来ているので、特殊な処理は必要無い
				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
				});

			}
			// ソース的には、順次処理なので全てのデータ処理後のクローズ
			client.Close();

		}

		// *********************************************
		// 戻り値を返す事のできる非同期処理 【開始】
		// *********************************************
		private TaskCompletionSource<MailReader> tcs = null;
		private Task<MailReader> ReadBodyAnsync(IMailData MailData) {

			// 戻り値用のクラス
			tcs = new TaskCompletionSource<MailReader>();

			// 個別にイベント登録
			MailData.BodyLoaded += new EventHandler(MailData_event);
			// 非同期処理開始
			MailData.ReadBodyAnsync();

			return tcs.Task;
		}

		// 本来のイベント処理
		private void MailData_event(object sender, EventArgs e) {

			IMailData MailData = (IMailData)sender;

			// イベント削除
			MailData.BodyLoaded -= new EventHandler(MailData_event);

			// 本文無し( 本文が必要な場合は、false で、reader.MainText )
			MailReader reader = new MailReader(MailData.DataStream, true);

			// ****************************
			// 戻り値用のクラスの戻り値をセット
			// ****************************
			tcs.TrySetResult(reader);

		}
		// *********************************************
		// 戻り値を返す事のできる非同期処理 【終了】
		// *********************************************


		// ダブルクリック
		private void dataGrid1_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
			Debug.WriteLine(dataGrid1.SelectedIndex);

		}


	}
}

参考ページ

c# - Best way to convert callback-based async method to awaitable task - Stack Overflow
c# - TaskCompletionSource : When to use SetResult() versus TrySetResult(), etc - Stack Overflow

関連するページ

▼ このページの処理の元となった、通常のイベント非同期処理
WPF(C#) : 『DataGrid に、TKMP.DLL を使用して非同期にメールヘッダを受信する』 テンプレート



posted by lightbox at 2013-11-01 20:29 | VS(C#) | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり



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

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり