重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
因为你的代码都是通过新的实例来调用的,所以无法获取A变量的值。
创新互联建站专业为企业提供茶陵网站建设、茶陵做网站、茶陵网站设计、茶陵网站制作等企业网站建设、网页设计与制作、茶陵企业网站模板建站服务,十年茶陵做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
解决方法。
A
form1中, 直接使用 form2.show(); 不创建新的实例。
form2中,直接用 textbox1.text = form1.a ;也不要创建form1的实例。
B
form1调用form2的时间,将本身的实例传递给Form2 .
form1中, dim frm2 as new form2(me);(分号代表空行)frm2.show()
form2中,添加SUB NEW的方法,来接受form1的实例,然后再调用
感觉问题出在
Form2.Show() '启动倒计时显示窗口
这一句上。
这一句应该只需要执行一次就行了。
把它放在timer中,多次调用,造成假死。
如果在VB程序内部,请使用窗体对象的名称来访问它。即
form1,
form2。
它的成员函数可以通过成员访问符
.
来访问。
如果窗口是其它程序创建,
使用
API
FindWindow
获得句柄,向其发送消息,
或直接用句柄重定位窗口过程
SetWindowLong(hwnd,GWL_WNDPROC,你在自己定义的窗口过程),
可以对其完全控制。
绝对正确。
Imports System.Text
Imports System.Runtime.InteropServices
Public Class Form1
' 相关API函数声明,注释掉的这里没用到,但是也比较常用吧,这些函数的功能都能搜到。
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
Private Delegate Function EnumChildProc(ByVal hWnd As IntPtr, ByVal lParam As Integer) As Boolean
Private Declare Function EnumChildWindows Lib "user32.dll" (ByVal hWndParent As IntPtr, ByVal lpEnumFunc As EnumChildProc, ByVal lParam As Integer) As Boolean
Private Declare Auto Function SendMessage Lib "User32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As String) As Integer
'Private Declare Function CheckDlgButton Lib "user32" Alias "CheckDLGButtonA" (ByVal hDlg As IntPtr, ByVal nIDButton As IntPtr, ByVal wCheck As Integer) As Integer
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As IntPtr, ByVal lpClassName As StringBuilder, ByVal nMaxCount As Integer) As Integer
'Private Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As IntPtr, ByVal lpdwProcessId As Long) As Integer
Private Declare Auto Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLength" (ByVal hwnd As IntPtr) As Integer
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
' 相关消息定义,也有没用到的
Const WM_SETTEXT = HC
Const WM_GETTEXT = HD
'Const WM_SETFOCUS = H7
'Const WM_KILLFOCUS = H8
'Const WM_CLOSE = H10
'Const WM_SYSCOMMAND = H112
'Const SC_CLOSE = HF060
'Const SC_MINIMIZE = HF020
Const BM_GETCHECK = HF0
Const BM_SETCHECK = HF1
Const BM_GETSTATE = HF2
Const BM_SETSTATE = HF3
Const BM_SETSTYLE = HF4
Const BM_CLICK = HF5
'Const BM_GETIMAGE = HF6
'Const BM_SETIMAGE = HF7
Const BST_UNCHECKED = O0
Const BST_CHECKED = O1
Const BST_INDETERMINATE = O2
' 储存窗口句柄
Dim WindowHandle As IntPtr
' 储存两个(或者多个)编辑框句柄
Dim EditHandle As New List(Of IntPtr)
Dim EditWindowsText As List(Of String)
' 储存复选框句柄
Dim CheckHandle As IntPtr = 0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Button1_Click(sender, e)
End Sub
' EnumChildWindows 回调函数,该函数名作为API函数EnumChildWindows 的一个参数
' 该函数实现了枚举各个子窗口,找出编辑框属性的功能
Public Function EnumChildProcC(ByVal hwnd As IntPtr, ByVal lParam As Integer) As Boolean
Dim dwWindowClass As StringBuilder = New StringBuilder(100)
' 获得某一个句柄的类名
GetClassName(hwnd, dwWindowClass, 100)
If dwWindowClass.ToString.Contains("EDIT") Or dwWindowClass.ToString.Contains("Edit") Then ' 类名包含EDIT的为编辑框
EditHandle.Add(hwnd) ' 存储该句柄
End If
' 返回 True 一直枚举完
Return True
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
WindowHandle = FindWindow(vbNullString, "登陆")
If WindowHandle.ToInt32 = 0 Then
MsgBox("未捕获到窗口" + "登陆")
Return
End If
' 枚举所有主窗口的子窗口(控件),枚举时自动调用回调函数,完成编辑框句柄的获取
EnumChildWindows(WindowHandle, AddressOf EnumChildProcC, 0)
' 寻找复选框
CheckHandle = FindWindowEx(WindowHandle, IntPtr.Zero, vbNullString, "记住密码")
Dim str As New StringBuilder
Dim j As Integer = 0
' 对编辑框文本赋值
For j = 0 To EditHandle.Count - 1
SendMessage(EditHandle(j), WM_SETTEXT, 0, "Text")
'GetWindowText(EditHandle(j), str, 20)
'EditWindowsText.Add(Str.ToString)
'Str.Clear()
Next
If EditHandle.Count = 0 Then
MsgBox("未找到输入框!")
End If
If CheckHandle.ToInt32 0 Then
'CheckDlgButton(WindowHandle, id, 1)
' 对复选框进行鼠标单击操作
SendMessage(CheckHandle, BM_CLICK, 0, 0)
'SendMessage(CheckHandle, BM_SETCHECK, True, 0)
End If
End Sub
End Class
在 VB.NET 中,你编好的窗体仅仅是一个类而已,不像 VB6,窗体本身就是一个对象。就是说,如果要显示窗体,你需要将你编的窗体类实例化对一个对象,然后再调用这个对象:
Dim frm As New frmDlg ' 将 frmDlg 窗体类实例化为对象 frmfrm.Show() ' 将实例化的对象显示出来
NullReferenceException表示的是你调用的某一个对象为Null
从你的描述来看,你应该是在Form3里面Show的Form6
我建议你不要一行写太多的代码,这样出错不容易找到问题
你的DataGridView1、CurrentRow、Cells(0)、Value这些都可能为空
你可以先用一个变量保存你选中的单号,而且你可以在出错的时候看到这个单号到底有没有取到,进而确定具体问题
你可以在出错的时候选中这一个对象
然后右键,选择添加监视,或者快速监视来查看这个对象的值以确定它是不是null
你找的出错那一行的代码哪个对象为null,然后再确定问题就好了(一般对象为null都是流程不对或未取到正确的值)
跨窗口传值的话使用公有属性是没有错的,不过一般不直接传整个Grid,而是需要什么传什么;你这里需要单号的话直接设置单号这个属性,然后在showFrom6之前把单号取出来赋值过去就好了