ListPage

2010年5月28日金曜日

WPF とこきそ3

wpf とこきそ3


以前のとこきそ1でレイアウトライブラリを使用した将棋盤やらオセロ盤をやろうかなって
思ってたらやっぱりやってる方が多数いる模様なので自分も試してみた

縦9*横9の盤を作成

使用するレイアウトライブラリはあえて <Grid></Grid>

前回縦割りと横割りの子ノードの追加方法は

<Grid.ColumnDefinitions>
	%lt;ColumnDefinition Width="*"/>
	<RowDefinition Height = "*"/>
</Grid.ColumnDefinitions>

これを9こ・・。


<Grid.ColumnDefinitions>
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
            <columndefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
            <rowdefinition Height="*" />
</Grid.RowDefinitions>

なんか良い方法ないかって位見づらい。
マァイイヤ。ワカレバ。で、これで升目を9個ずつ縦横そろえたわけで次は
枡目の線だなー。ShowGridLines="True" で枠線の表示はできる。表示は

borderColorとかないの?msdnをつらつらみたけどない。
http://msdn.microsoft.com/ja-jp/library/system.windows.controls.grid_members.aspx

ネット上ではボーダーコントロールなるものを使用してるので前に習え。



名前空間 System.Windows.Controls

アセンブリ PresentationFramework (PresentationFramework.dll 内)

XMLNS http://schemas.microsoft.com/winfx/2006/xaml/presentation,

http://schemas.microsoft.com/netfx/2007/xaml/presentation


<Border Background="LightBlue" 
        BorderBrush="Black" 
        BorderThickness="2" 
        CornerRadius="45" 
        Padding="25">

まさか!1個ずつ子要素囲むの?
で、ColumnDefinition囲むとエラーでるし意味わからん。
アタッチかと思い


	
<Border Grid.Row="0" Grid.Column="0" BorderThickness="2" BorderBrush="Black"></Border>

こうしたら画面の左端がぽつんと黒くなった・・。


アタッチについて


自分自身のクラス中のプロパティではなく、 親要素で定義されたプロパティ値を設定することを添付プロパティと呼びます。
添付プロパティは(通常のプロパティは使えず、)依存プロパティでなければいけません。
(というか、通常のプロパティではこのような仕組みは実現できません。)
「依存プロパティ」という名前は、添付プロパティの例のように
「他のクラスとの依存関係を持つことができるプロパティ」というような意味合いです。

http://ufcpp.net/study/dotnet/wpf_xamladv.html#attached

現状だと81個手動でどげんかせんといかん!からちょっと考え・・。

よし。線はやめようってことでBorderコントロールは消去。

歩兵を設置。絵心0なのでPolygonで無理やり作りまして。

<Polygon Grid.Row="6" Grid.Column="0" Points="21,3 11,6 8,38 34,38 31,6 " Fill="#8B4513" />

駒を動かす事なんて度外視なのでさらにこの上から文字を描写
とりあえず出来りゃー良い系でがんがんいきます。

<TextBlock Grid.Row="6" Grid.Column="0" TextAlignment="Center" VerticalAlignment="Center" FontSize="15">
歩
</TextBlock>

縦書きが・・できん。香車と飛車と桂馬と・・成りが。という事で難しい事は後から
やることとして1文字わかればいいや系です。(日本人にはわかればいいや系精神が足りないと思います。)
動かす事を度外視としましたが、あれです。一応視野の端っこにはいるおいてあるつもりなので
パスと文字の統合について調べましたところ。

http://msdn.microsoft.com/ja-jp/magazine/dd263097.aspx

ありましたが・・・。これ読んでも理解できなさそうだ・・。
読ませる気ねーだろ。

2010年5月24日月曜日

WPFとこきそ 2

WPFとこきそ 2


座標を指定してレイアウト


htmlやcssのように座標をして描写したい場合が殆どだから今回のレイアウトライブラリは必修科目

                                       
Canvasレイアウトライブラリ
.Top上の余白の設定
.Left左の余白の設定
.Bottom下の余白の設定
.Right右の余白の設定
記事中(http://msdn.microsoft.com/ja-jp/windows/cc811499.aspx)には載ってはいないが基点位置について 中心となる基点位置は現状では画面の左上となる。
        <Canvas>
            <Ellipse
                Fill="Black"
                Width="300"
                Height="300"
                Canvas.Top="50"
                Canvas.Left="50"
                />
            <Ellipse
                Fill="White"
                Width="240"
                Height="240"
                Canvas.Top="85"
                Canvas.Left="45"
             />
        </Canvas>
Canvas.Top="50"は上端を基準とした50の位置 Canvas.Left="50"は左端を基準として50の位置 なるほど、でも管理しやすくする為にはCanvasの位置を変えたいなと思ったけど Canvasには .Top .Left のアタッチするプロパティがにゃーだよ。 始めに考えたのは、子要素や孫要素が存在するCanvasをCanvasで包む事。 これなら
     <Canvas>
        <Canvas Canvas.Right="500">
Canvas内の要素をわざわざ変更しなくても中間にあるCanvasのオフセット位置を指定するだけで良いんだけど 果たして推奨されるコードなのかと思いネット検索を掛けてみた。 が、ちょっと参考資料が見当たらないので知ってる方がもーし見てたら教えて下さい。

とこきそ1~2のまとめ

WrapPanelやStackPanel等もTopやLeftにアタッチできるプロパティがない・・・。 現状の自分のやり方だと1画面内にStackPanelとWrapPanelが複数個整列されていない状態で 必要になった場合、<Canvas></Canvas>で囲みまくる形になる・・。 なんとなくだけど綺麗じゃないかな。でもとりあえずこのまま進んでわかった時点で切替すれば いっか。

2010年5月22日土曜日

WPF とこきそ

WPF とことんきそる

WPF とこきそ

参考url http://msdn.microsoft.com/ja-jp/windows/cc811507.aspx

勝手に孤独に始まりました。wpfとこきそもうクラス多すぎで見るきもしないリファレンスなんですが
ゆっくりとやってみます。

崩れないレイアウト

XAMLのレイアウト機能を記事に沿って独断と偏見にみちた読解をしていきます。
まず最初は基本の 幅 高さ 余白 縦揃え 横揃えの方法
記事中では Ellipse(楕円)を使用しています。のでこちらはRectangle(四角)でやってみます。

Rectangle 要素
Fill 塗りの色
Width 四角の幅
Height 四角の高さ
	<Rectangle Fill="Aqua" Width="200" Height="150" />

青四角!この辺は、.NETやJAVA知ってる人なら見ただけで理解できるし知らない人でも英語がわかれば
楽かなー。

次は、可変するウィンドウだとウィンドウの大きさに合わせたりする処理が必要になってくるんだけど
これがMargin要素を使用することでクリア。余白は、ウィンドウとRectangleとの間事らしい。

ちなみに 左 上 右 下 CSSと一緒。

	<Rectangle Fill="Aqua" Width="200" Height="150" Margin="20,20,20,20" />
Marginウィンドウとこの場合はRectangleの間の値

C#とかでやるんであればResizeingイベント等で処理しなくちゃいけなくてUIロジックが
汚くなったりしてたから依存関係という面でみたら格段に楽!

冒頭で書いた縦揃え 横揃えは、 HorizontalAlignment と VerticalAlignment要素を使用
自分はこの要素名がかっこよくてたまらん。Vertical・・Vertical!!巻き舌なら技名。


VerticalAlignment 垂直方向の位置指定


HorizontalAlignment 水平方向の位置指定


	<"Aqua" Width="200" Height="150" Margin="20,20,20,20"
                   VerticalAlignment="Center" HorizontalAlignment="Stretch" />

これでバーティコォーも覚えた。バーティコォ

うん。

で、今まで何も考えずに<Grid></Grid>で閉じられた中に書いてみたけどここで
やっと説明が。

Gridというのはレイアウトライブラリ。間違ってもバーティコォライブラリではない。

Grid というレイアウトライブラリがあります。HTML でいうとテーブルみたいなものです。
この Grid にはテーブルのように行や列を増やしたり幅を固定したり自動にしたりすることができます。
このコードでは左には固定の幅をもったメニュー、右にはウィンドウの大きさに合わせて大きさが変わるコンテンツというようなレイアウトを実現しています。

	<Grid>
	  <Grid.ColumnDefinitions>
	    <ColumnDefinition Width="150"/>
	    <ColumnDefinition Width="*"/>
	  </Grid.ColumnDefinitions>
	  <Rectangle
	     Fill="Blue" 
	     Margin="20,20,20,20" 
	     Grid.Column="0" 
	  />
	  <Rectangle
	     Fill="Red" 
	     Margin="20,20,20,20" 
	     Grid.Column="1" 
	  />
	</Grid>

簡単に言うと Grid というエリアを縦に区切り、左の列の幅は 200 で固定して
右の列の幅は自動的に変わるようになっています。
Grid を区切るには Grid.ColumnDefinitions という子ノードを追加し
孫ノードに ColumnDefinition というノードを追加することで実現できます。
ColumnDefinition の数を増やすことにより列を増やすことができます。

固定されている列と自動的に幅が変わる列の動きを分かりやすくする為に、左の列に青く塗った楕円形、右の列に赤く塗った楕円形を配置しています。

配置する列を指定するには配置したいノードの要素に Grid.Column を追加します。
Grid.Column の値は ColumnDefinition を記述した順番に 0、1、2...と指定します。

???<Grid.ColumnDefinitions></Grid.ColumnDefinitions>これで子ノードを追加して・・
<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>
この2つで要素のWidth値を決めるの?いきなりちょっぴり無理指数が上がる。

配置する列を指定するには配置したいノードの要素に Grid.Column を追加します
えーと、孫の財産を勝手に保管場所を決めるって事?か・・?な?ちゃうね!

Grid.ColumnDefinitionのRectangleのGrid.Cokumnで指定する

で、<ColumnDefinition Width="150"/>
<ColumnDefinition Width="*"/>

書いた順番にWidth値が150のColumnDefinitionが0番
Width値が"*"のColumnDefinitionが1番

なるへそ。

で、これを縦じゃなくて横区切りにするには

Column を Row に、Width を Height に変えるだけで実現できます

<ColumnDefinition Height="150"/>
<ColumnDefinition Height="*"/>

で孫ノードの要素の Grid.ColumnをGrid.Rowにしたらいいのか。

で記事が以外と展開が速い。あと独断と偏見に満ち満ちた意見なら縦割りはColumn.ヴァーティコゥ

順番に並べてくれるレイアウト StackPanel

	<StackPanel Orientation="Vertical">
	  <Ellipse 
	     Fill="Blue" 
	     Width="300" 
	     Height="50" 
	     HorizontalAlignment="Left" 
	  />
	  <Ellipse
	     Fill="Red" 
	     Width="300" 
	     Height="150" 
	  />
	  <Ellipse
	     Fill="Green" 
	     Width="300" 
	     Height="100" 
	     HorizontalAlignment="Right" 
	  />

Orientation="Vertical"って何・・。リクリエーションなら知ってる。
と思ってたら、これはVertical!縦並べか。で案の定横並べは、Orientation="Horizontal"
うーん、判りやすい。将棋の枡とかオセロの枡とかならすぐに描写できそうだ。

将棋の横枡っていくつだ・・。

ちなみにStackPanelだと並べまくってエリアからはみ出すと表示されないが例えば
ブラウザや画面が小さい時に香車が表示されなくなったり角枡に黒があるの?白があるの?
ってことになる。

それじゃーこまんね?ってことでMS様は用意しておりました。
レイアウトライブラリ WrapPanel


勝手に改行 WrapPanel

なんかの漫画に似たようなのあったな・・。
ちょっと単純なコードの羅列なのでコピペ

<WrapPanel Orientation="Horizontal"<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
  <Ellipse Width="50" Height="50" Fill="Red"/<
  <Ellipse Width="50" Height="50" Fill="Green"/<
  <Ellipse Width="50" Height="50" Fill="Blue"/<
</WrapPanel<	

例の如くOrientation="Horizontal これで横・縦で並べかえるわけか。
これなら香車が見えなくなることもないし、角枡に何が置かれているかわからなく
戦々恐々とオセロをやることもなくなる。ね。

2010年5月21日金曜日

表示と非表示

勝手に回答

イメージの表示と非表示

VisualBasicのメソッドを利用したプログラムで「消去」ボタンをクリックするとイメージが消え、「表示」ボタンをクリックするとイメージが表示されるようにするにはどんなプログラムを打てばよろしいのですか?

よくよくOOPで例えられるテレビの電源ってことで実モデルを参考にしてみる


使用する規程クラス
クラス名 名前空間
Form System.Windows.Form
PictureBox System.Windows.Forms
BitMap System.Drawing
Graphics System.Drawing

作成クラス
クラス名 名前空間
Form1 WindowsFormsApplication1
RemoteController WindowsFormsApplication1
IRemoteController WindowsFormsApplication1
TV WindowsFormsApplication1
ITV WindowsFormsApplication1
ChannelGuide WindowsFormsApplication1

とりあえず必要になりそうなクラスを6つ作成
ON OFFの簡単なプログラムだからリモコンの蓋とテレビのカバーも実モデルに
してみる


フォームクラス Form1.cs

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.button2.Click += new System.EventHandler(this.button2_Click);
        }
        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void button2_Click(object sender, EventArgs e)
        {

        }
    }

イベントの実装のみに留めておく


TVクラス TV.cs

public  class TV : ITV
    {
         private System.Windows.Forms.PictureBox Display;
         private System.Drawing.Image TempImage;

         public TV(System.Windows.Forms.PictureBox pict)
         {
             Display = pict;
         }

         public void ON()
         {
             if (TempImage != null)
             {
                 Display.Image = TempImage;
             }
             else
             {
                 Display.Image = null;
             }
             TvState = true;
         }

         public void OFF()
         {
             if (Display.Image != null)
             {
                 TempImage = Display.Image;
             }
             Display.Image = null;
             TvState = false;
         }

         public void OutPutToDisplay(System.Drawing.Image images)
         {
             Display.Image = images;
         }

         private bool _TvState = false ;
         public bool TvState
         {
             get { return _TvState; }
             set { _TvState = value; }
         }
    }

コンストラクタにPictureBoxを使用した、この際の考えとしてはForm上全てをテレビと見立てた場合
PictureBoxはディスプレイとして存在する事とします!


ITVインターフェイス ITV.cs

public interface ITV
    {
        void ON();
        void OFF();
        void OutPutToDisplay(System.Drawing.Image value);
        bool TvState { get; set; }
    } 

次にTVクラスのインターフェイスを作成します。実モデルに考えてみるとカバー。
若干実モデルと比べるとおかしいがあくまで参考なのでこれでいく。


RemoteControllerクラス RemoteController.cs

public class RemoteController :IRemoteController
    {
        private ITV _tv;
        public RemoteController(ITV tv)
        {
            _tv = tv;
        }
        public void RemoteON()
        {
            _tv.ON();
        }
        public void RemoteOFF()
        {
            _tv.OFF();
        }
        public void ChannelPush(int pushkey)
        {
            ChannelGuide cg = new ChannelGuide(pushkey);
            _tv.OutPutToDisplay(cg.SelectedChannel);
        }
    }

コンストラクタにTVクラス、基本的にはテレビとリモコンで1セット。

IRemoteControllerインターフェイス

public interface IRemoteController 
    {
        void RemoteON();
        void RemoteOFF();
        void ChannelPush(int value);
    }

実モデルを考えた場合、12個のボタンが必要になってくるがPC上でテンキーをリモコンの番号として
見立て場合、楽だった為。

ChannelGuideクラス ChannelGuide.cs

public class ChannelGuide
    {
        private int _SelectKey;
        private System.Drawing.Image _SeletedChannel;

        public ChannelGuide(int SelectKey)
        {
            _SelectKey = SelectKey;
            if (_SelectKey == 97)
            {
                SelectedChannel = oneChannel;
            }
            else if (_SelectKey == 98)
            {
                SelectedChannel = twoChannel;
            }
        }

        public System.Drawing.Image SelectedChannel
        {
            get{return _SeletedChannel;}
            set {_SeletedChannel = value ;}
        }

        private System.Drawing.Image _oneChannel = 
            System.Drawing.Image.FromFile
  (@"C:\Documents and Settings\***\My Documents\My Pictures\sample1.jpg");
        private System.Drawing.Image _twoChannel = 
            System.Drawing.Image.FromFile
  (@"C:\Documents and Settings\***\My Documents\My Pictures\sample2.jpg");
        
        private System.Drawing.Image oneChannel
        {
            get{ return _oneChannel;}
            set{_oneChannel = value;}
        }
        private System.Drawing.Image twoChannel
        {
            get{return _twoChannel;}
            set{_twoChannel = value;}
        }

このクラスは番組表クラスとしてあるフィールド毎に値を設置したいがめんどかったので2つにしてみた。
xmlやらなんやらで外部的に受け取りやすくしたり色々改善の余地もあったけどやめた。


フォームにイベントの中身を実装

private void button1_Click(object sender, EventArgs e)
        {
            if (tv != null)
            {
                tv.ON();
            }
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (tv != null)
            {
                tv.OFF();
            }
        }
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (tv.TvState != false)
            {
                RemoteController remocon = new RemoteController(tv);
                remocon.ChannelPush(e.KeyValue);
            }
        }

2010年5月20日木曜日

WPF and Silverlight 2

WPF and Silverlight 2


今回使用するWPFクラスライブラリとXAML


XAML WPFクラス
<Application>要素 System.Windows名前空間のApplicationクラス
<Window>要素 System.Windows名前空間のWindowクラス
<Button>要素 System.Windows.Controls名前空間のButtonクラス

ボタンの追加

前回のHelloWorldプログラムにボタンを追加

<Button Width="100" Height="50" >
 Click
 %lt;/Button>

<Window>の子要素は自動的にセンタリングされるらしい
なおかつ<Window>要素は1つの子要素しか持つことができない。


イベントハンドラの追加 *.xaml

GUIとロジックの依存関係を薄める為に、イベントやそれに関係するロジックは
C#やVBで記述する。

XAML側のメソッドの追加
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="HelloWorldWindow"
  Title="My First XAML"
  Width="320"
  Height="240"
>
  <Button Width="100" Height="50" Click="HelloWorldWindow_Click">
    Click Me!
  </Button>
</Window>

<Button>要素のClick属性にボタンがクリックされた時に呼び出されるメソッドの
名前を記述する。
XAMLによるウィンドウの記述から暗黙的に作成されるクラスの名前を指定するために、<Window>要素に
対して[x:Class属性]でクラス名を指定する。

x:Class属性のxとはなんぞや?
xはプリフィックスである。リファレンス・マニュアルなどもxを付ける決まりになっている。
例えば、要素名の[Windows]や[Button]その属性名の[Width]や[Height]の名前空間は
<Window>要素のxmlns属性で指定されている
http://schemas.microsoft.com/winfx/2006/xaml/presentation
これはWPF名前空間と呼ばれ、名前空間に属する要素や属性はWPFのクラス・ライブラリの項目と対応付けられる
この時、規定名前空間以外の異なる名前空間の要素や属性を記述するには、プリフィックスが必要になる。
前例としてxを出したが実際にはなんでも良い。

例えば、x:Class="HelloWorldWindow"とあったがこれを
xaml:Class="HelloWorldWindow"やxamlclass:Class~と記述しても動作上では問題がない。

コードビハインド・ファイルによるイベント・ハンドラ *.cs

win.xaml.cs
using System.Windows;

  public partial class HelloWorldWindow : Window {
   void HelloWorldWindow_Click(object sender, RoutedEventArgs e)
   {
    MessageBox.Show("クリック");
   }
  }
 
部分クラス partialキーワードを使えば、本来はHelloWorldWindowクラス内に存在しなければならない
HelloWorldWindow_Clickメソッドを外部から追加できる。

この外部から追加したメソッドは、<Button Width="100" Height="50" Click="HelloWorldWindow_Click">

プロジェクトファイルの修正 *.proj

プロジェクトファイル内の<ItemGroup>に<Compile Include="win.xaml.cs" />を追加する。
<ItemGroup>
    <ApplicationDefinition Include="app.xaml" />
    <Page Include="win.xaml" />
    <Compile Include="win.xaml.cs" />

これでコンパイルする。

WPF and Silverlight

WPF and Silverlight


UIフレームワークというスコープでみた場合の性質は同じ

Silverlightはランタイムのサイズを4MB台に抑えなければならなかった為
WPFに比べると機能が削られているという違いがある

http://www.atmarkit.co.jp/fdotnet/vblab/uiframework_01/uiframework_01_01.html

XAML構文ありきのWPF UIフレームワーク


この記事の中あたりに

WPF UIフレームワークを理解するうえでXAMLという言語そのもに対する知識はあまり重要でない。
と断言的に述べていた。


画面設計とロジックの分離

画面設計をXAMLで記述し、イベント処理やビジネスロジックなどはC#やVBのコードで記述
(このような形態を[コードビハインド]と呼ぶ)
XAMLでは、コントロールの配置や静的な画面設計ではなくグラフィックス描写やコントロールの合成、
アニメーション、UI要素とデータのデータバインディングといった動的な処理までも記述することができる
このおかげで、画面まわりの処理の多くをコードビハインド側のコードから排除でき、コードビハインド側の
コードではロジックに専念できる。


本当にXAMLの理解は重要ではない?

確かにExpression Blendなどのデザイナを使えば画面設計を行え、XAMLのコードを自動生成
する事ができます。XAMLの理解がないという事は、HTMLやCSSを知らずにWeb開発ができるの?
という事と同じ事である。

Hello XAML

全てテキストエディタでの作成

  • ウィンドウを定義した *.xamlファイル
  • アプリケーションを定義した *.xamlファイル

ウィンドウを定義した win.xaml

<Window
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 Title="My First XAML"
 Width="320"
 Height="240"
>
 Hello World
</Window> 

XAMLではウィンドウをWindow要素で記述する。Window /Windowタグで挟まれた内容が
ウィンドウに表示される。
Window要素の属性は上記のように設定できる

アプリケーションを定義した app.xaml

<Application
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 StartupUri="win.xaml"
/>

アプリケーションのビルド

このアプリケーションをビルドするには、ビルドツール(MSBuild.exe)を使って実行ファイルを
作成します。その為にはプロジェクトファイルを作成します。

プロジェクトファイル hello.proj

<Project
 xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
 DefaultTagets="Build">

 <PropertyGroup>
  <AssemblyName>HelloWorld</AssemblyName>
  <OutputType>winexe</OutputType>
  <OutputPath>c:\</OutputPath>
 </PropertyGroup>
 
 <ItemGroup>
  <ApplicationDefinition Include="app.xaml" />
  <Page Include="win.xaml" />
  
  <Reference Include="System" />
  <Reference Include="WindowsBase" />
  <Reference Include="PresentationCore" />
  <Reference Include="PresentationFramework" />
 </ItemGroup>
 
 <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
 <Import Project="$(MSBuildBinPath)\Microsoft.winFX.targets" />
</Project>

とまぁ呪文をたかたか打っていきいざコンパイル。
コマンドプロンプトを開き、先ほどの3つのファイルがある所まで移動する。
カレントディレクトリで、自分の場合は.NetFramework 3.5 だった為、
windows/microsoft.net/framework/v3.5/msbuild.exe を実行。

Hello World

MessageBox

Yahoo


勝手に回答。

「テキストボックスに日付を出すことができます」というのができません。

Messagabox.Show(#5/19/2010#)というのを入れるのですが、
そもそもそれを表示させる[MessageBox]なるものをどこで用意したら良いものやら…。

どこで用意したら良い?という回答なのだったけれど単純にSystem.Windows.Forms 名前空間を使用し、StaticなメソッドのMessagebox.showを実行すればよいのだけれども。どこがわからなかったのか・・。


[C#](1) ウサミミハリケーンのようなすごいプログラムを作っていきたいです

今回教えてほしいのはプログラムの停止 再開 の方法です

ウサミミハリケーン(ファイル) に停止 再開 など あって 興味を持ちました

手順 ソース 何でもいいので教えてください

とりあえず自分の常識は世間の常識ではない事を認識した方が良い。
肝心のこのアプリケーションは

どうやらログラム開発/解析用の多機能な汎用プロセスメモリエディタ兼デバッガ
というもの。でこれを停止・再開などに興味が・・・。

画面の右上で閉じたらいいね。

2010年5月19日水曜日

研修用クラス群

研修用 クラス群


使用するクラス
ユーザーインターフェイス Form1
データアクセスクラス DataAccess
データインターフェイスクラスIDataAccess
データクラス Data

画面構成

担当者ID
氏名
年齢



使用テーブル構成

FIELD TYPE
ID NUMBER (5)
NAME VARCHAR (20)
AGE NUMBER (2)
IMAGE VARCHAR (255)


Form1(ユーザーインターフェイス)


using System;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Yahoo_Sample_WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            AddOnFormControlEvent();
            InitializeOnFormControl();
        }
        private void AddOnFormControlEvent()
        {
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.button2.Click += new System.EventHandler(this.button2_Click);
            this.button3.Click += new System.EventHandler(this.button3_Click);
        }

        private void InitializeOnFormControl()
        {
            this.lblID.Text = "ID";
            this.lblName.Text ="Name";
            this.lblAge.Text ="Age";
            this.pictureBox1.Image = null;
            this.txtDispID.Text = string.Empty;
            this.txtDispName.Text = string.Empty;
            this.txtDispAge.Text = string.Empty;
        }
        private void button1_Click(object sender, EventArgs e)
        {

        }
        private void button2_Click(object sender, EventArgs e)
        {

        }
        private void button3_Click(object sender, EventArgs e)
        {

        }
    }
}

各、ボタンイベントにて動作の発動を行います。他処理としてInitializeOnFormControlやAddOnFormControlEvent等を
Form1クラスのコンストラクタで呼び出すように設定します。

戻る

DataAccess(データアクセスクラス)


概要

DataAccessクラスでは、データベースに対してクエリを発行します。Insert UpDate Delete Select文を発行します。
SQLやデータの構造上、かなりのバリエーションが必要になる為基本の4つを今回は採用する事にしました。
各パラメーターはDataクラスに対応しており、データクラスに事前に値を設定してあれば基本4つのクエリを発行します。
その為、例えば特定のデータを1件のみ必ず毎回取得するような場合には新たにデータベースアクセスクラスにメソッドを追加します。


using System;
using System.Data.OleDb;

namespace Yahoo_Sample_WindowsFormsApplication1
{
     public class DataAccess : IDataAccess
     {
         private int _ID;
         public DataAccess(int ID)
         {
             _ID = ID;
         }

         public DataAccess(){}

         public bool ExistenceData()
         {
            OleDbConnection OleDbConnection1 = new OleDbConnection();
            OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
            @"C:\Documents and Settings\***\My Documents\db1.mdb";

            OleDbCommand OleDbCommand1 = new OleDbCommand();
            OleDbCommand1.Connection = OleDbConnection1;

            OleDbConnection1.Open();

            OleDbCommand1.CommandText="SELECT COUNT(*) FROM sampleTable";
            OleDbCommand1.CommandText += "WHERE ID = @ID";

            OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = _ID;

            int counter = (int)OleDbCommand1.ExecuteScalar();
            if (counter > 0) 
            { return true; }
            else { return false; }
         }

         public bool InsertData(Data data1)
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbCommand OleDbCommand1 = new OleDbCommand();
             OleDbCommand1.Connection = OleDbConnection1;

             OleDbConnection1.Open();

             OleDbCommand1.CommandText = "INSERT INTO sampleTable" +
                 "(ID, NAME, AGE, IMAGE) VALUES (@ID, @NAME, @AGE, @IMAGE)";

             OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = data1.ID;
             OleDbCommand1.Parameters.Add("@NAME", OleDbType.Char, 50).Value = data1.Name;
             OleDbCommand1.Parameters.Add("@AGE", OleDbType.Char, 2).Value = data1.Age;
             OleDbCommand1.Parameters.Add("@IMAGE", OleDbType.Char, 255).Value = data1.Image;

             if (this.ExistenceData() != true)
             {
                 OleDbCommand1.ExecuteNonQuery();
                 return true;
             }
             else{return  false;}
         }
         public bool DeleteData(Data data1)
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbCommand OleDbCommand1 = new OleDbCommand();
             OleDbCommand1.Connection = OleDbConnection1;

             OleDbConnection1.Open();

             OleDbCommand1.CommandText = "DELETE FROM sampleTable WHERE ID = @ID";

             OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = data1.ID;

             if (this.ExistenceData() != true)
             {
                 OleDbCommand1.ExecuteNonQuery();
                 return true;
             }
             else { return false; }
         }

         public bool UpDateData(Data data1)
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbCommand OleDbCommand1 = new OleDbCommand();
             OleDbCommand1.Connection = OleDbConnection1;

             OleDbConnection1.Open();

             OleDbCommand1.CommandText = "UPDATA sampleTable SET NAME = @NAME, AGE = @AGE, IMAGE = @IMAGE" +
                 " WHERE ID = @ID";

      OleDbCommand1.Parameters.Add("@ID", OleDbType.Char, 5).Value = data1.ID;
             OleDbCommand1.Parameters.Add("@NAME", OleDbType.Char, 50).Value = data1.Name;
             OleDbCommand1.Parameters.Add("@AGE", OleDbType.Char, 2).Value = data1.Age;
             OleDbCommand1.Parameters.Add("@IMAGE", OleDbType.Char, 255).Value = data1.Image;

             if (this.ExistenceData() != true)
             {
                 OleDbCommand1.ExecuteNonQuery();
                 return true;
             }
             else { return false; }
         }
  
  /// 
         /// dataSetを返す
         /// 
         /// SELECT文を発行し全てのデータを取得しDataSetで返す
         public System.Data.DataSet SelectData()
         {
             OleDbConnection OleDbConnection1 = new OleDbConnection();
             OleDbConnection1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" +
             @"C:\Documents and Settings\***\My Documents\db1.mdb";

             OleDbConnection1.Open();

             string selectCommandText = "SELECT * FROM sampleTable";

             OleDbDataAdapter adapter1 = new OleDbDataAdapter(selectCommandText, OleDbConnection1);

             System.Data.DataSet dataset1 = new System.Data.DataSet();
             
             adapter1.Fill(dataset1);

             return dataset1;
         }
     }
}

Insert時のIDはnotnullの為このままでは使用できません。dataクラスにてどうにかしてコーディングするように提案を行います。
私的見解では、データベース側のトリガーを使用したほうが良いと思います。

戻る

データアクセスインターフェイス


概要

研修用の為インターフェイスの使い方のみを言及した形のクラスになります。


using System;

namespace Yahoo_Sample_WindowsFormsApplication1
{
    interface IDataAccess
    {
          bool ExistenceData();
          bool InsertData(Data value);
          bool UpDateData(Data value);
          bool DeleteData(Data value);
          DataSet SelectData();
    }
}
戻る

Data(データクラス)

概要

コンストラクタを2つに設定します。この場合、引数がある場合の用途とない場合の用途を考えてます。
例えば、現状のDataAccessクラスのSelectDataを使用する場合等はIDの指定等が必要ない場合がある為です。
しかし、このままのデータクラスでは全てのデータ形式に対応できない事を明確にします。

理由として、NAMEフィールド{"山","朗"}という文字列があるフィールドに追加したりそのデータを探したりする場合には
Nameプロパティを使用する事はできません。このような場合の対応の仕方を考えて下さい。

using System;
using System.Windows.Forms;
using System.Text;
using System.Text.RegularExpressions;

namespace Yahoo_Sample_WindowsFormsApplication1
{
    public  class Data
    {
        private IDataAccess mydata;
        public Data(string ID)
        {
            if (ID!= string.Empty)
            {
                Regex regex1 = new Regex("^[0-9]+$");
                if (!regex1.IsMatch(ID))
                { MessageBox.Show("not String); }
                else
                {
                    mydata = new DataAccess(int.Parse(ID));
                }
            }
            else
            {
                MessageBox.Show("Nothing");
            }
        }
        public Data() {}
#region property
        private int _ID;
        public int ID
        {
            get{return _ID;}
            set{_ID = value;}
        }
        private string _Name = string.Empty;
        public string Name
        {
            get{return _Name;}
            set{_Name = value;}
        }
        private int _Age;
        public int Age
        {
            get{return _Age;}
            set{_Age =value;}
        }
        private string _Image;
        public string Image
        {
            get { return _Image; }
            set{_Image = value;}
        }
#endregion
    }
}
戻る