百度空间 | 百度首页 
 
文章列表
 
您正在查看 "『visual basic』" 分类下的文章

2008-06-22 12:38

经过几个版本的百度空间溜助手,现在已经酝酿成熟,将在其基础上用Access数据库,然后不断加功能,改名为百度助手。百度助手目前功能大致如下:

  1. 给Hier的百度空间溜言或给Hier发消息,需输入验证码。好友无需输入验证码
  2. 自动注册ID(需要输入验证码)
  3. 自动切换登录ID
  4. 批量修改自己多个ID的密码
  5. 按条件查找Hier
  6. 自动批量加好友,自动批量删除好友
  7. 所留过言的用户都会保存在本地数据库,下次可以根据某些条件在本地读取并分析用户数据
  8. 自动踩空间
  9. 管理溜言和信息内容

这是初步想法,大家有什么想法请溜言。




>>详细内容请看这里
类别:『visual basic』 | 评论(18) | 浏览()
 
2008-05-12 19:14

VB掌管WebBrowser访问MSHTML成员虽然较VC++有限,但对大多数的应用问题不大,而且实现过程也很简单.

一.在VB中使用WebBroswer控件
1.在VB中使用Microsoft Internet Controls做浏览器最方便,但远不能尽WebBrowser之所能. VB能够实现的一些功能如下:
   >掌管WebBrowser控件实现浏览功能
   >自动化IE
   >捕捉IE事件
   >访问DHTML对象模型
但VB不能使用高级掌管接口实现例如关闭Context Menu和控制下载内容等一些功能.有关用VB对IE编程的知识可以参考微软图书<<Microsoft Internet Exploer 5 程序设计(Programmning Internet Explorer 5)>>的相应部分.

2.调用WebBrowser的ExecWB方法能实现一些额外的功能比如CUT,PASTE和SAVEAS等,包含在OLEMDID枚举表中,可以在对象浏览器中看到. 这样我们就可以使WebBrowser具有一些编辑功能,如:
      WebBrowser1.ExecWB OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT
可以把HTML格式的内容粘贴进WebBroser中, 这样就可以方便的实现一个HTML剪贴工具,既拷贝字符,又保留格式,NotePad靠边站吧.

二.访问MSHTML成员

1.用VB访问DHTML模型,实现对HTML元素的操作非常简单易行.引用Micsoft HTML Object Library之后就可以在对象浏览器看到包含的类及其属性方法.其中主要包含以HTML和IHTML为类名前缀的类,这些类给HTML, DHTML以及脚本(VBSCRIPT, JAVASCRIPT)对象提供定义与接口. 在VB中我们可以用这些类来创建用于访问网页元素的对象实例.而且程序编制与写网页脚本一样简单且相似,所以可以用VBSCRIPT和JAVASCRIPT的资料作参考(本人在学习VB的这一应用时学通了DHTML),例如:微软图书<<动态超文本标识语言从入门到精通(Inside Dynamic HTML)>>(一本翻译的很烂的书!). 如果掌握了VC++ 和MFC, MSDN自然也是个好去处, 那儿有关于MSHTML的丰富资料(虽然不能往VB里照搬,我们可以试验VB在许多方面的可行性.)

2.MSHTML类库[Micsoft HTML Object Library]
    访问MSHTML要引用MSHTML组件库.在IE5以前,这个库包含在mshtml.dll中,对IE5来说这个类型库被转移到mshtml.tlb中. 出于某种原因,也许在引用列表里看不到Micsoft HTML Object Library, 不过可以在文件对话框里键入类型库文件名添加引用.

3.一个例子: 在使用搜索引擎(例如MSN)搜索英文网页时, 希望关键字在搜到的条目中高亮或加重显示. 我让WebBrowser导航到搜索页面,然后给所有的关键字都加上了<SPAN>,另外把网页上的超链接都塞进一个列表框. 其中的查找关键字使用IHTMLTEXTRANGE, 它用于对网页上文本的访问.


部件: Microsoft Internet Controls
引用: Micsoft HTML Object Library --- 参看"MSHTML类库"
控件: WebBrowser1; List1; Label1; Command1
属性: Command1.Caption="FIND"


CODE:

Dim webdoc As HTMLDocument
Dim texbody As HTMLBody
Dim Rng As IHTMLTxtRange
' ----------------------------------------------------------------------------------------
Private Sub Command1_Click()
'查找关键字
On Error Resume Next
Set texbody = webdoc.body
Set Rng = texbody.createTextRange()
Do While Rng.findText(Text1.Text) <> False
Rng.Select
Rng.pasteHTML "<span style='background:SILVER'>" + Text1.Text + "</span>"
'
'用IHTMLTxtRange的execCommand方法可以实现加粗等功能,如:
'Rng.execCommand "bold"
'Rng.execCommand "underline"
'Rng.execCommand "italic"
'参看MSDN>DHTML Reference>Command Identifers
'
Rng.collapse False
Loop
Rng.collapse True
End Sub
'---------------------------------------------------------------------------------------------
Private Sub Form_Load()
WebBrowser1.navigate "http://search.msn.com/results.asp?q=wordlist"
Text1.Text = ""
End Sub
'---------------------------------------------------------------------------------------------
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
'将webdoc设置到被WebBrowser的Document属性返回的文挡对象中
Set webdoc = WebBrowser1.document
'提取超链接
''定义元素集
Dim Acollection As IHTMLElementCollection
''设置元素集为所有的Anchor元素,用tags方法引用元素
Set Acollection = webdoc.All.tags("a")
''把Anchor元素转换为相应的字符串表示,用items方法引用元素
For i = 0 To Acollection.length - 1
    List1.AddItem Acollection.Item(i).toString
Next
'length属性返回元素集中元素的个数
Label1.Caption = "Number of links: " + Str$(Acollection.length)
End Sub

类别:『visual basic』 | 评论(5) | 浏览()
 
2008-05-09 16:37
Option Explicit


Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long

Private Const GWL_STYLE = (-16)

Enum TextInputStyles
ES_UPPERCASE = &H8&
ES_LOWERCASE = &H10&
ES_NUMBER = &H2000&
End Enum

Public Sub SetTextInputStyle(hWndTextControl As Long, InputStyle As TextInputStyles)
Dim Style As Long
Style = GetWindowLong(hWndTextControl, GWL_STYLE)
Style = Style Or InputStyle
SetWindowLong hWndTextControl, GWL_STYLE, Style
End Sub

Private Sub optStyle_Click(Index As Integer)
Select Case Index
Case 0: SetTextInputStyle txtTest.hWnd, ES_UPPERCASE
Case 1: SetTextInputStyle txtTest.hWnd, ES_LOWERCASE
Case 2: SetTextInputStyle txtTest.hWnd, ES_NUMBER
End Select
End Sub
类别:『visual basic』 | 评论(3) | 浏览()
 
2008-03-25 18:01

点击进入下载页面>>


[f01] [f02] [f03] [f04] [f05] [f06] [f07] [f08] [f09] [f10]
[f11] [f12] [f13] [f14] [f15] [f16] [f17] [f18] [f19] [f20]
[f21] [f22] [f23] [f24] [f25] [f26] [f27] [f28] [f29] [f30]
[f31] [f32] [f33] [f34] [f35] [f36] [f37] [f38] [f39] [f40]
[f41] [f42] [f43] [f44] [f45] [f46] [f47] [f48] [f49] [f50]

类别:『visual basic』 | 评论(10) | 浏览()
 
2008-03-25 11:59

Option Explicit
Dim WithEvents M_Dom       As MSHTML.HTMLDocument
Private Sub Form_Load()
    Me.WebBrowser1.Navigate (App.Path & "/sad.html")
End Sub

Private Function M_Dom_oncontextmenu() As Boolean
    M_Dom_oncontextmenu = False
End Function

Private Sub Webbrowser1_DownloadComplete()
    Set M_Dom = WebBrowser1.Document
End Sub

类别:『visual basic』 | 评论(0) | 浏览()
 
2008-03-21 23:19
Private Sub Command1_Click()
Text2.Text = URLEncode(Text1.Text)
End Sub


Public Function URLEncode(ByRef strURL As String) As String
Dim I As Long
Dim tempStr As String
For I = 1 To Len(strURL)
If Asc(Mid(strURL, I, 1)) < 0 Then
tempStr = "%" & Right(CStr(Hex(Asc(Mid(strURL, I, 1)))), 2)
tempStr = "%" & Left(CStr(Hex(Asc(Mid(strURL, I, 1)))), Len(CStr(Hex(Asc(Mid(strURL, I, 1))))) - 2) & tempStr
URLEncode = URLEncode & tempStr
ElseIf (Asc(Mid(strURL, I, 1)) >= 65 And Asc(Mid(strURL, I, 1)) <= 90) Or (Asc(Mid(strURL, I, 1)) >= 97 And Asc(Mid(strURL, I, 1)) <= 122) Then
URLEncode = URLEncode & Mid(strURL, I, 1)
Else
URLEncode = URLEncode & "%" & Hex(Asc(Mid(strURL, I, 1)))
End If
Next
End Function

Public Function URLDecode(ByRef strURL As String) As String
Dim I As Long

If InStr(strURL, "%") = 0 Then URLDecode = strURL: Exit Function

For I = 1 To Len(strURL)
If Mid(strURL, I, 1) = "%" Then
If Val("&H" & Mid(strURL, I + 1, 2)) > 127 Then
URLDecode = URLDecode & Chr(Val("&H" & Mid(strURL, I + 1, 2) & Mid(strURL, I + 4, 2)))
I = I + 5
Else
URLDecode = URLDecode & Chr(Val("&H" & Mid(strURL, I + 1, 2)))
I = I + 2
End If
Else
URLDecode = URLDecode & Mid(strURL, I, 1)
End If
Next
End Function

Private Sub Command2_Click()
Text3.Text = URLDecode(Text2.Text)
End Sub

Private Sub Form_Load()
Text1.Text = "微迈互联"
End Sub  
类别:『visual basic』 | 评论(4) | 浏览()
 
2008-03-01 16:59

有些软件如果你不输入正确的注册吗,那该死的“下一步”按钮就一直disable。这个disable按钮使用WindowFromPoint, FindWindowEx均无法得到.

不过,使用EnumChildWindowsGetWindow去可以枚举到每一个窗口中的所有控件,包括disabled的控件,找到了句柄,我们就可以操作了

       测试环境:WINXP+VB6

具体的API函数请参考MSDN.

新建工程,在form中任意添加两个按钮,两个文本框。其中按钮2Enabled属性为false

formCaption设为激活程序的disabled的按钮”.

编译后,运行。

1. 我们先看看使用GetWindow枚举句柄的

我们先用FindWindow找到form窗口,然后找到窗口中所有的子控件句柄,然后使用EnableWindow函数激活

添加1个按钮,2list控件。

Option Explicit

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long

Private Declare Function EnableWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal fEnable As Long) As Long

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long

Const GW_CHILD = 5

Const GW_HWNDNEXT = 2

Const WM_GETTEXT = &HD

Const WM_ENABLE As Long = &HA

Private Sub Command2_Click()

Dim tWnd As Long

Dim bWnd As Long

Dim lpClassName As String

Dim RetVal As Long

Dim i As Integer

Dim mName As String

tWnd = FindWindow(vbNullString, "激活程序的disabled的按钮")

bWnd = GetWindow(tWnd, GW_CHILD)

Do While bWnd <> 0

lpClassName = Space(256)

这里得到类名主要是为了可以看出bWnd所对应的控件

RetVal = GetClassName(bWnd, lpClassName, 256)

i = InStr(1, lpClassName, Chr(0))

mName = Left(lpClassName, i - 1)

List1.AddItem bWnd & "   " & mName

;list2主要是为了方便操作

List2.AddItem bWnd

继续寻找下一个控件

bWnd = GetWindow(bWnd, GW_HWNDNEXT)

Loop

End Sub

单击要激活的句柄

Private Sub List2_Click()

EnableWindow List2.List(List2.ListIndex), True

End Sub

好了,运行后,点击按钮,窗口中所有的控件句柄填充到列表框中,然后点击列表框,可以发现disabled的按钮被激活,可以运行了

2. 使用EnumChildWindows来枚举

函数功能:为指定的父窗口枚举子窗口

Private Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

【参数表】

hWndParent ----- Long,欲枚举子窗口的父窗口的句柄

lpEnumFunc ----- Long,为每个子窗口调用的函数的指针。用AddressOf运算符获得函数在一个标准模块中的地址

代码如下:

窗口

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function EnableWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal fEnable As Long) As Long

Private Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Const WM_ENABLE As Long = &HA

Private Sub Command1_Click()

Dim twnd As Long

twnd = FindWindow(vbNullString, "激活程序的disabled的按钮")

EnumChildWindows twnd, AddressOf EnumChildProc, ByVal 0&

End Sub

Private Sub List1_Click()

EnableWindow List1.List(List1.ListIndex), True

End Sub

模块

Option Explicit

Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long

   

    Form1.List1.AddItem hwnd

    '继续枚举

    EnumChildProc = 1

End Function

好了,运行后,点击按钮,窗口中所有的控件句柄填充到列表框中,然后点击列表框,可以发现disabled的按钮被激活,可以运行了


来源:龙卷风.NET的专栏

类别:『visual basic』 | 评论(2) | 浏览()
 
2008-02-29 19:10

您查看的问题已经转移到

http://vicmiao.com/html/y2008/452.html

类别:『visual basic』 | 评论(1) | 浏览()
 
2008-02-29 18:51

本文介绍了三层结构应用程序的概念和优点,并结合一个实例介绍了如何建立三层结构的asp应用程序。


一、两层结构的asp应用有何缺点
  在browser/server 应用程序开发领域,微软公司的iis/asp以其强大的功能,良好的扩展能力,及与其它微软产品的一致性,迅速地流行起来。它能使一个具有vb/vc经验的程序员,很快地成为一个web程序员,开发出看上去非常专业的应用。但是,asp有一个天生的缺点,就是asp代码和html代码是混在一起的,asp程序员既需要考虑与数据库打交道,需要关心如何与html配合,有时还需要用asp直接生成html代码。其结果是,当程序逻辑足够复杂时,.asp源文件非常长;而且,无论客户提出用户界面的改变,还是商业逻辑的改变(比如,在考试系统中,&quot;合格&quot;的标准可能从达到60分就算合格,改为进入前100名才算合格),都需要对.asp文件进行改动,而商业逻辑的改变,很可能需要改动很多文件。


二、三层结构的概念
  在传统的client / server应用中,也存在着上述同样的问题,多层结构的应用正是在对c/s 结构的总结基础上产生的,并且也已经扩展到了b/s应用开发领域。 即将应用划分为三层(可以有更多层,但三层最常见): 用户界面层,商业逻辑层,数据库层。 用户界面层负责处理用户的输入和向用户的输出,但并不负责解释其含义(出于效率的考虑,它可能在向上传输用户输入前进行合法性验证),这一层通常用前端工具(vb,vc,asp等)开发;商业逻辑层是上下两层的纽带,它建立实际的数据库连接,根据用户的请求生成sql语句检索或更新数据库,并把结果返回给客户端,这一层通常以动态链接库的形式存在并注册到服务器的注册簿(registry)中,它与客户端通讯的接口符合某一特定的组件标准(如com,corba),可以用任何支持这种标准的工具开发;数据库层负责实际的数据存储和检索。 有了这样的结构,上面的问题迎刃而解:还是以考试系统中的合格标准为例,在客户端所有需要显示合格人员名单的地方,调用这样一个函数getqualifiedlist,至于这个函数如何编写,如何与数据库打交道,以至访问的是何种数据库都与其无关(你一定有过这样的经历,在一种数据库系统上运行得很好的sql语句,有时换到另一种数据库系统上必须加以修改); 在中间层dll中实现这个getqualifiedlist函数,如果用户对&quot;合格&quot;的定义变了,只需要修改这个函数就可以了,只要此函数的入口参数和返回内容不变,在客户端不需作任何改动。在这里,我们看到了面向对象编程的特性之一封装性的优点,而这一点在开发大型应用时尤其有用--我们可以把开发人员分成两组,一组负责开发界面层,另一组负责开发商业逻辑层,双方只要按照事先商定的函数接口,并行地开发就可以,而不必向从前那样,后面的工作必须等前面的工作完成后才能开始。当然,这样的开发模式需要很好的项目协调和文档作支持。


  你也许会问,如果我把这些函数些在一个单独的文件中,再在需要调用的地方把它包含进来,不是同样能达到目的吗? 第一,这种方法效率不高,无论你把这些函数分散到多少个文件中,当你需要调用其中一个时,总会包含进一些实际上并不需要的函数,这无疑加重了服务器的负担,对服务器性能要求较高的web应用尤其如此。而dll只在需要时才调入内存且只调入需要的函数,并且多个应用程序实例可以共享同一个dll实例;第二,设想一个员工,有20个属性(工号,姓名,年龄,性别......),现在给定某工号,要求返回此员工所有信息。此时如果单纯用函数,只能定义20个全局变量,在函数中改变这些变量值,或者定义一个有20个传参(by reference)参数的函数。显然,第一种方法很麻烦而一旦增加一个属性后一种方法就需要更改函数接口。而在一个对象里,既包含成员方法(即函数和过程),也包括成员属性。如果我们采用对象的方法,则在函数中只需要改变对象的属性,在函数外可以直接引用改变了的对象属性值。这种方法有些类似第一种方法,但1.属性值无需在函数外逐一说明;2.这些属性值只属于对象,与对象无关的代码不会无意地改变属性值;3.一旦对象被释放,这些值会被一起释放。


三、如何开发三层结构的asp应用程序
  asp具有良好的扩充性,我们访问数据库时,采用的时ado对象,访问文件时,采用的是文件系统对象(fso),其实这时程序已经是三层结构的应用程序了,只不过由于是利用内置的对象而为意识到罢了。这些对象都遵循com/activex接口,因此我们自己开发的对象也要遵循这个接口。下面,我们就以上文提到的&quot;合格& quot;标准为例,演示如何创建自己的三层结构的asp应用。


  1。在数据库系统中建立如下数据库表:


    employee: emplid char (5) not null,
          name  char (10) not null,
          gender char (1) not null,
          score   int not null
  此表存储员工信息和考试成绩,为简单起见,这里只包含工号,姓名和性别三项,并且只有一门考试,emplid为主键。


  2。建立动态链接库
  启动vb(这里以vb为例,你可以用你喜欢的任何支持activex接口的开发工具开发),新建一工程,工程类型为activex dll。在工程中新建一个类,取名为employee。你可以class builder可视化的向类中填加属性和方法,也可以直接手工编辑。首先填加emplid属性如下:
  private msemplid as string
  property let emplid(semplid as string)
   msemplid=semplid
  end property
  property get emplid() as string
   emplid=msemplid
  end property


  一般地讲,每一个属性都应该有property let和property get两个方法,它们分别当向属性赋值和读取属性值时被调用。如果某个属性只被赋值而从不被读取(这种情况多发生在对应数据库表的主键的属性上),则property get方法可以省略。property let方法不能省略。你可以仿照上面的程序再建立name,gender和score三个属性。然后创建如下方法:


  public sub create(emplid as string)
  dim conn as new connection
  dim rs as new recordset
  dim sql as string
  &quot;suppose that you create a dsn in the control panel, the connectionstring property
  &quot;can also be dsn-less string
  conn.connectionstring=&quot;dsn=dsnname;uid=username;password=pwd&quot;
  conn.open
  sql=&quot;select * from employee where emplid=&quot;&quot; & emplid & &quot;&quot;&quot;
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     msemplid=trim(.fields(&quot;emplid&quot;))
     msname=trim(.fields(&quot;name&quot;))
     msgender=trim(.fields(&quot;gender&quot;))
     msscore=.fields(&quot;score&quot;)
   end if
   .close
  end with
  set rs=nothing
  conn.close
  set conn=nothing
  end sub
  这里根据emplid创建employee对象,注意数据库中的值是赋给三个私有变量,而不是直接赋值给属性,如果你单步调试就会发现,给msemplid赋值会调用property let emplid,也就是给属性赋值。
  下面我们再创建一个类employees,并填加如下方法:
  private colqualifiedlist as new collection
  private mncurrentindex as integer
  public sub getqualifiedlist()
  dim conn as new connection
  dim rs as new recordset
  dim sql as string
  &quot;suppose that you create a dsn in the control panel, the connectionstring property
  &quot;can also be dsn-less string
  conn.connectionstring=&quot;dsn=dsnname;uid=username;password=pwd&quot;
  conn.open
  sql=&quot;select emplid from employee where score>=60 order by score desc&quot;
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     do while not .eof
       dim oemployee as new employee
       oemployee.create trim(.fields(&quot;emplid&quot;))
       colqualifiedlist.add oemployee
       set oemployee=nothing
     loop
   end if
   .close
  end with
  set rs=nothing
  conn.close
  set conn=nothing
  end sub
  首先请注意vb中创建类实例的语法dim oemployee as new employee,后面会看到,在asp中创建类实例的语法是不同的。这个方法检索成绩大于等于60的员工工号,并据此创建一个employee对象,再将此对象加入私有的集合对象中。下面两个函数遍历集合中的元素:
  public function getfirst() as employee
   if colqualifiedlist.count>0 then
     mncurrentindex=1
     set getfirst=colqualifiedlist.item(1)
   else
     set getfirst=nothing
   end if
  end function
  public function getnext() as employee
   mncurrentindex=mncurrentindex+1
   if mncurrentindex>colqualifiedlist.count then
     set getnext=nothing
   else
     set getnext=colqualifiedlist.item(mncurrentindex)
   end if
  end function
  也许你会说,为何不把集合声明public,这样在asp中不是可以直接引用吗?确实,这样也行得通,编程实现起来也更简单些,但是,这样做破坏了封装性原则。因为数据以何格式存储完全是商业逻辑层的事,与用户界面层无关,假设有一天你因为每种原因放弃了用集合来存储数据的设计,而改用数组或记录集(recordset)来存储,那你只需要修改getfirst和 getnext两个函数,用户界面层完全无需修改。
  至此类文件创建完毕,将工程文件存为 test.vbp,选file菜单下的make test.dll选项将其编译。
  3.注册动态链接库
  启动web server 上的microsoft transaction server (start--windows nt optionpack4--inte.net information server--inte.net service manager),展开microsoft transaction server--computer--my computer--package installed,点鼠标右键选new--package--create empty package,输入包名test(这里test是任选的名字,不一定要与dll同名),ok-interactive user-the current logon user--finish。双击test--component,右键选component-new-component-install new component(s)-- add file,选择你刚编译好的dll文件,mts会发现dll中有两个类employee和employees。至此dll注册完毕。


  4.编写asp程序
  <html><body>
  <p>qualified employee list</p>
  <table border=1 cellspacing=0 cellpadding=0>
  <tr>
   <td>employee id</td>
   <td>name</td>
   <td>gender</td>
   <td>score</td>
  </tr>
  <%
   set oemployees=server.createobject(&quot;test.employees&quot;)
   oemployees.getqualifiedlist
   set oemployee=oemployees.getfirst()
   do while not oemployee is nothing
  %>
  <tr>
   <td><%=oemployee.emplid%></td>
   <td><%=oemployee.name%></td>
   <td><%=oemployee.gender%></td>
   <td><%=oemployee.score%></td>
  </tr>
  <%
     set oemployee=oemployees.getnext()
   loop
  %>
  </table>
  </body></html>
  注意在asp中创建类实例的语法set oemployees=server.createobject(&quot;test.employees&quot;),其中 test是dll的名字,employees是类的名字; 当然,如果一个函数的返回值是一个对象,类似set oemployee=oemployees.getfirst()这样的语法也是可以的。
  至此,一个完整的三层结构的应用程序已经完成了,让我们看以下,如果把&quot;合格&quot;的定义改为:只有成绩进入前100名才算合格,程序需要做那些修改。事实上,如果你的数据库系统是sql server,你只需把sql语句改为:
  sql=&quot;select top 100 emplid from employee order by score desc&quot; 就已经可以了,即使为了跨数据库系统的兼容性,我们也只需要对getqualifiedlist做如下修改:


  ......
  sql=&quot;select emplid from employee order by score desc&quot;
  with rs
   .open sql,conn,1,3
   if .eof and .bof then
     exit sub
   else
     i=1
     do while (not .eof) and (i<=100)
       dim oemployee as new employee
       oemployee.create trim(.fields(&quot;emplid&quot;))
       colqualifiedlist.add oemployee
       set oemployee=nothing
       i=i+1
     loop
   end if
   .close
  end with
  ...


  然后把dll重新编译,注册就可以了,asp程序完全不必修改。


四.一些说明和注意事项
  1. 由于这个例子比较简单,在employee类中可以没有create方法,而在employees类中将员工的所有信息(工号,姓名,性别,成绩)都读出来并将其赋给employee对象对应的属性。但在实际应用中,当employee对象的属性增多,或表的数量增多,表之间关系变复杂时,还是本文所示的方法更有效,代码重用的机会更大。


  2. 当dll被修改后,在mts中只能将其删除后重新注册,因为每次重新编译后在注册表中对象的id值都将重新生成。


  3. 从asp中调用带参数的类方法和函数时,所有的变量参数一定要用相应的类型转换函数转换后再传入,否则会引起类型不匹配错误,因为vbscript中只有variant类型,它不能自动转换成其它类型。例如,有如下的函数定义:


  public function fun1(p1 as string,p2 as integer) as integer
  end function
  在asp程序中应如下调用:
  <%
   p1=obj.property1 &quot; property1 is a string property
   p2=obj.property2 &quot;property2 is an integer property
   a=obj.fun1(cstr(p1),cint(p2))
   a=obj.fun1(&quot;aaa&quot;,10) &quot; constant parameter need not be changed
  %>


  而下面的两种写法是错误的:


  <%
   p1=obj.property1 &quot; property1 is a string property
   p2=obj.property2 &quot;property2 is an integer property
   a=obj.fun1(p1,p2) &quot; incorrect,p1 and p2 are variant variables
   p1=cstr(p1)
   p2=cint(p2)
   a=obj.fun1(p1,p2) &quot; still incorrect
  %>
  这里第二种写法仍然是错误的,即使经过了类型转换,p1和p2仍然是variant变量。在vbscript中,数据类型和类型转换函数只在表达式运算中起作用,变量只有variant一种类型。


结束语
  以上对多层结构的理论和实践进行了一番探讨,希望能对您的开发有所帮助。这里还有一个问题,即类和类的成员该如何设计。这既涉及面向对象编程的理论,也需要一定的实践经验。请参考相关的oop理论书籍并在实践中不断总结,相信您一定能设计出自己的完美的多层结构的应用程序。

来源:丰搜网

类别:『visual basic』 | 评论(0) | 浏览()
 
2008-02-29 09:52

'当树中设置有图片,并一边加节点,一边选中,结果选中操作不实现

'请先引用Microsoft Windows Common Controls 6.0 或5.0
'加ImageList1,加上一张图
'测试程序
Option Explicit
Dim arr_tmp(3)
Private Sub Form_Load()
arr_tmp(0) = "001"
arr_tmp(1) = "002"
arr_tmp(2) = "003"
arr_tmp(3) = "004"

Dim i As Integer
With Me.TreeView1(0)
    .Checkboxes = True
    For i = 0 To 3
    .Nodes.Add , , "f" & arr_tmp(i), arr_tmp(i), 1 '这里是图
    .Nodes("f" & arr_tmp(i)).Checked = True ‘<-------这个操作没有实现
    Next i
End With
End Sub

类别:『visual basic』 | 评论(0) | 浏览()
 
     
 
 
文章存档
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     
 
最新文章评论
   

踩踩踩踩踩踩踩踩踩 ......................................
 

 

挺好的
 
 

哈,太好了,在你这里找到宝贝了,正需要这个呢!拿走了。。。
 
     


©2009 Baidu