普通にインストールすると、ユーザのドキュメント内に Visual Studio のユーザ部品がインストールされますが、例えば C# では、『C:\Users\ユーザ名\Documents\Visual Studio 201X\Templates\ProjectTemplates\Visual C#』内に自由にフォルダを作成してそこにテンプレートを保存すると以下のように反映されます![]()
2013年05月17日
Visual Studio のテンプレートフォルダの自由な作成
XAML コードを横に長く表示させずに、属性毎に縦に表示させる設定
『ツール』メニューのオププションからオプションダイアログを表示させて、『テキストエディター』から XAML を選択して、『書式設定』の『行間』まで入って、以下のように設定しますあと、『XAMLの全般』に『右端で折り返す』と、『書式設定の全般』に『指定の長さを超えたタグを折り返す』という設定があります
2013年05月10日
Win8 ストア : ファイルアクセス テンプレート
SkyDrive へ移動
ダウンロードしたテンプレートは、『C:\Users\ユーザー名\Documents\Visual Studio 2012\Templates\ProjectTemplates\Visual C#\Windows Store』に保存します。 Windows Store フォルダは最初は存在しないので作成します( 好きな名前のフォルダでも Visual Studio から利用できます )ソースコード表示 Win8 ストア : ストアブランク テンプレートを元にファイルアクセス部分を実装しています 仕様 ❶ Page.Resources で XAML 内で利用する文字列を定義 ❷ テキストエリアを設置( ファイルの処理の為、Package.appxmanifest にファイル利用設定 ) ❸ AppBar を XAML で定義 (ボタンを左側3つ、右側2つ定義) ❹ それぞれのボタンにイベントを定義。但し、左側のファイル用ボタンは動的に作成 ❺ 保存ボタンのイベントで、MessageDialog の利用サンプルを実装 ❻ MessageDialog のイベントを別のソースコードに定義( partial ) ❼ TextResource.cs に、StaticResource 用のクラスを定義 ❽ MessageDialog 処理用の MsgBox クラス テキストエリア テキストエリアは、実際には TextBox で、AcceptsReturn="True" にする事によって複数行の入力が可能になります また、ファイルのアクセスを想定して、Package.appxmanifest に『機能』と『宣言』の設定をしています ( ページのロードでは、『text.txt』というファイルの存在チェックのみ行っています )
![]()
ファイル作成ボタンと保存ボタンの初期状態 一番最初の状態ではファイルは作成されていないので左側の3つ目のボタンは『ファイル作成』となっています。
また、右側の『保存』ボタンは、使用不可となっています。
ファイル作成とファイルの削除 bExist は、MainPage で定義した private 変数で、Page の Loaded イベントで設定しています。それによって、追加するボタンを差し換えて、それぞれの状態に対してイベントを定義していますが、この処理の切り替えは Page そのもののリロードによって行われます。
// ****************************************************** // ファイルが存在するので、削除ボタンを作成して処理を登録する // ****************************************************** if (bExist) { // インスタンス作成 var btn = new Button(); // スタイル btn.Style = (Style)App.Current.Resources["DeleteAppBarButtonStyle"]; // テキスト表示 AutomationProperties.SetName(btn, "削除"); // 非同期ラムダ式 btn.Click += async (_sender, _e) => { MsgBox.ShowAsync(this, "OK", "ファイルを削除します"); try { StorageFile strageFile = await storageFolder.GetFileAsync("text.txt"); // ファイル削除 await strageFile.DeleteAsync(); // メニュー削除 LeftBar.Children.RemoveAt(2); } catch (Exception ex) { Debug.WriteLine(ex.Message); } // Navigate の引数作成 App.MyParam NavigateArgs = new App.MyParam() { title = "リロード", type = 1 }; // ページを再表示 (App.Current as App).rootFrame.Navigate(typeof(MainPage), NavigateArgs); }; LeftBar.Children.Add(btn); SaveButton.IsEnabled = true; } // ****************************************************** // ファイルが存在しない。 // 1) 作成ボタンを作成して処理を登録する // 2) 保存ボタンを選択できないようにする // ****************************************************** else { // インスタンス作成 var btn = new Button(); // スタイル btn.Style = (Style)App.Current.Resources["AddAppBarButtonStyle"]; // テキスト表示 AutomationProperties.SetName(btn, "ファイル作成"); // 非同期ラムダ式 btn.Click += async (_sender, _e) => { MsgBox.ShowAsync(this, "OK", "ファイルを作成します"); try { await storageFolder.CreateFileAsync("text.txt"); // メニュー削除 LeftBar.Children.RemoveAt(2); } catch (Exception ex) { Debug.WriteLine(ex.Message); } // Navigate の引数作成 App.MyParam NavigateArgs = new App.MyParam() { title = "リロード", type = 2 }; // ページを再表示 (App.Current as App).rootFrame.Navigate(typeof(MainPage), NavigateArgs); }; LeftBar.Children.Add(btn); SaveButton.IsEnabled = false; }
ページのリロード App.xaml.cs で、最初のページのロードが行われる際、以下のコードで表示する場所の骨格が作成されています。 public Frame rootFrame = Window.Current.Content as Frame; rootFrame は、Window( 現在のアプリケーションウインドウ ) の Current(現在アクティブなウィンドウ)の UI である Content を Frame(フレーム)として取得しています。これは、仕様だと思われるので詳細な説明は Microsoft のドキュメントからは読み取りませんが、ブラウザと同様であると考えると良いと思います。 実際は、この rootFrame に、new Frame() でインスタンスを作成した上で利用されます。 つまり、アプリケーションの表示部分であるフレームに、実体であるページを XML ベースでロードするという手順になります。しかし、最初のロードで ページのインスタンスを作成する為に、Navigate メソッドが使用されています。 これは、この考え方でリロードすると、Navigate メソッドを実行する毎にページが新たに作成される事を意味します。 実際には、GoBack メソッドでも新たにインスタンスが作成されるようなので、画面の状態を保持して画面を切り替えるには、rootFrame.Content に保存しておいたページのインスタンスを戻すという処理が必要になります。( ここでは新しいインスタンスが都合が良いのでその方法は使っていません ) ファイルシステムへのアクセス Windows の Shell のような感じで、フォルダオブジェクトを取得してそこからファイルオブジェクトを作成して、作成・削除・複製等の基本的な処理を行います。 ファイルの中身の更新は、FileIO という static なクラスの static なメソッドを使って、その引数としてファイルオブジェクトを使用します。 await FileIO.WriteTextAsync(strageFile, this.TextData.Text); テキスト用のメソッドは、UTF-8N 前提の処理です。他のキャラクタセットとしてアクセスするには、バイナリデータとしてアクセスする必要があります。 Microsoft のサンプル 関連する情報 XAML コードを横に長く表示させずに、属性毎に縦に表示させる設定
タグ:Windows8
Win8 ストア : ストアブランク テンプレート
SkyDrive へ移動
ダウンロードしたテンプレートは、『C:\Users\ユーザー名\Documents\Visual Studio 2012\Templates\ProjectTemplates\Visual C#\Windows Store』に保存します。 Windows Store フォルダは最初は存在しないので作成します( 好きな名前のフォルダでも Visual Studio から利用できます )ソースコード表示 仕様 ❶ Page.Resources で XAML 内で利用する文字列を定義 ❷ テキストエリアを設置( ファイルの処理を想定しているので Package.appxmanifest に設定済 ) ❸ AppBar を XAML で定義 (ボタンを左側2つ、右側2つ定義) ❹ それぞれのボタンにイベントを定義 ❺ 保存ボタンのイベントで、MessageDialog の利用サンプルを実装 ❻ MessageDialog のイベントを別のソースコードに定義( partial ) ❼ TextResource.cs に、StaticResource 用のクラスを定義 ❽ MessageDialog 処理用の MsgBox クラス プロジェクト用固定文字列の定義部分
<Page.Resources> <local:TextResource x:Key="GlobalText" PageTitle="ストアブランク テンプレート" AppName="lightbox サンプルアプリケーション" /> </Page.Resources>
プロジェクト用固定文字列の参照部分
<TextBlock DataContext="{StaticResource GlobalText}" HorizontalAlignment="Left" Height="61" Margin="76,60,0,0" TextWrapping="Wrap" Text="{Binding PageTitle}" VerticalAlignment="Top" Width="1090" FontSize="40" FontWeight="Bold" FontFamily="Meiryo" > </TextBlock>
次のテンプレートでファイルアクセスをするので、テキストエリアを設置しています。
<TextBox x:Name="TextData" HorizontalAlignment="Left" Height="209" Margin="36,37,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="580" AcceptsReturn="True"/>
テキストエリアは、実際には TextBox で、AcceptsReturn="True" にする事によって複数行の入力が可能になります また、ファイルのアクセスを想定して、Package.appxmanifest に『機能』と『宣言』の設定をしています ( ページのロードでは、『text.txt』というファイルの存在チェックのみ行っています )![]()
Page.Resources の参照 XAML 内での参照は、『AppBar テンプレート / Win8 ストアアプリ(C#)』 では、一括で定義して参照していましたが、実際には DataContext に設定して、Binding のみで参照します。DataContext も、自分自身のものである必要は無く、親要素でも構わないので効率的に良い方法を選びます。 ソースコードから参照するには、少しやっかいですがそのような処理は専用クラス内で行えば良いと思います。ここでは、MsgBox クラスで、タイトルに使用するのに参照しています。この参照方法は、Framework のバージョンによって違っており、4.5 から Where メソッドが使用できます
// Page.Resources から TextResource を取得 var NameSpace = pg.GetType().Namespace; var trs = pg.Resources.Values.Where(Value => Value.ToString() == NameSpace + ".TextResource"); TextResource tr = (TextResource)trs.First(); var Title = tr.PageTitle; var AppName = tr.AppName; var messageDialog = new MessageDialog(message, Title + " (" + AppName + ")");
MsgBox クラス MsgBox の処理は結構煩雑なので、応答用と確認用を固定で、static メソッドとして定義しています。 ❶ public static async void ShowAsync(MainPage pg, string ok, string cancel, string message, UICommandInvokedHandler handler) OK か Cancel のメッセージボックスを開いて、指定したメッセージを表示して、指定したイベントを応答に使用する。 仕様コードMsgBox.ShowAsync( this, "OK", "Cancel", "データを保存しますか?", this.CommandInvokedHandler );❷ public static async void ShowAsync(MainPage pg, string ok, string message) イベントは使用せずにメッセージボックスのみが開く。 OnNavigatedTo で取得するパラメータ用構造体 ページを表示する時に、Frame クラスの Navigate(typeof(MainPage), 引き渡すオブジェクト) という形で呼び出します。この呼び出しは、MainPage のインスタンスが新しく作成される方法なので、最初以外は望ましくありませんが、他のページを呼び出したい時の引数として使ってコードがわかりやすくなるかもしれません。 その為のテンプレートとして、App.xaml.cs に定義して初回に使用して呼び出しています 受け取るのは、MainPage 側の OnNavigateTo イベント(Page の protected イベント)です
// ************************************************* // このページがフレームに表示されるときに呼び出されます。 // ************************************************* protected override void OnNavigatedTo(NavigationEventArgs e) { Debug.WriteLine("ページがフレームに表示されました"); // Navigate が実行された時のパラメータを表示しています var mp = (App.MyParam)e.Parameter; Debug.WriteLine("Title : " + mp.title); Debug.WriteLine("Type : " + mp.type); }
関連する情報 XAML コードを横に長く表示させずに、属性毎に縦に表示させる設定
タグ:Windows8
SQLExpress 2005( および 2008 ) の接続設定
Microsoft の Visual Studio をインストールすると拒否しないかぎり、SQLExpress がインストールされますが、この DB は本来とても使いやすく優秀な DB なのに、一般の DB として使えないような設定でインストールされています。 これを使えるように設定するには、かなり煩雑な処理を行う必要があり、過去まとめておいたものを今回 Windows7 で設定したのでさらにわかり易く更新しました。 SQLExpress 2005( および 2008 ) の接続設定とにかく、素人では設定に失敗するように意図されていると思えるほど妙なトラップがたくさんあります。経験者なら15分ほどで使えるようにできますが、未経験者では小さなところで失敗するので本文を良く読んで正しく設定して下さい。 SQLExpress は、フリーですが、そもそも製品版との差は容量が数G しか使えなかったくらいだと記憶しています。ですから、たいていの処理で問題無く使えます。( 後、管理用ツールが無いので全て自分で運用する必要があるだけです ) 注意事項
DB の管理を真剣にするならば、別途ユーザを作るのですが、ここでは sa という最上位ユーザを使えるようにして運用する事を想定しています また、sa を使えるようにできる Windows ユーザは、デフォルトではインストールしたユーザのみです
2013年05月05日
PHP : 改行とタブと余り(%) でカレンダーを作成( 最終日は mktime で取得 )
![]()
入力した月によって、カレンダーを作成するという単純なものですが、初心者向けに、文字列はシングルクォートとドットで組み立てて、タブや改行のみダブルクォートを使用しています。 完全に画面と処理を分離していませんが、PHP に不慣れである事を想定して、HTML上部 > PHP の print > HTML の下部( + デバッグ出力 ) といった構成です。 月の最終日に関しては、マニュアルのサンプルコード部分に記述があります。 実際は、配列をカレンダーに埋め込んで、その配列にセットする条件を作るほうが簡単ですが、それだと動きが無いので初心者向けではありません。このほうが、PHP の特色をいろいろ感じながらできると思います。 最初から完成コードを見せずに、『どこで改行を入れるべきか』を考えてから作って行くのが良いと思います。( 画像内の表はヒントです )
<?php // HTML 側の meta 要素に依存せずにキャラクタセットを決定しています header( "Content-Type: text/html; Charset=utf-8" ); // 未入力は1月とする if ( trim( $_GET['mon'] ) == '' ) { $_GET['mon'] = 1; } // HTML(画面) の主要部分を読み込んでいます require_once("html_head.php"); print '<h1>' . $_GET['mon'] . '月の最終日は ' . last_date( $_GET['mon'] ) . ' 日です</h1>' . "\n"; // HTML 上で改行コードやタブを利用する為に PRE 要素を使用しています print "<pre>"; $week = date('w', mktime(0, 0, 0, $_GET['mon'], 1, 2013)); print '曜日は (' . $week . ') です' . "\n"; print 'date 関数が返すのは文字列なので、$week には文字列が入ります' . "\n"; print '<hr>'; // $week の内容ぶんタブを出力する for( $i = 0; $i < ($week+0); $i++ ) { print "\t"; } for( $i = 0; $i < 31; $i++ ) { print "\t" . ($i+1); if ( $week + ($i % 7) == 6 ) { print "\n"; } if ( ($i+1) == last_date( $_GET['mon'] ) ) { break; } } print "\n\n"; print "</pre>"; // HTML(画面) の最終部分と、php のデバッグ(予備)部分を読み込んでいます require_once("html_footer.php"); // 2013年の指定月の最終日を求める function last_date( $mon ) { $lastday = mktime(0, 0, 0, $mon+1, 0, 2013); $dd = date( 'j', $lastday ); return ($dd+0); } ?>
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。 Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。 また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。 ※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです 対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。※ エキスパートモードで表示しています アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります
<% if:page_name eq 'archive' -%> アーカイブページでのみ表示される内容 <% /if %> <% if:page_name eq 'category' -%> カテゴリページでのみ表示される内容 <% /if %> <% if:page_name eq 'tag' -%> タグページでのみ表示される内容 <% /if %>この記述は、以下の場所で使用します![]()
|