tomatomax.net

Every rule has its exception.

Archive for the C# Category

Unicode

デフォルトの文字セットがUnicodeになっててWindowsAPI関連でエラー連発。とりあえずマルチバイト文字セット使用に変更。

みたいな解決方法もあるみたい。

vector

久しぶりにC++使ったらvectorの挙動があやふやになってて愕然としたのでメモ。

内部でコピーコンストラクタ使ってコピーしてたのか(・ω・ )

多次元配列とジャグ配列

多次元配列がint[,]の形でint[][]はヘルプによるとジャグ配列らしい。ジャグってなに(・ω・ )?

int[,] Array = new int[,] {
{0xc1, 0x2b},
{0x3a, 0x74},
};

int[][] JaggedArray = new int[][] {
new int[] {0x22, 0x09},
new int[] {0x7c, 0xf3}
};

初期化の形式がちょっと違う。

ユニークなIDを取得する

ここらを参考に。Sigmarion3ではUUIDの方を取得しろとのことなので。

using System;
using System.Runtime.InteropServices;

public class Sigmarion3
{
private static Int32 FILE_DEVICE_HAL = 0x00000101;
private static Int32 FILE_ANY_ACCESS = 0x0;
private static Int32 METHOD_BUFFERED = 0x0;

private static Int32 IOCTL_HAL_GET_UUID =
((FILE_DEVICE_HAL) << 16) | ((FILE_ANY_ACCESS) << 14) | ((13) << 2) | (METHOD_BUFFERED);

[DllImport("coredll.dll")]
private static extern bool KernelIoControl(Int32 IoControlCode,
IntPtr InputBuffer,
Int32 InputBufferSize,
byte[] OutputBuffer,
Int32 OutputBufferSize,
ref Int32 BytesReturned);

public static byte[] GetID()
{
byte[] OutputBuffer = new byte[16];
Int32 OutputBufferSize, BytesReturned;
OutputBufferSize = OutputBuffer.Length;
BytesReturned = 0;

bool retVal = KernelIoControl(IOCTL_HAL_GET_UUID, IntPtr.Zero, 0, OutputBuffer, OutputBufferSize, ref BytesReturned);

if (!retVal)
{
return null;
}

return OutputBuffer;
}
}

エミュレータだと取得に失敗するなぁ。実機ならおk

ソート

いまさらソートが必要になってきたりしたので、Array.Sortメソッドでさくっと。intからstring等、配列の各要素がIComparableインターフェースの実装なら丸投げでいい。アルゴリズムはクイックソート。要素同士の比較方法を変えたいときはIComparer.Compareを実装したクラスを引数に渡してやれば。

Tabキーでフォーカスを変える

Tabキーでフォーカスを変える動作はCompactFramework SP2で対応したらしい。フォーカスをフォーム上のコントロールに設定しておく必要があるようで。けどエミュレータでテストしたところ動かない。その答えがGoogleのキャッシュに残ってた(cache:7YT6Ry2vjBAJ:thedotnet.com/howto/work338269.aspx – Google 検索)

As far as I remember, this is a know problem with emulators. The Tab does
not work there. If you have an input panel installed on the emulator, you
can use it to press the Tab key, it should work.

エミュレータが悪いようで。実機でやったら反応したよorz

このときフォーカスが移る順番は

this.Controls.Add(this.Textbox1);
this.Controls.Add(this.Textbox2);
this.Controls.Add(this.OKbutton);
this.Controls.Add(this.Cancelbutton);

で加えた順番になる(ここではTextbox1→Textbox2→OKbutton→Cancelbutton→Textbox1→…)

treeView.Click

protectedメソッドのOnClickの説明には.Net Compact Frameworkでもサポートって書いてあるんだけれど、フォームデザイナにClickイベントがない。仕方ないから自分でイベントハンドラに追加してみるものの、Clickイベントが発生していないような。

ヘルプに「マウス ポインタが子オブジェクト (TreeNode または ListViewItem) の上になければなりません。」と書いてあるのでTreeNodeをクリックしてみたんだけどなぁ。⊂⌒~⊃。Д。)⊃

System.Environment

NetBIOS名を取得できるMachineNameプロパティとかUserNameプロパティが用意されているけれど、CompactFrameworkではサポートなし。OSVersionとTickCountとVersionしかサポートされてないでやんの。

DllImportでAPI直叩きすればいいと思うけど、API名がわからん。どっかに資料ないかな。

KeyPresEventArgs.Handled

trueにするとKeyPressイベントがキャンセルされる。

private void SendtextBox_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if(e.KeyChar == (char)13) // Enter
{
e.Handled = true;
Sendbutton_Click(null, null);
}
}

上の例だとEnterキーを押してもテキストボックスに改行が入らない。

Enterの挙動を変更

Form.AcceptButtonプロパティを変更することで、Enterキーを押したときの挙動を変更することができる。相変わらずCE.NETには対応してないけど。

AcceptButtonプロパティを設定していてもテキストボックスで改行を行いたい場合はtextBox.AcceptsReturnプロパティをtrueにする。

// 設定
this.AcceptButton = button1;
// 解除
this.AcceptButton = null;