2009年10月22日木曜日

.NET 定数ファイルを作成する~その3~

定数ファイルを作成する~その3~

定数ファイルを作成する~その1~
定数ファイルを作成する~その2~

改良して、今はこんな感じで落ち着いてます。


定数アイテムリストの基底クラスです。
Namespace Constant
    
    Public MustInherit Class ConstItemBase

        '-----フィールド-----

        'コード
        Private _iCd As Integer
        '名前
        Private _sName As String
        '別名
        Private _sAliasName As String

        '-----Publicプロパティ-----

        'コードを取得します
        Public ReadOnly Property Cd() As Integer
            Get
                Return Me._iCd
            End Get
        End Property
        '名前を取得します
        Public ReadOnly Property Name() As String
            Get
                Return Me._sName
            End Get
        End Property
        '別名を取得します
        Public ReadOnly Property AliasName() As String
            Get
                Return Me._sAliasName
            End Get
        End Property

        '-----コンストラクタ-----
        
        '引数を取らないコンストラクタ
        Private Sub New()
        End Sub
        
        'コードと名前を引数に取るコンストラクタ
        Public Sub New(ByVal cd As Integer, ByVal name As String)
            Me._iCd = cd
            Me._sName = name
        End Sub
        
        'コードと名前と別名を引数に取るコンストラクタ
        Public Sub New(ByVal cd As Integer, ByVal name As String, ByVal aliasname As String)
            Me.New(cd, name)
            Me._sAliasName = aliasname
        End Sub

    End Class
End Namespace

定数リストを検索するためのフィルタクラスです。
Namespace Constant
    Friend Class ConstItemFilter(Of TValue)

        '-----インスタンス変数-----

        '検索する値です  
        Private _FilterValue As TValue

        '-----コンストラクタ-----

        'コンストラクタ  
        Public Sub New(ByVal filterValue As TValue)
            Me._FilterValue = filterValue
        End Sub

        '-----メソッド-----

        '引数に指定した定数アイテムのCDと検索値が一致するかを取得します。  
        Public Function IsMatchCd(ByVal item As ConstItemBase) As Boolean
            If (Me._FilterValue Is Nothing) Then Return False
            Return (Me._FilterValue.Equals(item.Cd))
        End Function

    End Class
End Namespace

曜日をあらわす定数アイテムリストです
Namespace Constant

    Public NotInheritable Class WeekDayKbn : Inherits ConstItemBase
        Private Shared _items As New List(Of WeekDayKbn)

        Public Shared ReadOnly Sun As New WeekDayKbn(1, "日曜日", "日")
        Public Shared ReadOnly Mon As New WeekDayKbn(2, "月曜日", "月")
        Public Shared ReadOnly Tue As New WeekDayKbn(3, "火曜日", "火")
        Public Shared ReadOnly Wed As New WeekDayKbn(4, "水曜日", "水")
        Public Shared ReadOnly Thr As New WeekDayKbn(5, "木曜日", "木")
        Public Shared ReadOnly Fri As New WeekDayKbn(6, "金曜日", "金")
        Public Shared ReadOnly Sat As New WeekDayKbn(7, "土曜日", "土")

        Private Sub New(ByVal cd As Integer, ByVal name As String, ByVal aliasname As String)
            MyBase.new(cd, name, aliasname)
            _items.Add(Me)
        End Sub

        Public Shared Function GetValues() As List(Of KinshuCd)
            Return _items
        End Function

        Public Shared Function GetItem(ByVal cd As Integer) As KinshuCd
            Dim filter As New ConstItemFilter(Of Integer)(cd)
            Return _items.Find(AddressOf filter.IsMatchCd)
        End Function
        
    End Class
End Namespace

実際の使用方法
'月曜日の別名をラベルに表示
Me.Label1.Text = Constant.WeekDayKbn.Mon.AliasName

'曜日コード1に該当する曜日名をラベルに表示
Me.Label1.Text = Constant.WeekDayKbn.GetItem(1).Name

'コンボボックスのデータソースに設定
Me.ComboBox1.ValueMember = "Cd"
Me.ComboBox1.DisplayMember = "Name"
Me.ComboBox1.DataSouce = Constant.WeekDayKbn.GetValues

2009年10月19日月曜日

.NET(Mobile) 回避できなかった問題

リンクコントロールを継承したカスタムコントロールを作成し、デザイナでフォームに配置すると描画が正しく行われない。

リンクコントロールでTabStopプロパティをデザイナでFalseに設定しても、ビルドするとTrueに戻ってしまう。

リンクコントロールのTabStopプロパティをコードでFalseに設定しても、下矢印キーでFocus移動させるとFocus出来てしまう。

TextBoxのValidatingイベントやLostFocusイベントでTextBoxにFocusさせると、SIPから数字以外の入力を受け付けなくなる。(X04HT限定?)

2009年10月13日火曜日

.NET(Mobile) フォームのActiveControlを探す

CompactFrameworkでフォームのActiveControlを探す方法です。
ComapactFrameworkではFormクラスのActiveControlプロパティがサポートされていません。


Public Class MyForm
    Inherits System.Windows.Forms.Form

    Public Overridable Property ActiveControl() As Control
        Get
            Return GetFocusedControl(Me)
        End Get
        Set(ByVal Value As Control)
             If (Not (Value.Focused)) Then
                Value.Focus()
             End If
        End Set
    End Property


    Private Function GetFocusedControl(ByRef parent As Control) As Control
        If (parent.Focused) Then
            Return parent
        End If

         For Each ctrl As Control In parent.Controls
             Dim temp As Control = GetFocusedControl(ctrl)
             If (Not (temp Is Nothing)) Then
                 Return temp
             End If
         Next

        Return Nothing
    End Function
End Class

.NET(Mobile) コントロールの移動

CompactFrameworkでコントロール間をEnterキーと上下矢印キーで移動する方法です。

まず通常のコントロールでEnterキーと上下矢印キーのデフォルト操作をまとめました。
使用した機種はX04HTです。機種によりデフォルト操作が異なります。
コントロールEnterキー上下矢印キー
TextBox動作なし動作なし
ComboBoxドロップダウンリストの展開リストアイテムの選択
DateTimePickerカレンダーの表示値のインクリメント
NumericUpDown動作なし値のインクリメント
CheckBoxチェックON/OFFコントロールの移動
RadioButton動作なしコントロールの移動
LinkLabelClickイベント発生コントロールの移動
ButtonClickイベント発生コントロールの移動

TextBoxではMultiLineプロパティがFalseであればコントロールを移動するようにします。
Enterキーではモバイル開発 TextBoxのTextAlignプロパティの対策を入れる必要もあります。

ComboBox、DateTimePickerではEnterキーのデフォルト操作「ドロップダウンリストの展開」は残し、上下矢印キーはドロップダウンリストが展開していない場合はコントロールを移動とすると操作性が良いと思います。
ドロップダウンが展開しているかどうかはモバイル開発 Controlのドロップダウンが展開されているかを取得するを見てください。

NumericUpDownはどうしますか・・・

コントロールをEnterキーで移動するサンプル
Private Sub KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    Select Case e.KeyChar
     Case Chr(Keys.Enter)
        Call Api.keybd_event(Api.VK_TAB, 0, 0, 0)
        Call Api.keybd_event(Api.VK_TAB, 0, Api.KEYEVENTF_KEYUP, 0)
        e.Handled = True
    End Select
End Sub


コントロールを上下矢印キーで移動するサンプル
Private Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    Select Case e.KeyCode
     Case Keys.Up
         Call Api.keybd_event(Api.VK_SHIFT, 0, 0, 0)
         Call Api.keybd_event(Api.VK_TAB, 0, 0, 0)
         Call Api.keybd_event(Api.VK_TAB, 0, Api.KEYEVENTF_KEYUP, 0)
         Call Api.keybd_event(Api.VK_SHIFT, 0, Api.KEYEVENTF_KEYUP, 0)
         e.Handled = True

     Case Keys.Down
        Call Api.keybd_event(Api.VK_TAB, 0, 0, 0)
        Call Api.keybd_event(Api.VK_TAB, 0, Api.KEYEVENTF_KEYUP, 0)
        e.Handled = True
    End Select
End Sub


API
Public Class Api
    Public Const VK_SHIFT As Integer = &H10
    Public Const VK_TAB As Integer = &H9
    Public Const KEYEVENTF_KEYUP As Integer = &H2

     _
    Public Shared Function keybd_event(ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) As Integer
    End Function
End Class

.NET(Mobile) Controlのドロップダウンが展開されているかを取得する

CompactFrameworkでComboBoxやDateTimePickerのドロップダウンリストが展開されているかどうかを取得するサンプルです。
CompactFrameworkではDroppedDownプロパティがサポートされていないのでAPIを使用します。

Dim isDroppedDown As boolean
Dim cbo As ComboBox = Me.ComboBox1
If Api.SendMessage(cbo.Handle, Api.GETDROPPEDSTATE, 0, 0) = 1 Then
    isDroppedDown = True
Else
    isDroppedDown = False
End If


API
Public Class Api
    Public Const GETDROPPEDSTATE As Integer = &H157
     _
    Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    End Function
End Class

.NET(Mobile) メモリ使用量を表示する

ComactFrameworkでモバイルのメモリ使用量を表示するサンプルです。

Public Class Memory
    Public Structure MEMORYSTATUS
         Public dwLength As Integer
         Public dwMemoryLoad As Integer
         Public dwTotalPhys As Integer         '合計 物理メモリ
         Public dwAvailPhys As Integer         '空き 物理メモリ
         Public dwTotalPageFile As Integer
         Public dwAvailPageFile As Integer
         Public dwTotalVirtual As Integer      '合計 仮想メモリ
         Public dwAvailVirtual As Integer      '空き 仮想メモリ
    End Structure

     _
    Public Shared Function GlobalMemoryStatus(ByRef ms As MEMORYSTATUS) As Integer
    End Function

     _
    Public Shared Function GetSystemMemoryDivision(ByRef lpdwStorePages As Integer, ByRef ldpwRamPages As Integer, ByRef ldpwPageSize As Integer) As Integer
    End Function


    Public Shared Sub ShowMemory()
        Dim storePages As Integer
        Dim ramPages As Integer
        Dim pageSize As Integer
        Dim res As Integer = GetSystemMemoryDivision(storePages, ramPages, pageSize)

        Dim memStatus As New MEMORYSTATUS
        GlobalMemoryStatus(memStatus)

        Dim MemoryInfo As New System.Text.StringBuilder
        MemoryInfo.AppendLine("合計物理メモリ: " & memStatus.dwTotalPhys.ToString("#,##0"))
        MemoryInfo.AppendLine("使用物理メモリ: " & (memStatus.dwTotalPhys - memStatus.dwAvailPhys).ToString("#,##0"))
        MemoryInfo.AppendLine("空き物理メモリ: " & memStatus.dwAvailPhys.ToString("#,##0"))
        MemoryInfo.AppendLine("使用率:" & CInt(((memStatus.dwTotalPhys - memStatus.dwAvailPhys) / memStatus.dwTotalPhys) * 100) & "%")
        MemoryInfo.AppendLine()
        MemoryInfo.AppendLine("合計仮想メモリ: " & memStatus.dwTotalVirtual.ToString("#,##0"))
        MemoryInfo.AppendLine("使用仮想メモリ: " & (memStatus.dwTotalVirtual - memStatus.dwAvailVirtual).ToString("#,##0"))
        MemoryInfo.AppendLine("空き仮想メモリ: " & memStatus.dwAvailVirtual.ToString("#,##0"))
        MemoryInfo.AppendLine("使用率:" & CInt(((memStatus.dwTotalVirtual - memStatus.dwAvailVirtual) / memStatus.dwTotalVirtual) * 100) & "%")
        MemoryInfo.AppendLine()
        MemoryInfo.AppendLine("GC.GetTotalMemory:" & GC.GetTotalMemory(False).ToString("#,##0"))
        System.Windows.Forms.MessageBox.Show(MemoryInfo.ToString())
    End Sub
End Class



Memory.ShowMemory()

.NET(Mobile) TextBoxのTextAlignプロパティ

CompactFramework標準のTextBoxではTextAlignプロパティの選択肢はLEFTしかありません。
これはTextBoxのMultiLineをTrueにすることでTextALignプロパティの選択肢がLEFT、RIGHT、CENTERになります。
もちろんEnterキー押下時に改行しないようにしなければなりません。

雑記 腰痛対策のイス

みなさんはどんなイスでお仕事してますかー?

私は自宅で仕事をしているのですが、仕事部屋にクーラーがないのです。
今年の夏はクーラーのある部屋で座イスで仕事をしていました。
その頃から胃の調子が悪くなり1日中気分が悪くて食事もあまりできませんでした。
病院に行って胃の検査をしてもらわないと・・・と考えていました。

秋になりクーラーも必要なくなったので仕事部屋でPC用のイスで仕事を始めたところ
胃の不快感が良くなってきたのです。
たぶん座イスでは姿勢が悪いので胃が圧迫されていたのでしょう。

しかーし、PC用のイスで仕事をしだして2週目ぐらいのとき仕事もピークで1日12時間も座っていると
腰が痛くて歩くのも立つのも痛い!!
やっぱり3,980円の安物イスではダメですね。

おもいきって5万円のイスに変えたら、とても快適です(*´∀`*)
イスって大事ですね~

ちなみに私が買ったイスはコレです。
DUOREST DR-7900

.NET(Mobile) おすすめコントロール集

久しぶりの更新です。
モバイルの開発がちょっと忙しかったので、JAVAの試験勉強とブログの更新をサボっていました(いいわけ)。
年内の仕事はあるけれど(・・・年明けの仕事はない・・・・)かな~り暇なので、ブログ更新と試験勉強の再開です。


まずはモバイル開発(CompactFramework)のメモから

モバイル開発で最初につまづくのはコントロールのショボサです。
こういうことしたいのに、コントロールがない!
自分で作るには時間もないし面倒・・・


そんなときはコレがお勧めです!!
Resco MobileForms Toolkit

お値段はStandard Editionで$599.95。
今は円高なので購入のチャンスです。


今回はこのコントロール集のSmartGridコントロール、AdvanceListコントロール、ImageButtonコントロールを使用しました。

SmartGridは入力可能で、行選択モードなどもあり、画像も表示出来ます。
標準での入力はテキストボックス、チェックボックスですが、カスタムでWindowsFormsControlが使用できます。
自由自在にカスタマイズできるとは言い難いですが、標準のグリッドに比べれば大変優秀です。
タッチスクロールが可能で、スクロール方向、スクロールスピードを調整できます。



AdvanceListコントロールは展開可能なアコーディオンコントロールみたいな感じです。
モバイルの画面は小さいので一覧画面で使用すると効果的です。
選択していないときは最小限の情報だけを表示し、行を選択すると展開し詳細な情報を表示できます。
標準でリンクコントロールやボタンコントロール、画像を配置できますが、基本的に表示のみのコントロールです。
入力可能のセルを配置することも一応は可能です。
タッチスクロールが可能で、スクロール方向、スクロールスピードを調整できます。



ImageButtonコントロールは画像を配置できるコントロールです。
画像ボタンだけでなく、通常のボタン、リンクコントロールの代用もできます。
画像と文字の配置を調整できるのがうれしいです。




まったく問題がないかといえばウソになりますが、WindowsFormsControlに比べれば
非常に優秀ですっ!!


問題はサポートが英語なこと。
そして購入すると英語で電話がかかってきます。ヽ(д`ヽ)。。オロオロ。。(ノ´д)ノ