SQLの窓 イラストAC フリー素材

2018年10月28日

PowerShell 移行用 C# コンソールアプリのコードテスト( ZIP 圧縮 )

▼ とてもお世話になっています
ZipFile、ZipArchiveクラスを使用して、ZIP圧縮、展開(解凍)、リスト表示などを行う( dobon.net )

この方法ですと、画像関連で Thumbs.db が書庫に入ってしまいますが、仕方ないです。

public class MyClass のほうを、PowerShell に書いて [MyClass]::create_zip() で実行します。
using System;
using System.IO;
using System.IO.Compression;

namespace create_zip {
	class Program {

		static void Main(string[] args) {

			MyClass.create_zip(args[0], args[1]);

		}
	}

	public class MyClass {
		public static void create_zip(string dir, string zipPath) {

			Console.WriteLine(dir);

			if (File.Exists(zipPath)) {
				File.Delete(zipPath);
			}

			try {
				ZipFile.CreateFromDirectory(
							dir,
							zipPath
						);
			}
			catch (Exception ex) {

				Console.WriteLine(ex.Message);
			}

		}

	}
}


▼ 久しぶりに使うとタブの設定や中かっこの設定を忘れていた。
 

# バッチファイルからの引数
$dir = $Args[0]
$zipPath = $Args[1]

$code = @"
using System;
using System.IO;
using System.IO.Compression;

public class MyClass {
	public static void create_zip(string dir,string zipPath) {

		Console.WriteLine(dir);

		if (File.Exists(zipPath)) {
			File.Delete(zipPath);
		}

		try {
			ZipFile.CreateFromDirectory(
						dir,
						zipPath
					);
		}
		catch (Exception ex) {

			Console.WriteLine(ex.Message);
		}

	}

}
"@

Add-Type -Language CSharp -TypeDefinition $code -ReferencedAssemblies `
	( `
	"System.IO.Compression.FileSystem" `
	)

# 実行
[MyClass]::create_zip($dir,$zipPath)





posted by at 2018-10-28 19:08 | C# | このブログの読者になる | 更新情報をチェックする

2017年12月07日

解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (4)

Visual Studio

必要なウインドウを閉じてしまった場合、[     ] メニューの、ウインドウレイアウトのリセットを選択します。

デバッグの為に、ブレイクポイントをソースに設定するには、[     ] キーを使用します。

ブレイクポイントから一行づつ実行するには、[     ] キーを使用します。

[     ] ウインドウを使用すると、ブレークポイントで参照可能な変数を入力して内容を表示する事ができます

デザイナー表示をコードへ切り替えるのは、[     ] キーを使用します。SHIFT キーと同時に使用すると、コードからデザイナーへ表示を切り替える事ができます。

SQL

データーベースからデータを取り出すには、SQL 文を使用しますが、実際のデータを行単位で取り出す処理は [     ] 文という構文で行います。

この文は、列リストと対象テーブルと抽出条件を指定するのが一般的です。対象テーブルは、列リストの後ろに  [     ] キーワードを使い、さらにその後にテーブル名を指定します。

抽出条件は、テーブル名を指定した後、 [     ] キーワードを使い、その後に条件式を指定します。

抽出したデータが複数行の場合、[     ] 句を最後に追加してソートを行う事ができます。省略時は順ソートですが、ソートしたい列名の後に [     ] キーワードを書くと逆ソートされます

データの追加は、[     ] 文を使い、行の追加と言う形で一行づつ行います。対象テーブルは [     ] キーワードの後に記述して、次に対象となる列のリストを  (  ) の中にカンマで区切って並べます。それらの列に対してデータを記述するわけですが、データは [     ] キーワードを使用してから再び (  ) の中にカンマで区切って並べます。列リストデータリストの数は一致する必要があり、それぞれのデータ型に合わせたデータの記述をする必要もあります。

SQL の中での文字列の扱いは  [     ] という記号で文字列を挟んで表現します。数値はそのまま記述できますが、日付型は正しい日付文字列を文字列と同じ記号で挟む必要があります。SQL の中の値の部分は、上記のような記入方法の他に  [     ] と呼ばれる予約された処理を挿入することもできます

データの更新も行単位で [     ] 文を使って行います。対象テーブルは [     ] 文のすぐ後に続け、更新する列と代入する値のペアを SET キーワードの後にカンマで区切って並べます。

更新には条件を指定する事ができ、[     ] キーワードを使い、その後に条件式を指定します。この条件に一致した行は全て更新対象となり、条件に一致した行が無い場合はまったく更新されませんが、エラーとはなりません

推奨覚えろキーワード

cause [     ]

allow [     ]

modify [     ]

visible [     ]

opacity [     ]

show [     ]

position [     ]

search [     ]

column [     ]

row [     ]

exist [     ]

each [     ]

fill [     ]

multi [     ]

remove [     ]

delete [     ]

success [     ]

array [     ]

Initialize  [     ]

エイリアス [     ]

スコープ [     ]

メタデータ [     ]
関連する記事 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (1) 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (2) 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (3)
タグ:C#
posted by at 2017-12-07 20:26 | C# | このブログの読者になる | 更新情報をチェックする

解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (3)

機能

メッセージボックスを表示するには、[     ]クラス(System.Windows.Forms名前空間)の[     ]メソッドを使用します。メッセージボックスは、エラーメッセージを表示したり、ユーザーに確認を求める時などに便利です。

文字列変数の text の中に "1000円の商品を12個買う" とセットしたい場合の記述を完成させて下さい
string text = string.Format("[          ]", 1000, 12);


コンボボックス

コンボボックスはとても便利で良く使用される複数の選択肢をエンドユーザに提供する事ができるコントロールです。但し、C# ではデフォルトで入力可能になっているので、画面上で定義した場合は最初に [     ]を、DropDownList に変更する必要があります。

コンボボックスに登録されるリストは、[     ] に 0 以上の整数をセットする事によってプログラムから変更する事ができます。また、-1 をセットすると未選択になるので注意して下さい(なにも指定しなければ未選択になります)。

コンボボックスの名前(Name)が comboBox1 の場合選択された時に表示している文字列は、[     ] から取得する事ができます。さらに、コンボボックスに登録されているリストの一覧は、[     ] から取得する事ができます。

実際に全てのリストの内容を取得するには、foreach を使って以下のように記述する事ができます
foreach (string item in comboBox1.[     ])
{
	Debug.WriteLine(item);
}
コンボボックスに登録されているリストの数は、[     ] から取得できるので、上記処理と同じ処理を for 文で以下のように記述する事ができます
for (int i = 0; i < comboBox1.[     ].[     ]; i++)
{
	Debug.WriteLine(comboBox1.[     ]);
}
テキストボックス テキストボックスはエンドユーザが情報をキーボードから入力する為に使用します。デフォルトでは一行のみの入力になりますが、複数行を入力可能にするには、[     ] を True にする必要があります。また、複数行の入力では、スクロールバーが必要になって来るので、[     ] に、Both をセットします。Both の他には、Vertcal(垂直) と Holizontal(水平) がありますが、Holizontal スクロールバーを実際に使うには、WordWrap を False にする必要があります 入力を不可能にする方法には、二通りあり、[     ] をFalse にするか、[     ] をTrue にします。後者は、入力不可にはなりますが、内容の選択やコピーは可能になります。 関連する記事 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (1) 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (2) 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (4)
posted by at 2017-12-07 20:15 | C# | このブログの読者になる | 更新情報をチェックする

解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (2)

データ型 : 整数

C# で使用するデータ型は言語として一般的な基本データ型があります。その中でも最初に理解する必要があるのが、整数を表す [     ] 型です。これはクラスの定義としては、Int32 と言うクラスになりますが、C 言語と同じ表現で利用可能になっています。

この型は、計算に使用される基本的な型です。しかし、プログラミングでは表現として文字列としての見え方が必要になるので、この型を文字列型に変換して利用する必要が出て来ます。この場合、Int32 のメンバ(操作を定義した手続き)である[     ] メソッドを使用します。

さらに上記処理の逆の処理として、整数で表現された文字列を整数に変換する場合は、この型(クラス)の、[     ] メソッドに引数で文字列を渡して実行します。また、これは 静的メンバ でもあるので、 Int32 というクラスに対して一つだけ定義された、メモリ上常に存在するメソッドになります。

データ型 : 文字列

文字列変数が work とすると、work が null 以外の場合、文字列の文字数を知るには、work.[     ]  と記述して取り出す事ができます。そして、この文字数を使用して for 文によって一文字ずつ文字列を取得するコードは以下のようになります
string work = "日本語表示";

for (int i = 0; i < work.[     ]; i++)
{
	Debug.WriteLine(work.[     ](i,1));
}
C# では、文字列を表現するのにダブルクォーテーションを使用しますが、一般的な言語と同様に、\ 記号使用したエスケープシーケンスが使用可能ですが、見た目がわかり難いのが欠点です。しかし、C# では[     ] 記号をダブルクォーテーションの前に書く事によって、\ 記号を書かないそのままの文字で表現できます。例えば、Windows のパスの区切り文字である \ は、通常 \\ と書く必要がありますが、以下のように表現できます。
"C:\\Program Files\\Microsoft" と書く代わりに、[     ]"C:\Program Files\Microsoft" と書けます
文字列の連結には、[     ] 記号 が使用されます。同様の連結が、VBA では & が使われ、PHP では .(ピリオド)が使われますが、一般的にはこの記号です。文字列を指定した文字で分割するには、[     ] メソッドが使用されます。但し注意する必要があるのは、区切り文字の指定が文字なので、文字の指定には [     ] 記号を使用する必要があります 関連する記事 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (1) 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (3) 解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (4)
タグ:C#
posted by at 2017-12-07 20:04 | C# | このブログの読者になる | 更新情報をチェックする

解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (1)

C# で Windows アプリケーションを作成する場合、Microsoft があらかじめ定義している [     ] というクラスを使用します。

そのクラスで一番最初に実行されるのはクラス名と同じ名前を持つ public なメソッドですが、一般的にそのメソッドは [     ] と呼ばれています。そして、その次に実行される処理はイベントのうちの一つで、その名前は [     ] イベントと呼ばれます。このイベントは、画面上に定義されたコントロールが全て使用可能になった後に実行されます。

画面は、上記イベントが実行された後に表示されますが、デフォルトでは表示される位置はデスクトップ上の任意の位置になります。これは StartPosition という画面のプロパティが WindowsDefaultLocation という値になっている為にそうなるので、値を [     ]  に変える事によって、デスクトップの中央に表示する事ができます。

Windows でアプリケーションのウインドウから別のウインドウを表示する事ができますが、このウインドウの事を [     ] と呼ぶ事があります。このウインドウには二つの種類があり、新しいウインドウが表示されている間は、元のウインドウを操作できない状態になるものを[     ] と呼びます。

これに対してもう一つの種類の場合は、元のウインドウを操作できます。このウインドウは [     ]  と呼ばれますが、プログラムでコントロールする事が難しくなるので特別な処理にのみ用いられる事が多くなります。

この二つのウインドウは、親子関係で比喩される事も多いですが、C# では、子供から見た親ウインドウを [     ] というプロパティで参照する事ができます。日本語の意味は『所有者』ですが、Windowsでは、権限関係の表現で良く使われています。

このプロパティを使うと、子供のウインドウから親のウインドウのコントロールにアクセスする事ができます。しかし、デフォルトではエラーになって使用できません。そこで、使用する為に 子供からアクセスする必要のあるコントロールの modifiers プロパティを [     ] に変更する必要があります。

クラス

C# のプログラムは、クラスという単位で構成されます。クラスは [     ] のようなもので、決め事を文書にしたものと考えて下さい。そうした場合、その決め事を元に実際に何かを実行するものが必要になります。その実行するものを [     ] と言い、一つのクラスから複数の実行単位を作成できます。

クラスはクラス名で識別します。このクラス名と [     ] 演算子を使って、実行単位をメモリ上に作成して処理を行います。


クラスを構成する要素は3つあり、[     ] と メソッド  と [     ]  と呼ばれ、これらはクラスのメンバであると表現します。

メンバには役割を与えて名前を付けます。そうする事によって、実行単位毎にその名前をピリオドでつないで名前を呼び出して使います。その中でも処理の主体となるのが 『操作を定義した手続き』である[     ] です。この中でC# の処理が行われ、その処理が参照する変数の定義もメンバのうちの一つである [     ]  です。

残りの一つは、他の二つの特性を両方持ったもので、set と get という概念を持った『操作を定義した手続き』で、外部からの使用方法は変数とだいたいにおいて同じになるものです。

クラスのメンバに [     ] キーワードを指定すると、そのメンバは『静的メンバ』と言う特別なクラスの要素となります。静的メンバは、常にメモリの中にあるように作成されるので、実行単位から使用するのでは無く、クラス名そのものから使用します。具体的には、プログラムの中でクラスに対して一つだけ作成されるメモリ領域にあるメンバとなります。

呼び出し方法は、クラス名.メンバ名() や、変数 =  クラス名.メンバ名 というような形になります。

関連する記事

解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (2)

解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (3)

解く事が目的では無い、身に付ける事が目的の C# 初心者用の問題を作ったので良かったらどうぞ (4)




posted by at 2017-12-07 17:23 | C# | このブログの読者になる | 更新情報をチェックする

2017年10月29日

ComboBox : C# : Form アプリケーションで良く使うコントロール / VS2012 にて



コンンボボックス の注意事項



最も簡単な、テキストのみをコンボボックスに保存する方法。取り出すデータもテキストになるので、コード化された仕様を元に利用するのには向いていません。しかし、手っ取り早く表示するのは簡単です。

テキストのみであれば、プロパティより入力可能。



コンボボックス(ComboBox) という名前のクラスですが、デフォルトでは入力可能になってしまうので、一般的なコンボボックスとして使用したい場合は、プロパティで『DropDownList』に変更しておく必要があります。



初期状態で未選択にしてテキストを表示させないようにするには、comboBox1.SelectedIndex = -1; を実行します。

▼ 自動作成されるコード
			// 
			// comboBox1
			// 
			this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
			this.comboBox1.FormattingEnabled = true;
			this.comboBox1.Items.AddRange(new object[] {
            "男",
            "女"});
			this.comboBox1.Location = new System.Drawing.Point(51, 41);
			this.comboBox1.Name = "comboBox1";
			this.comboBox1.Size = new System.Drawing.Size(239, 20);
			this.comboBox1.TabIndex = 0;


ここでは、AddRange が使用されていますが、一般的なコードとテキストを登録したい場合は以下のようなクラスを作成して、comboBox1.Items.Add( オブジェクト ) とします。
        // ******************************
        // コンボボックスに追加情報
        // をセットする為のクラス
        // ******************************
        private class ComboData {

            public ComboData(string Text, string Data) {
                this.Text = Text;
                this.Data = Data;
            }

            public string Text { get; set; }
            public string Data { get; set; }

            public override string ToString() {
                return this.Text;
            }
        }

コンボボックスの選択が変更された場合は、SelectedIndexChanged イベントが実行されるので、以下のようにして Add されたオブジェクトの内容を取り出します
		private void Form1_Load(object sender, EventArgs e) {

			// ComboData を コンボボックスにセット
			comboBox1.Items.Clear();
			comboBox1.Items.Add(new ComboData("昨日", "0001"));
			comboBox1.Items.Add(new ComboData("今日", "0002"));
			comboBox1.Items.Add(new ComboData("明日", "0003"));

		}

		private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {

			ComboBox cb = (ComboBox)sender;

			// コンボボックスのテキスト
			Console.WriteLine(cb.Text);
			// コンボボックスの選択インデックス
			int idx = cb.SelectedIndex;
			Console.WriteLine(idx);

			// 選択されていた場合は、Items コレクションでテキストとデータを表示
			if (idx != -1) {
				ComboData cdata = (ComboData)cb.Items[idx];

				Console.WriteLine(cdata.Text);
				Console.WriteLine(cdata.Data);
			}
		}



タグ:Combobox C#
posted by at 2017-10-29 17:07 | C# | このブログの読者になる | 更新情報をチェックする

2015年01月12日

C# バッチビルドキットで、VB の My 名前空間を使ってクリップボードを使ったり、キーボードの SHIFT キーが押されているかを知る

以下のキットを使うと、コマンドプロンプトで手軽に C# のビルドができます。(%windir%\Microsoft.NET\Framework\v4.0.30319 に環境があります)



処理自体の元々は VB.net ですが、単純な実行部分は Code Translation for .NET (C#<->VB.NET) で変換して、後は適当にエラー処理するだけでした。

参考ドキュメント

方法 : My 名前空間を使用する (C# プログラミング ガイド) 

これを利用するには、Microsoft.VisualBasic.dll の参照が必要ですが、『PATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;』というパスと、コマンドラインとしては『csc.exe /r:Microsoft.VisualBasic.dll cf.cs』で可能です。(64ビット環境では、Framework64というフォルダがあると思います)

※後、注意事項としてクリップボードのアクセス時には [STAThread] が必要です。
( このクラスを使用するには、Main メソッドが STAThreadAttribute 属性でマークされている必要があります。 )
using System;
using Microsoft.VisualBasic.Devices;
using System.Collections.Specialized;

class MyModule {

	[STAThread]
	static void Main() {
		string[] argv;
		argv = System.Environment.GetCommandLineArgs();
		string ActType;
		if ((argv.Length == 1)) {
			ActType = "name";
		}
		else {
			ActType = argv[1];
		}

		// VB.net で言うところの、My.Computer
		// http://msdn.microsoft.com/ja-jp/library/ms173136.aspx
		Computer myComputer = new Computer();

		// SHIFT キーを押しているがどうか
		if (myComputer.Keyboard.ShiftKeyDown) {
			if ((ActType == "name")) {
				// フルパスで表示
				ActType = "path";
			}
			else {
				// ファイル名だけで表示
				ActType = "name";
			}
		}

		StringCollection FileList;
		string delimStr = "\\";
		char[] delimiter = delimStr.ToCharArray();
		string[] aData;

		// エクスプローラから取得したファイル
		// 一覧形式のデータがあった場合
		if (myComputer.Clipboard.ContainsFileDropList()) {
			FileList = myComputer.Clipboard.GetFileDropList();
			foreach (string FilePath in FileList) {
				if ((ActType == "path")) {
					Console.WriteLine(FilePath);
				}
				else {
					aData = FilePath.Split(delimiter);
					Console.WriteLine(aData[(aData.Length - 1)]);
				}
			}
		}

		// 通常のテキストデータがあった場合
		if (myComputer.Clipboard.ContainsText()) {
			Console.WriteLine(myComputer.Clipboard.GetText());
		}


	}
}


関連する記事


▼ 元となった VB.net のコード
Imports System.Collections.Specialized

Module MyModule

' ********************************************
' クリップボードにあるファイル情報を標準出力へ
' ( エクスプローラの「コピー」で取得した内容 )
' 引数による処理タイプの決定
' name : ファイル名のみ
' path : フルパス
' ********************************************
Sub Main()

	' 文字列の配列
	Dim argv As String()

	' コマンドラインの取得
	argv = System.Environment.GetCommandLineArgs()
	Dim ActType As String

	' 引数が無い場合は、名前のみ
	If argv.Length = 1 Then
		ActType = "name"
	Else
		' name または path
		ActType = argv(1)
	End If

	' SHIFT キーを感知できた場合は処理を反転する
	' 要するに引数無しで SHIFT キーを押していたらフルパス
	If My.Computer.Keyboard.ShiftKeyDown Then
		If ActType = "name" Then
			ActType = "path"
		else
			ActType = "name"
		End If
	End If

	Dim FileList As StringCollection
	Dim FilePath As String
	Dim ClipString As String = ""

	' フルパスから名前だけを取り出す為のデリミタ
	Dim delimStr As String = "\"
	Dim delimiter As Char() = delimStr.ToCharArray()

	Dim aData As String()

	' クリップボードにファイルのデータがあった場合
	If My.Computer.Clipboard.ContainsFileDropList() Then
		'データを取得する
		FileList = My.Computer.Clipboard.GetFileDropList()
		'取得したファイル名を列挙する
		For Each FilePath In FileList
			If ActType = "path" Then
				Console.WriteLine( FilePath )
			Else
				aData = FilePath.Split(delimiter)
				Console.WriteLine( aData(aData.Length - 1) )
			End If
		Next
	End If


End Sub

End Module



タグ:C#
posted by at 2015-01-12 00:29 | C# | このブログの読者になる | 更新情報をチェックする

2014年08月07日

printui.dll を VB.net または C# から呼び出す/ DllImport で LoadLibraryA / VS2010

DllImport 属性の使用

printui.dll を使用して、通常使うプリンターを名前で設定します

rundll32 printui.dll,PrintUIEntry /? で、コマンドラインからの使用方法のダイアログが表示されます。

通常使うプリンターとして設定: 
rundll32 printui.dll,PrintUIEntry /y /n "printer"

VB.net
Imports System.Runtime.InteropServices

Module Module1

	<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
	Public Function LoadLibraryA( _
  <MarshalAs(UnmanagedType.LPStr)> ByVal DllName As String _
 ) As Integer
	End Function

	<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
	Public Function FreeLibrary( _
   ByVal hModule As Integer _
 ) As Integer
	End Function

	<DllImport("kernel32.dll", CharSet:=CharSet.Auto)> _
	Public Function GetProcAddress( _
   ByVal hModule As Integer, _
   <MarshalAs(UnmanagedType.LPStr)> ByVal lpProcName As String _
 ) As Integer
	End Function

	<DllImport("user32.dll", CharSet:=CharSet.Unicode)> _
	Public Function GetDesktopWindow() As Integer
	End Function

	Delegate Sub PrintUIEntryW( _
	   ByVal hwnd As Int32, _
	   ByVal hinst As Int32, _
	  <MarshalAs(UnmanagedType.LPWStr)> ByVal text As String, _
	  ByVal nCmdShow As Int32)

	Sub Main()
		Dim hModule As Integer = LoadLibraryA("printui.dll")

		' *****************************
		' 実行
		' *****************************
		Dim ptr As IntPtr
		ptr = GetProcAddress(hModule, "PrintUIEntryW")
		If ptr <> IntPtr.Zero Then
			Dim func1 As PrintUIEntryW = _
			  Marshal.GetDelegateForFunctionPointer(ptr, _
			  GetType(PrintUIEntryW) _
			  )
			Call func1(GetDesktopWindow(), hModule, _
			 "/y /n """ & "プリンタ名" & """", 5)

			Call FreeLibrary(hModule)
		End If

	End Sub

End Module


C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace printui_cs {
	class Program {

		[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
		public static extern int LoadLibraryA([MarshalAs(UnmanagedType.LPStr)] 
		string DllName);

		[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
		public static extern int FreeLibrary(int hModule);

		[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
		public static extern int GetProcAddress(int hModule,
			[MarshalAs(UnmanagedType.LPStr)] 
		string lpProcName);

		[DllImport("user32.dll", CharSet = CharSet.Auto)]
		public static extern int GetDesktopWindow();

		public delegate void PrintUIEntryW(
			Int32 hwnd,
			Int32 hinst,
			[MarshalAs(UnmanagedType.LPWStr)] string text,
			Int32 nCmdShow);

		static void Main(string[] args) {

			int hModule = LoadLibraryA("printui.dll");

			// **************************
			// 実行 
			// **************************
			IntPtr ptr;
			ptr = (IntPtr)GetProcAddress(hModule, "PrintUIEntryW");
			if (ptr != IntPtr.Zero) {
				PrintUIEntryW func1 =
					(PrintUIEntryW)Marshal.GetDelegateForFunctionPointer(ptr, typeof(PrintUIEntryW));
				func1(GetDesktopWindow(), hModule, "/y /n \"" + "プリンタ名" + "\"", 5);
			}
			FreeLibrary(hModule);
		}
	}
}

※ "プリンタ名" が デバイスとプリンターで表示されるプリンタ名です。

関連する Microsoft ドキュメント

ユーザーによる操作なしで Windows にプリンタを追加する方法
[INFO] Windows の Rundll と Rundll32 インターフェイス
UnmanagedType 列挙体
文字列に対する既定のマーシャリング


PrintUIEntryW の最後の引数は、ShowWindow の nCndShow と同じで、5 は SW_SHOW を意味します。



タグ:Win32 API VB C#
posted by at 2014-08-07 23:23 | C# | このブログの読者になる | 更新情報をチェックする

2013年10月19日

LINQ で List のソート

あまり深入りせずに、とりあえずソートで使えばいいと思うのです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

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

			List<MyData> list = new List<MyData>(){
				new MyData() { title = "国語", name = "山田先生",idno=1 },
				new MyData() { title = "英語", name = "田中先生",idno=5 },
				new MyData() { title = "社会", name = "鈴木先生",idno=10 }
			};

			var query = from el in list
				orderby el.idno descending
				select el;

			foreach (var val in query) {
				Console.WriteLine(val.title+" : "+val.name);
			}

			Console.ReadLine();

		}

		private class MyData {
			public string title;
			public string name;
			public int idno;
		}
	}
}




posted by at 2013-10-19 06:20 | C# | このブログの読者になる | 更新情報をチェックする

2013年10月12日

VS2010(C#)WPF : ListView 内に GridView を配置する









以上で、ListView 内に GridView が配置され、GridViewColumn が一つ作成されています。この GridViewColumn の CellTemplate に対して、DataTemplate を適合させてデータバインドを行います。

DataTemplate(2列ぶん)
<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="ListImageTemplate">

		<StackPanel
			HorizontalAlignment="Left"
			Width="60">
			<Image
				Source="{Binding image}"
				Width="50"
				Height="50" />
			<TextBlock
				Text="{Binding screen_name}"
				TextWrapping="Wrap"
				Padding="4" />
		</StackPanel>

	</DataTemplate>

	<DataTemplate
		x:Key="ListDataTemplate">

		<StackPanel
			Margin="0,0,0,17"
			Width="250">
			<Border
				BorderThickness="1"
				BorderBrush="Black"
				Padding="4">
				<TextBlock
					Text="{Binding name}"
					TextWrapping="Wrap" />
			</Border>
			<TextBlock
				Text="{Binding text}"
				TextWrapping="Wrap"
				Padding="3" />
		</StackPanel>

	</DataTemplate>
</Window.Resources>


ListView に対する設定
<ListView
	Grid.Row="1"
	Height="227"
	HorizontalAlignment="Left"
	Margin="23,13,0,0"
	Name="listView1"
	VerticalAlignment="Top"
	Width="459"
	ItemsSource="{Binding statuses}">
	<ListView.View>
		<GridView>
			<GridViewColumn
				CellTemplate="{StaticResource ListImageTemplate}" />
			<GridViewColumn
				CellTemplate="{StaticResource ListDataTemplate}" />
		</GridView>
	</ListView.View>
</ListView>


バインド用のグループクラス
using System;
using System.ComponentModel;
using System.Collections.ObjectModel;

namespace WpfApp1
{
	public class MainViewModel {
		public MainViewModel() 	{
			this.statuses = new ObservableCollection<ItemViewModel>();
		}
		public ObservableCollection<ItemViewModel> statuses { get; set; }
	}
}


バインド用の明細クラス
using System;
using System.ComponentModel;
using System.Linq.Expressions;

namespace WpfApp1
{
	public class ItemViewModel : INotifyPropertyChanged 	{
		public string image { get; set; }
		public string text { get; set; }
		public string name { get; set; }
		public string screen_name { get; set; }

		public event PropertyChangedEventHandler PropertyChanged;
		public void NotifyPropertyChanged(String propertyName) {
			PropertyChangedEventHandler handler = PropertyChanged;
			if (null != handler) {
				handler(this, new PropertyChangedEventArgs(propertyName));
			}
		}
	}
}

データのロード部分
MainViewModel mvm = new MainViewModel();
mvm.statuses.Add(new ItemViewModel() {
	image = "https://lh3.googleusercontent.com/-1n_3a1aPisc/UNSrq1LzhpI/AAAAAAAAKdA/qMQKXmdZlf4/s200/freefont_hanko_ume-pgo4.png",
	screen_name = "sworc",
	name = "夜歩き",
	text = "ListView に GridView を実装する手順"
});

this.listView1.DataContext = mvm;




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

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

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

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

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


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

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

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

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

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


Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX