2009年6月28日日曜日

全角、半角変換(C#)

How to set a Windows hook in Visual C#
http://www.cnitblog.com/zyb/archive/2005/05/25/199.aspx
http://www.autohotkey.com/docs/misc/SendMessageList.htm

Global Mouse and Keyboard Library
http://www.codeproject.com/KB/system/globalmousekeyboardlib.aspx

Bits, Bytes, Words, and Long Words
http://developer.apple.com/documentation/mac/OSUtilities/OSUtilities-39.html

Logical operators toggle《コンピュ》トグル:(オン・オフなど)二方向に切り替えできる論理スイッチ
http://msdn.microsoft.com/en-us/library/aa691306(VS.71).aspx

unmanaged memory C#→marshall

C#で全角、半角変換
Microsoft.VisualBasic.Strings.StrConv(string str, Microsoft.VisualBasic.VbStrConv conversion, int localeId);
string str = Microsoft.VisualBasic.Strings.StrConv(str, Microsoft.VisualBasic.VbStrConv.Wide, 0);

全角のバイト数を取得
static Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");int num = sjisEnc.GetByteCount(str);

2009年6月11日木曜日

Move window/form without Titlebar in C#

using System.Runtime.InteropServices;

public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd,
        int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();

private void Form1_MouseDown(object sender,
      System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
 ReleaseCapture();
 SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}}

外部アプリケーションを起動して終了まで待機する

外部アプリケーションを起動させる
外部アプリケーションを起動させるには、ProcessクラスのStartメソッドを使用します。
下の例では、メモ帳を起動しています。
[VB.NET]
System.Diagnostics.Process.Start("notepad.exe")
[C#]
System.Diagnostics.Process.Start("notepad.exe");
ファイルを関連付けられたアプリケーションで開く
ファイルを関連付けられたアプリケーションで開く場合も上記と全く同じです。
下の例では、"C:\test.txt"を関連付けられたアプリケーションで開いています。
[VB.NET]
System.Diagnostics.Process.Start("C:\test.txt")
[C#]
System.Diagnostics.Process.Start("C:\\test.txt");
起動したアプリケーションが終了するまで待機する
さらに終了まで待機するには次のようにProcessクラスのWaitForExitメソッドを使用します。
このとき同期的に待機するため待機中はフリーズしたようになります。
[VB.NET]
'ファイルを開いて終了まで待機する
Dim p As System.Diagnostics.Process = _
System.Diagnostics.Process.Start("C:\test.txt")
p.WaitForExit()
'ここを次のようにすると最大10秒間だけ待機する
'p.WaitForExit(10000)
MsgBox("終了。")
[C#]
//ファイルを開いて終了まで待機する
System.Diagnostics.Process p =
System.Diagnostics.Process.Start("C:\\test.txt");
p.WaitForExit();
//ここを次のようにすると最大10秒間だけ待機する
//p.WaitForExit(10000);
MessageBox.Show("終了。");
プロセスの終了を非同期で待機する
次の例ではプロセスの終了まで非同期で待機しています。
Button1をクリックしてメモ帳を起動し、メモ帳が終了するとp_Exitedが呼び出されます。
[VB.NET]
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'ファイルを開いて終了まで待機する
Dim p As System.Diagnostics.Process = _
System.Diagnostics.Process.Start("notepad.exe")
'プロセスが終了したときに Exited イベントを発生させる
p.EnableRaisingEvents = True
'イベントハンドラがフォームを作成したスレッドで実行されるようにする
p.SynchronizingObject = Me
'イベントハンドラの追加
AddHandler p.Exited, AddressOf p_Exited
End Sub
Private Sub p_Exited(ByVal sender As Object, ByVal e As EventArgs)
'プロセスが終了したときに実行される
MsgBox("終了しました。")
End Sub
[C#]
private void Button1_Click(object sender, System.EventArgs e)
{
//ファイルを開いて終了まで待機する
System.Diagnostics.Process p =
System.Diagnostics.Process.Start("notepad.exe");
//プロセスが終了したときに Exited イベントを発生させる
p.EnableRaisingEvents = true;
//イベントハンドラがフォームを作成したスレッドで実行されるようにする
p.SynchronizingObject = this;
//イベントハンドラの追加
p.Exited += new EventHandler(p_Exited);
}
private void p_Exited(object sender, EventArgs e)
{
//プロセスが終了したときに実行される
MessageBox.Show("終了しました。");
}
注):上の例では、コードだけですべて行いましたが、Visual Studioのフォームデザイナを使用すれば、「ツールボックス」の「コンポーネント」タブにある「Process」をフォームに配置するだけで簡単に使用できます。
注意:非同期で監視を行う場合、SynchronizingObjectの意味等のマルチスレッドプログラミングの知識がないと危険です。

VB6 DDE通信

二つのプログラムのフォーム上に貼り付けたTextBoxコントロールの値をDDE通信を使って通信させます。
■DDE通信のサーバー
①新規プロジェクトを作成
プロジェクト名 : Project1
②フォーム上にTextBoxコントロールを貼り付ける
オブジェクト名 : Text1

③通信するフォームのプロパティにて以下の様に設定
LinkTopic : IdentString  ←DDE通信時の識別子、重複しないユニークな名前をつけるLinkMode : 1 ←DDE通信をアクティブに設定

④以上にて実行ファイルを作成します実行ファイル名 : Project1.exe

■DDE通信のクライアント
①新規プロジェクトを作成
プロジェクト名 : Project2
②フォーム上にTextBoxコントロールを貼り付ける
オブジェクト名 : Text1
③フォームロードに以下のプログラムを追加
Private Sub Form_Load()
 '各種設定
 Text1.LinkTopic = "Project1IdentString"
 Text1.LinkItem = "Text1"
 'DDE通信の開始
 Text1.LinkMode = 1
End Sub
④以上にて実行ファイルを作成します
実行ファイル名 : Project2.exe

■実行
サーバープログラム(Project1.exe)を実行させます。
クライアントプログラム(Project2.exe)を実行させます。
サーバープログラムのTextBoxにテキストを入力すると、
自動的にクライアントプログラムに反映されます。
■手動でDDEサーバーから値を取得する
①新規プロジェクトを作成
プロジェクト名 : Project2
②フォーム上にTextBox CommandButton コントロールを貼り付け
るオブジェクト名 : Text1
     : Command1
③ボタンのイベントに以下のプログラムを追加
Private Sub Command1_Click()
 Text1.LinkTopic = "Project1IdentString"
 Text1.LinkItem = "Text1"
 Text1.LinkMode = vbLinkManual
 Text1.LinkRequest
 Text1.LinkMode = vbLinkNone
End Sub
④実行させてボタンを押すと値が更新されます

NotifyIcon クラス

通知領域にアイコンを作成するコンポーネントを指定します。
名前空間: System.Windows.Formsアセンブリ: System.Windows.Forms (system.windows.forms.dll 内)
バージョン情報 : .NET Framework1.0以降
以下は部分コード:
public Form1()
{
// Create the NotifyIcon.
this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
// The Icon property sets the icon that will appear
// in the systray for this application.
notifyIcon1.Icon = new Icon("appicon.ico");
// The ContextMenu property sets the menu that will
// appear when the systray icon is right clicked.
notifyIcon1.ContextMenu = this.contextMenu1;
// The Text property sets the text that will be displayed,
// in a tooltip, when the mouse hovers over the systray icon.
notifyIcon1.Text = "Form1 (NotifyIcon example)";
notifyIcon1.Visible = true;
// Handle the DoubleClick event to activate the form.
notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick);
}

private void notifyIcon1_DoubleClick(object Sender, EventArgs e) {

// Show the form when the user double clicks on the notify icon.

// Set the WindowState to normal if the form is minimized.

if (this.WindowState == FormWindowState.Minimized)

this.WindowState = FormWindowState.Normal;

// Activate the form.

this.Activate();

}

http://homepage1.nifty.com/rucio/main/dotnet/ClassLibrary/L004_System.Windows.Forms.NotifyIcon.htm

2009年6月10日水曜日

ショートカットキー

Ctrl + T
新しいタブを開く(IE7)
Ctrl + W
タブを閉じる(IE7)
Alt + Enter
ファイルのプロパティ画面を開く
ESC
その画面を閉じる
Shift + Space、Ctrl + 「-」
エクセルの行の削除
Ctrl + Y
Vb6.0コード行の削除

タイトルバーを使わないでマウスでフォームを移動する

Vb.net:
Private Declare Function SendMessage Lib "User32.dll" Alias "SendMessageA" (ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Long
Private Declare Sub ReleaseCapture Lib "User32.dll" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2

Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
 If e.Button = MouseButtons.Left Then
  Call ReleaseCapture()
  Call SendMessage(Me.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
 End If
End Sub

vb6.0:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal hWnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByRef lParam As Any) As Long
Private Declare Sub ReleaseCapture Lib "user32" ()
Const WM_NCLBUTTONDOWN = &HA1
Const HTCAPTION = 2
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
 If Button = vbLeftButton Then
  Call ReleaseCapture
  Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
 End If
End Sub

右クリックの禁止(Vb6.0)

標準モジュール:
'□API関数Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByValnIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc AsLong, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'□SetWindowLongで使用
Private Const GWL_WNDPROC = -4
'□メッセージ
Private Const WM_CONTEXTMENU = &H7B '右クリック'□コレクション すべてウィンドウハンドルがキー
Dim colDProc As Collection
'現在サブクラス化されているコントロールの元のWindowsProcのアドレス
'■WindowProc
'■機能:メッセージを横取りする。
'■備考:この関数はコールバック関数なので定義を変えてはいけない!
Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParamAs Long) As Long
 Dim DefaultProc As Long
 Select Case uMsg
 Case WM_CONTEXTMENU '右クリック
  Exit Function
 End Select
CONTINUE: '引当のWindowProcへメッセージを回す。
 DefaultProc = colDProc(CStr(hWnd))
 WindowProc = CallWindowProc(DefaultProc, hWnd, uMsg, wParam, lParam)
End Function
'■BeginSubClass
'■機能:サブクラス化を開始する。
Public Sub BeginSubClass(oControl As Control)Static bAlready As Boolean
Dim DefaultProc As Long
If Not bAlready Then
Set colDProc = New Collection
bAlready = True
End If'
'サブクラス化実行
DefaultProc = SetWindowLong(oControl.hWnd, GWL_WNDPROC, AddressOf WindowProc)
'元のWindowProcのアドレスを保存
colDProc.Add DefaultProc, CStr(oControl.hWnd)
End Sub
'■EndSubClass
'■機能:サブクラス化を終了します。
Public Sub EndSubClass(oControl As Control)
Dim Ret As Long
Dim DefaultProc As Long
'WindowProcのアドレスを元に戻す。
DefaultProc = colDProc(CStr(oControl.hWnd))
Ret = SetWindowLong(oControl.hWnd, GWL_WNDPROC, DefaultProc)
colDProc.Remove CStr(oControl.hWnd)
End Sub
フォーム:
Private Sub Form_Load()
 Call BeginSubClass(Text1)
End Sub

Private Sub Form_Unload(Cancel As Integer)
 Call EndSubClass(Text1)
End Sub

SQL Server 2005のデータ型

bigint
-9,223,372,036,854,775,808~9,223,372,036,854,775,807(8バイト)
–2^63~2^63-1
int
2,147,483,648 ~ 2,147,483,647(4バイト)
smallint
-32,768 ~ 32,767(2バイト)
tinyint
0 ~ 255(1バイト)
money
-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807(8バイト)
smallmoney
- 214,748.3648 ~ 214,748.3647(4バイト)
bit
(同一テーブル内のbit列数-1)/8+1
bit列が8以下の場合、1バイトで格納、16以下の場合2バイトで格納、以降8ビットずつ1バイト増加
decimal
- 10^38 +1 ~ 10^38 - 1
有効桁数が1~9の場合5バイト、10~19の場合9バイト、20~28の場合13バイト、29~38の場合17バイト
numeric
- 10^38 +1 ~ 10^38 - 1
有効桁数が1~9の場合5バイト、10~19の場合9バイト、20~28の場合13バイト、29~38の場合17バイト
float
Double precision/float(n) { 8 <= n <= 15 }
- 1.79E+308 ~ -2.23E-308、0、および 2.23E-308 ~ 1.79E+308(nの値によりバイト数が変動)
floatに指定されたnの値が1~24の場合4バイト、25~53の場合8バイト
real
float(n) { 1 <=< n <= 7 }
- 3.40E+38 ~ -1.18E-38、0、および 1.18E-38 ~ 3.40E+38(4バイト)
datetime
1753 年 1 月 1 日~ 9999 年 12 月 31 日
精度:3.33 ミリ秒
smalldatetime
1990 年 1 月 1 日~ 2079 年 6 月 6 日
精度:1分
char
1 ~ 8,000
指定した数分だけ領域確保 UNICODEではない
varchar
1 ~ 8,000
実際のデータに2バイト加算した分領域確保 UNICODEではない
text
2^31-1 (2,147,483,647)
<=2,147,483,647
nchar
1 ~ 4,000
指定した数×2バイト UNICODE
nvarchar
1~ 4,000
実際のデータ文字数×2+2バイト分領域確保 UNICODE
ntext
2^30 - 1 (1,073,741,823)文字以内
実際のデータ文字数×2分領域確保 UNICODE
binary
1~ 8,000
指定したバイト数分領域確保
varbinary
1 ~ 8,000
実際の格納データバイト数分領域確保
image
0 ~ 2^31-1 (2,147,483,647)
実際のデータバイト数分領域確保
timestamp
8バイト
sql_variant
text、ntext、image、timestamp、および sql_variant以外のデータ型を格納することが可能なもの。よって領域も元のデータ型に依存する。
table
この型を持つ変数を定義した関数、プロシージャ内で有効。テーブルに格納する列のバイト数に依存。
cursor
カーソルへの参照を格納している変数やストアド プロシージャの OUTPUT パラメータを表すもの。
uniqueidentifier
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx の形式の文字列定数(0<=x<9 or a<=x<=f)
xml
0~2G
XMLデータを格納するデータ型

ORACLEデータ型

VARCHAR2(n)
最大4000バイト
文字列型(可変長)。nに最大サイズを指定
NVARCHAR2(n)
最大4000バイト
各国語キャラクタセットを使用するUNICODEデータ型の文字列型(可変長)。nに最大サイズを指定
CHAR(n)
最大2000バイト
文字列型(固定長)。nに最大サイズを指定
NCHAR(n)
最大2000バイト
各国語キャラクタセットを使用するUNICODEデータ型の文字列型(固定長)。nに最大サイズを指定
NUMBER(n , m)
最大38桁
数値型。nに最大桁数、mに少数桁数を指定
BINARY_FLOAT
正の最大:3.40282E+38F正の最小:1.17549E-38F
32ビットの単精度浮動小数点数データ型。5バイトの領域を使用
BINARY_DOUBLE
正の最大:1.79769313486231E+308正の最小:2.22507485850720E-308
64ビットの倍精度浮動小数点数データ型。9バイトの領域を使用
DATE
紀元前4712年1月1日~紀元9999年12月31日
日付型。年/月/日/時/分/秒を格納。少数部は無い。7バイトの領域を使用
TIMESTAMP(n)
 
日付型。年/月/日/時/分/秒/秒の少数部を格納。nには小数部の桁数を指定。
RAW
最大2000バイト
バイナリデータ
LONG RAW
最大2GB
バイナリデータ※既存アプリの下位互換のために用意されている型なので、新規でテーブル項目を作成する場合はBLOBやBFILEを使用する
BFILE
9i :最大4GB10g:最大128TB
外部ファイル用のポインタが格納される。ファイルの実態は、外部ファイルとしてOSの管理下になるのでDBによるリカバリは出来ません。
BLOB
最大4GB
バイナリデータ
LONG
最大2GB
文字列型(可変長)※既存アプリの下位互換のために用意されている型なので、新規でテーブル項目を作成する場合はCLOBやNCLOBを使用する
CLOB
最大4GB
シングルバイト、マルチバイトキャラクタ
NCLOB
9i :最大4GB10g:最大128TB
各国語キャラクタセットを使用するUNICODEデータ
XMLType
XML文書がCLOBとして格納されます。

http://oracle.se-free.com/ddl/A1_data.html

SqlServerの照合順序

_BIN1
バイナリ並べ替え
_BIN2
バイナリ コード ポイント並べ替え順
_CI_AI
大文字小文字を区別しない、アクセントを区別しない、かなを区別しない、文字幅を区別しない
_CI_AI_KS
大文字小文字を区別しない、アクセントを区別しない、かなを区別する、文字幅を区別しない
_CI_AI_KS_WS
大文字小文字を区別しない、アクセントを区別しない、かなを区別する、文字幅を区別する
_CI_AI_WS
大文字小文字を区別しない、アクセントを区別しない、かなを区別しない、文字幅を区別する
_CI_AS
大文字小文字を区別しない、アクセントを区別する、かなを区別しない、文字幅を区別しない
_CI_AS_KS
大文字小文字を区別しない、アクセントを区別する、かなを区別する、文字幅を区別しない
_CI_AS_KS_WS
大文字小文字を区別しない、アクセントを区別する、かなを区別する、文字幅を区別する
_CI_AS_WS
大文字小文字を区別しない、アクセントを区別する、かなを区別しない、文字幅を区別する
_CS_AI
大文字小文字を区別する、アクセントを区別しない、かなを区別しない、文字幅を区別しない
_CS_AI_KS
大文字小文字を区別する、アクセントを区別しない、かなを区別する、文字幅を区別しない
_CS_AI_KS_WS
大文字小文字を区別する、アクセントを区別しない、かなを区別する、文字幅を区別する
_CS_AI_WS
大文字小文字を区別する、アクセントを区別しない、かなを区別しない、文字幅を区別する
_CS_AS
大文字小文字を区別する、アクセントを区別する、かなを区別しない、文字幅を区別しない
_CS_AS_KS
大文字小文字を区別する、アクセントを区別する、かなを区別する、文字幅を区別しない
_CS_AS_KS_WS
大文字小文字を区別する、アクセントを区別する、かなを区別する、文字幅を区別する
_CS_AS_WS
大文字小文字を区別する、アクセントを区別する、かなを区別しない、文字幅を区別する

SQL Server 照合順序の意味

先ずはこの"CI""AS"の末尾の一文字

"I"-Insensitive:識別しない

"S"-Sensitive:識別する

さらに、前の一文字

"C"-Case:大文字小文字(例:"A"と"a")

"A"-Accesnt:アクセント記号(例:"a"と"á")

"K"-Kana:ひらがなとカタカナ(例:"あ"と"ア")

"W"-Width(?):文字列幅(例:"ア"と"ア")

http://msdn.microsoft.com/ja-jp/library/ms143515.aspx

テキストを全選択状態にする(Vb6.0)

' Text1 のテキストを全選択状態にする
Me.Text1.SelStart = 0
Me.Text1.SelLength = Len(Me.Text1.Text)


If Not mIsMouseDown Then

要素数が0の配列(Vb6.0)

1.要素数が0の配列の作成
'/ 未割り当ての状態を取得 (メソッド内は空でもいい)
Public Function GetNothing() As String()
 Dim stNullable() As StringGetNothing = stNullable
End Function
'/ 配列 0 の状態を取得
Public Function GetEmpty() As String()
 GetEmpty = Split(vbNullString, vbNullChar)
End Function

2.0要素の配列のチェック
'/* MyStrings モジュール */
Option Explicit
Private Declare Sub GetMem4 Lib "MSVBVM60.DLL" ( _
ByRef aParam() As Any, _
ByRef lCount As Long _
)
'/ Is Nothing の代わり
Public Function IsNothing(ByRef stArgs() As String) As Boolean
 Dim lCount As LongCall GetMem4(stArgs, lCount)
 If lCount = 0 Then
  IsNothing = True
 Else
  IsNothing = False
 End If
End Function

DLLのデバッグ

Vb6.0:

DLLファイルのデバッグ、下記の手順

1.Class_Initialize()メソッドを作る

2.「プロジェクト」→「プロパティ」→「デバッグ」→「プログラムを開始する」をチェックし、exeファイルを指定する。

注:exeファイルがこのDLLが使っていることが満たす

3.Class_Initialize()メソッド中でテストのメソッドを書く

4.それで、デバッグできるようになる。

C#:

1つソリューション2つプロジェクトを作成する

①Formプロジェクトとクラスライブラリ

②Formプロジェクトでクラスライブラリを参照する

参照設定→参照の追加→プロジェクト(または\bin\debug\*.lib)を参照する

設定すればFormプロジェクトをデバッグするとクラスライブラリにもデバッグできるようになる。

DLLの参照(Vb6.0)

ActiveX DLLファイルの参照、以下の手順
・ActiveX DLLプロジェクトの「プロジェクト名」(ファイル名ではない)。
VBのメニュー「プロジェクト」→「XXXXのプロパティ」→「全般」タブ→「プロジェクト名」
・クラスファイルの「オブジェクト名」(ファイル名ではない)。
プロジェクト名が"Project1"で、オブジェクト名が"Class1"だったら
Set objTest = CreateObject("Project1.Class1")