先说一下项目的特点和开发流程把。使用工具为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)