PDA项目开发经验总结

       先说一下项目的特点和开发流程把。使用工具为vb.net2005,在sharp的pda上运行的软件,型号为RZ1502。具备无线上网,蓝牙,红外线扫描等功能。

1。先是在pc上建立普通的windows application工程。

2。再建立wince工程,

一. 语言
1.      函数
        转换函数
CInt ( 1 )
CDBL  (“1”)
 
        Format
I.       数值
Format(CDbl( str ), "##,##0.##")
 
        ASC
I.       取得 ASC Asc(Mid( str , i, 1))
II.    通过 ASC 码取得字符 Chr(intAsc)
        日期函数
I.       取得下个月的最后一天
DateAdd("d", -1, Format(DateAdd("m", 2, strYMD), "yyyy/MM/01")).ToString()
MM 为月份, mm 则为分钟。区分大小写
 
        弹出框
I.       信息 对话
Dim response As MsgBoxResult
MsgBox(" 登録しますか?" , MsgBoxStyle.Question + MsgBoxStyle.YesNo + MsgBoxStyle.DefaultButton2, " 登録確認" )
    If response = MsgBoxResult.Ok Then  End If
II.    对话
Dim myValue As Object
message = "
请输 入数 ,数 1-3 " ' 对话 框提示信息
title = "
入提示框 " ' 对话 标题
defaultValue = "1" '
对话 框中缺省的数
myValue = InputBox ( message , title , defaultValue , 100 , 100 )
' 对话 框在左上角坐 位于 桌面 100 100 )区域
        InStr 查找字符串中特定自负的位置,返回整型,第一个参数是开始位置
Eg. InStr(1, str 数量 , ".")
       Control.SelectNextControl 激活下一个控件(就是将焦点移动过去)
Eg. Me .SelectNextControl(Me.ActiveControl, True, True, True, True)
其中 ActiveControl 指的是活动的控件
       使用 SendKeys.Send("{ENTER}") 代码可以实现键盘的敲击
 
2.     
        I/O
I.       向文件写入数据
If e.KeyCode = Keys.Enter Then
            sw = New StreamWriter(strPath 集計, False, System.Text.Encoding.Default)
            For i = 1 To UBound(G_ARR 集計, 1)
                For j = 1 To UBound(G_ARR 集計, 2)
                    sw.Write(G_ARR 集計(i, j))
                Next
                sw.WriteLine()
            Next
            sw.Close()
        End If
II.    将数据读取到 2 维数组中
        sr = New StreamReader(strPath, System.Text.Encoding.Default)
        i = 1
        Do
            array_line = Split(sr.ReadLine(), ",")
            For j = 0 To UBound(array_line)
                array(i, j + 1) = array_line(j)
            Next
            If sr.Peek = -1 Then
                Exit Do
            End If
            i = i + 1
        Loop
III.                            判断是否数据流读取到最后一行
        If sr.Peek = -1 Then
            PsGetDataFor 年月日= False
            Exit Function
        End If
IV.    创建文件
        Dim sw As StreamWriter
        If File.Exists(C_PATH 入出庫) = False Then
            sw = File.CreateText(C_PATH 入出庫)
            sw.Close()
        End If
        File 类没有释放自己的成员,所以我是用了 StreamWriter 接收他,用来施放
 
        Dns
Dns 是一个静 态类 ,它从 Internet 域名系 (DNS) 于特定主机的信
Imports System.Net
Eg. Dns.GetHostName() 取得主机名
        XML
I.       读取 xml 范例
Imports System.Xml
Namespace Config
    Public Class INI_XML
        Inherits System.Collections.Specialized.NameValueCollection
        Private Ai_FilePath As String
        ' 构造函数
        Sub New(ByVal FilePath As String)
            Ai_FilePath = FilePath
        End Sub
        Sub LoadSetting()
            Dim Reader As XmlTextReader
            Try
                Reader = New XmlTextReader(Ai_FilePath)
                Reader.WhitespaceHandling = WhitespaceHandling.None ' 忽略所用Whitespace
                Me .Clear() ' 清除 有所有数据
            Catch ex As Exception
                MsgBox(" 找不到XML文件" + ex.ToString) : Exit Sub
            End Try
            Try
                While Reader.Read
                    If Reader.Name = "add" Then
                        Dim Key, Value As String
                        Reader.MoveToAttribute("key")
                        Key = Reader.Value
                        Reader.MoveToAttribute("value")
                        Value = Reader.Value
                        Me.Set(Key, Value)
                        Reader.MoveToElement()
                    End If
                End While
            Catch ex As Exception
                 MsgBox("XML 文件格式 ?" + ex.ToString) : Exit Sub
            Finally
                Reader.Close()
            End Try
        End Sub
        Sub SaveSetting()
            Dim Writer As XmlTextWriter
            Try
                Writer = New XmlTextWriter(Ai_FilePath, System.Text.Encoding.Default)
            Catch ex As Exception
                MsgBox(" 找不到XML文件" + ex.ToString) : Exit Sub
            End Try
            Try
                Writer.WriteStartDocument() ' 写入 XML
                Dim I As Integer
                Writer.WriteStartElement("configuration")
                Writer.WriteString(vbCrLf)
                Writer.WriteStartElement("appSettings")
                Writer.WriteString(vbCrLf)
                For I = 0 To Me.Count - 1
                    Writer.WriteString("")
                    Writer.WriteStartElement("add")
                    Writer.WriteStartAttribute("key", String.Empty)
                    Writer.WriteRaw(Me.GetKey(I))
                    Writer.WriteEndAttribute()
                   Writer.WriteStartAttribute("value", String.Empty)
                    Writer.WriteRaw(Me.Item(I))
                    Writer.WriteEndAttribute()
                    Writer.WriteEndElement()
                    Writer.WriteString(vbCrLf)
                Next
            Catch ex As Exception
                MsgBox("XML 文件格式 ?" + ex.ToString)
                Exit Sub
            Finally
                'Writer.WriteEndElement()
                Writer.WriteEndElement()
                Writer.Flush()
                Writer.Close()
            End Try
        End Sub
    End Class
End Namespace
本类首先继承了 NameValueCollection 类,使用了此类的 get,set,cleare 方法(实际上就是个哈希表的类)。写文件时还是用了 vbCrLf (回车 + 换行) 常数。 Writer.WriteEndElement() :为标签进行闭合如果省略标签就会以 /> 的形势闭合。
       枚举类型
I.       RecycleOption 指定文件是 永久 是放入 回收站
       控制输入法可使用 InputLanguage
 
 
 
 
 
 
3.         语法
       定义数组
I.       定义数组
Dim array () As String
ReDim array(i, int 項目数 )
II.       重新定义数组,保留原有数据
ReDim Preserve
但是只能重新定义最后一维
 
        Vb.net 中构造函数的名称为 Sub New () 而不是类的名称
        定义变量时,定义空间: Dim strResult As String = Space(255)
       异常
I.       Try
            sr = New StreamReader(strPath, System.Text.Encoding.Default)
            If sr.Peek = -1 Then
                MsgBox(C_DATANOTFOUND)
                PsGetDataFor 年月日= False
                Exit Function
            End If
        Catch ex As FileNotFoundException
            PsGetDataFor 年月日= False
            Exit Function
       End Try
        其中 FileNotFoundException 是找不到文件的异常类
II.       种类
A)       DirectoryNotFoundException    路径不存在
B)       FileNotFoundException         文件不存在
       实现接口: implement
继承:     Inherits
I.       使用接口与抽象类的区别:类只能继承一个类,却可以实现多个接口,并且接口也可以继承接口。
II.    接口中的所有方法都不提供实现功能,只是定制规则 , 且不能被实体化。实现接口的类必须实现接口的所有方法,且自己可以再创建新的方法,但是接口无法调用。
III.                            接口的使用主要是为了代码的规范化及使管理和变更变得容易
IV.    实例( java
Public Interface Interface1
        Sub test1(ByVal intA As Integer
End Interface
 
Public Class Class1
        Implements Interface1
        Public Sub test1(ByVal intA As Integer) Implements Interface1.test1
                        MsgBox(intA.ToString())
        End Sub
        Public Sub test3()
                        MsgBox("test3")
        End Sub
End Class
 
Public Class Form1
        Private Sub test()
                        Dim cls As Class1 = New Class1
                        Dim interface1 As Interface1 = New Class1
                        interface1.test1(1)
        End Sub
End Class
        调用 windows API
    Public Declare Function WritePrivateProfileString _
            Lib "KERNEL32.DLL" Alias "WritePrivateProfileStringA" ( _
                ByVal lpAppName As String, _
                ByVal lpKeyName As String, _
                ByVal lpString As String, _
                ByVal lpFileName As String) As Integer
其中 KERNEL32.DLL windows 中最 基本 3 dll 之一,也是最主要的 WritePrivateProfileString KERNEL32.DLL 自带的函数,功能是对文件进行写入,在这里是写 ini 文件,参数也是 dll 自带的,并非自己定义,所以调用之前需要先看一下 api 才行。“ WritePrivateProfileStringA ”是对外的名称(具体作用暂时不清楚),可以省略。
imm32.DLL windows api, 输入法管理 dll, 使用 ImmSimulateHotKey 方法可以进行不同语言切换。
    Public Declare Function ImmSimulateHotKey _
    Lib "imm32.DLL" ( _
        ByVal hwnd As IntPtr, _
        ByVal lngHotkey As Int32) As Int32
    Private Const IME_CHOTKEY_SHAPE_TOGGLE As Int32 = 17
ImmSimulateHotKey(Me.Handle, IME_CHOTKEY_SHAPE_TOGGLE)
 
 
4.         功能
        为列指定类型
New DataColumn(arr 項目名(i), System.Type.GetType("System.Decimal"))
        绑定
dataTable .DefaultView.RowFilter =
" 大分類CD = " + Me.cmb_ 大分類.SelectedValue.ToString() + " OR 大分類CD = 0"
dataTable .DefaultView.Sort = " 中分類CD"
经过测试,通过绑定为控件排序,过滤能够很大的提高效率。用代码为数组排序和过滤,效率非常低,严重影响程序速度。
        从数据库取得数据进行绑定最好是用SqlDataAdapter类,msdn的例子:
    Public Function SelectRows( _
    ByVal dataSet As DataSet, ByVal connectionString As String, _
    ByVal queryString As String) As DataSet
        Using connection As New SqlConnection(connectionString)
            Dim adapter As New SqlDataAdapter()
            adapter.SelectCommand = New SqlCommand(queryString, connection)
            adapter.Fill(dataSet)
            Return dataSet
        End Using
    End Function
其中, connectionString 存放与数据库的连接信息,如:"driver={sqlserver};server=SUPERHAWKS;uid=user;pwd=123;database=DB_INFOX"
queryString 中存放的是查询信息,如:
queryString = "select * from users where username='user'and password='123'"
SqlCommand 执行 sql 文。 adapter 则得到数据,进而通过 Fill 方法将数据传给 DataTable 或者 DataSet ,传给 DataSet 时,会在里面自动建立一个 DataTable. 本次开发因为没有使用数据库 . 更新,插入或删除时则使用 UpdateCommand InsertCommand DeleteCommand 方法。
SqlDataAdapter的话,仍然要在程序中写列名等,并不方便多少,所以没有使用。但如果有数据库的话,无疑是用此种方法是非常方便的。
        KeyPress 事件 中写的,为控件进行 format, 就是只能输入数字 . ”和“ - ”,小数点后只能有 2 位,且整数部分不能大于 6 位,代码如下:
    str 数量 = Me.txt_ 数量 .Text
    If InStr(1, str 数量 , ".") > 0 Then
        int 小数桁数 = Len(str 数量 ) - InStr(1, str 数量 , ".")
    End If
    Select Case Asc(e.KeyChar)
        Case 8          '"BackSpace"
        Case 45         '"-"
            If Len(str 数量 ) > 0 Then e.KeyChar = ""
        Case 46         '"."
            intLen = InStr(str 数量 , ".")
            If intLen > 0 Then e.KeyChar = ""
        Case 48 To 57
            If int 小数桁数 = 2 _
            Or (Len(str 数量 ) - InStr(1, str 数量 , ".") > 5 And InStr(1, str 数量 , "-") = 0) _
            Or (Len(str 数量 ) - InStr(1, str 数量 , ".") > 6 And InStr(1, str 数量 , "-") > 0) Then
                e.KeyChar = ""
            End If
        Case Else
            e.KeyChar = ""
    End Select
        取得屏幕的高和宽
Screen.PrimaryScreen.Bounds.Width
        最大化
Me .WindowState = FormWindowState.Maximized
        生成 form 来替代 msgBox() 时,要使用 Form .ShowDialog() , 以使这个窗体像始终位于所有窗体的最前端。
二. 控件
1.         日历
.net 自带的有 DateTimePicker 可以下拉弹出日历。也可以使用 inputman imedDate 控件
       DateTimePicker
dtp_ 年月.Format = DateTimePickerFormat.Custom
dtp_ 年月.CustomFormat = "yyyy年MM月"
2.         DataGridView
        如果在 design 中设置列,绑定 table 的时候会自动添加,所以要将 AutoGenerateColumns 属性设置为 false 。然后在列的 DataPropertyName 属性中设置要绑定的字段的名称,即可。
绑定 :
d ataGridView . DataSource = dataTable . DefaultView
3.              DataGrid
                 获取选中的行数
for(i=0;i{
if(datagrid.IsSelected(i)==true)
{ }
}
                DataGrid 可以在 TableStyles 中添加列,及设置属性
                如果要动态设置列的属性,可以先对 TableStyles 添加 DataGridTableStyle ,在利用 GridColumnStyles 对列的属性进行设置
        Dim dataGridTableStyle As DataGridTableStyle = New DataGridTableStyle
        dgv_ 集計.TableStyles.Add(dataGridTableStyle)
        dataGridTableStyle.GridColumnStyles(" 商品名" ).Width = 100
                DataGrid.CurrentCell 得到当前选中的单元格坐标等
                DataGrid1.Item(DataGrid1.CurrentCell) 得到当前选中的单元格
4.         comboBox
        改变 DropDowStyle 属性,即可使 comboBox 只能从下拉框中选择数据,而不能写入数据
        绑定
        dt.Columns.Add("a")
        dt.Columns.Add("b")
        dr = dt.NewRow
        dr.Item("a") = "a1"
        dr.Item("b") = "b1"
        dt.Rows.Add(dr)
 
        Me.ComboBox1.DataSource = dt
        ComboBox1.DataBindings.Add("text", dt, "b")
        ComboBox1.DisplayMember = "a"
        ComboBox1.ValueMember = "b"
5.       窗体
       TopMost 使窗体出现在屏幕的最前端
6.         事件
        textBox 控件有 LostFocus 属性,可以写出来,但是有时在编辑器中找不到
        Deactivate
窗体事件,当窗体失去焦点的时候触发。实现使窗体永远保持在最前端的时候,可使用此事件。
也可以使用 API SetWindowPos
        KeyPress,KeyDown,KeyUp 为按下键盘引发事件的顺序
        在事件中使用 e.Handled = True 可以取消本次事件,但是写在触发中的代码仍然会被执行。下面的代码使用了 text. SelectionStart 属性和 e.Handled 实现了,在不更改 KeyChar 的情况下,使键盘输入的“ * ”转变成了“ .
    Private Sub txt_ 数量 _KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_ 数量 .KeyPress
        Dim intSelStart As Integer
        Dim intSelLength As Integer
        If e.KeyChar.ToString = "*" Then
            intSelStart = Me.txt_ 数量 .SelectionStart
            intSelLength = Me.txt_ 数量 .SelectionLength
            Me.txt_ 数量 .Text = Me.txt_ 数量 .Text.Substring(0, intSelStart) + "." + Me.txt_ 数量 .Text.Substring(intSelStart + intSelLength, Me.txt_ 数量 .Text.Length - intSelStart - intSelLength)
            Me.txt_ 数量 .SelectionStart = intSelStart + 1
            e.Handled = True
        End If
    End Sub
 
 
三. WINDOWS CE
1.       环境
本次开发使用的是 vs.net2005 中的 vb.net ,虽然 wince 也使用了相同的 frameWork 类库,但支持的功能比较少,很多功能不能实现,另外 api 也不相同,比如 ”kernel32.dll” 就没有
2.       缺陷及解决方法。
        .net
I.       键盘事件中, e.KeyChar 等属性为只读,使得更改键盘输入非常困难,并且没有 SendKey 类。
II.    控件没有 imeMode 属性
III.                            没有 dataGridView, 只有 dataGrid 。可以再属性栏中的 TableStyles 中添加列及绑定
IV.    textBox 内容进行对齐时,必须将 multiply 属性变为 true, 否则不起作用。
3.      
       InputPanel wince 专用类,用来控制输入法类别
    For Each im In InputPanel1.InputMethods
        If im.Name = “ キーボード ” Then
            InputPanel1.CurrentInputMethod = im
        End If
    Next im
   SetInputMode 可以改变 textBox 的输入法,如智能,微软切换
InputModeEditor.SetInputMode(Me.TextBox1, InputMode.AlphaABC)
       利用 api 实现对目录有无的查找
I.       声明构造体
    Public Structure FILETIME
        Dim dwLowDateTime As Long
        Dim dwHighDateTime As Long
    End Structure
    Public Structure WIN32_FIND_DATA
        Dim dwFileAttributes As Integer
        Dim ftCreationTime As FILETIME
        Dim ftLastAccessTime As FILETIME
        Dim ftLastWriteTime As FILETIME
        Dim nFileSizeHigh As Integer
        Dim nFileSizeLow As Integer
        Dim dwReserved0 As Integer
        Dim dwReserved1 As Integer
        Public cFileName As String
        Public cAlternate As String
    End Structure
II.    声明 api 函数
    Public Declare Function FindFirstFile Lib "Coredll" (ByVal lpFileName As String, ByRef lpFindFileData As WIN32_FIND_DATA) As Integer
    Public Declare Function FindClose Lib "Coredll" (ByVal hFindFile As Long) As Integer
III.                            调用 .
        hFind = FindFirstFile( “//toutyuhei/temp/” , FindData)
        FindClose(hFind)
        hFind = -1 就是路径不存在。 其他就是路径存在
创建 之后,再利用 FindNextFile 函数即可实现对文件夹的递归检索。
        利用 api 实现输入法变为英文
I.       声明
    Private Declare Function ImmSimulateHotKey _
    Lib "Coredll" ( _
    ByVal hwnd As IntPtr, _
    ByVal lngHotkey As Int32) As Boolean
 
    Private Const IME_JHOTKEY_CLOSE_OPEN As Integer = &H30
    Private Const IME_CHOTKEY_SHAPE_TOGGLE As Integer = &H11
II.    调用
    ImmSimulateHotKey(Me.Handle, IME_CHOTKEY_SHAPE_TOGGLE)
    ImmSimulateHotKey(Me.Handle, IME_JHOTKEY_CLOSE_OPEN)
 

你可能感兴趣的:(点net)