工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > VB > 正文
在VB6中用命令行为模式控制GUI动作
[文章信息]
作者:陶刚编译
时间:2005-02-17
出处:天极网
责任编辑:方舟
[文章导读]
命令行为模式是我们可以使用的一种简单模式,它在行为概念的具体化和撤销行为方面显得尤其有益
advertisement
热点推荐
· Excel图表向导详解
· 2月16日软件精选 春节文章精彩回顾
· 轻松玩转Excel数据图表
· Win XP系统如何快捷地整理硬盘碎片
· ASP.NET中用healthMonitor属性用法
[正文]

上一页  1 2 3  下一页

  建立GUI

  该程序的GUI由Form1表现,它包含了一个图像(image)控件,在该控件中有一个球的位图。该窗体还包含了一个对象集合,我把这个集合作为先前命令的堆栈。通过把每条命令添加到该集合的末尾,以及从集合末尾弹出命令,我可以相反地跟踪命令的执行过程。从本质上来说,该集合扮演了堆栈的角色。我在命令执行之后压入(push)命令,弹出(pop)命令调用Undo操作。

  为了演示Undo操作,我定义了Edit|Undo菜单和Edit|Rewind操作。Undo从堆栈中弹出一条命令并调用Undo。Rewind弹出所有命令,在每个命令上调用Undo。列表2包含了Form1的代码。

  列表2

Option Explicit

Private stack As Collection
Private Const MOVEMENT_AMOUNT As Integer = 50

Private Sub AboutMenu_Click()
 Const About As String = "Command Pattern Demo" + vbCrLf + _
   "Copyright (c) 2004. All Rights Reserved" + vbCrLf + _
   "Written By Paul Kimmel. pkimmel@softconcepts.com"

 MsgBox About, vbInformation + vbOKOnly, "About"

End Sub

Private Sub ExitMenu_Click()
 End
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 Select Case KeyCode
  Case vbKeyBack
   UndoCommand
  Case vbKeyLeft
   Call ProcessCommand(New LeftCommand)
  Case vbKeyUp
   Call ProcessCommand(New UpCommand)
  Case vbKeyRight
   Call ProcessCommand(New RightCommand)
  Case vbKeyDown
   Call ProcessCommand(New DownCommand)
 End Select
End Sub

Private Function PopStack() As ICommand
 On Error GoTo Catch
 Debug.Print "Stack count: " & stack.Count
 If (stack.Count = 0) Then
  Beep
  Set PopStack = Nothing
  Exit Function
 End If

 Set PopStack = stack.Item(stack.Count)
 Call stack.Remove(stack.Count)
 Exit Function
 Catch:
  Debug.Print Err.Description
  Set PopStack = Nothing
End Function

Private Sub PushStack(ByVal command As ICommand)
 On Error GoTo Catch
 Call stack.Add(command)
 Debug.Print "Stack count: " & stack.Count
 Exit Sub
 Catch:
  Debug.Print Err.Description
End Sub

Public Sub UndoCommand()
 Dim command As ICommand
 Set command = PopStack()
 If (command Is Nothing) Then Exit Sub
 command.Undo
End Sub

Private Sub ProcessCommand(ByVal command As ICommand)
 Set command.Form = Me
 command.Execute
 Call PushStack(command)
End Sub

Public Sub MoveDown()
 Debug.Print "Moving Down"
 If (Image1.Top > Height) Then
  Image1.Top = 0 - Image1.Height + MOVEMENT_AMOUNT
 Else
  Image1.Top = Image1.Top + MOVEMENT_AMOUNT
 End If
End Sub

Public Sub MoveUp()
 Debug.Print "Moving Up"
 If (Image1.Top + Image1.Height < 0) Then
  Image1.Top = Height - MOVEMENT_AMOUNT
 Else
  Image1.Top = Image1.Top - MOVEMENT_AMOUNT
 End If
End Sub

Public Sub MoveLeft()
 Debug.Print "Moving Left"
 If (Image1.Left + Image1.Width < 0) Then
  Image1.Left = Width - MOVEMENT_AMOUNT
 Else
  Image1.Left = Image1.Left - MOVEMENT_AMOUNT
 End If
End Sub

Public Sub MoveRight()
 Debug.Print "Moving Right"
 If (Image1.Left > Width) Then
  Image1.Left = 0 - Image1.Width + MOVEMENT_AMOUNT
 Else
  Image1.Left = Image1.Left + MOVEMENT_AMOUNT
 End If
End Sub

Private Sub Form_Load()
 Set stack = New Collection
End Sub

Private Sub RewindMenu_Click()
 While stack.Count > 0
  UndoCommand
 Wend
End Sub

Private Sub UndoMenu_Click()
 Call UndoCommand
End Sub

  下一步,我通过把窗体的KeyPreview属性设置为True并建立与该按键相关的命令对象,把有关的方向箭头按键与每条命令关联起来。例如vbKeyUp应该建立一个UpCommand对象。接着我处理这些命令(我也可以使用工厂创建型模式把命令对象的创建过程移动到命令类的内部)。

  ProcessCommand被定义为把Form1的指针赋予某个命令的Form属性、执行该命令并把该命令压入集合堆栈中。你没有必要实现一个堆栈,但是如果你没有跟踪命令执行的次序,那么使用Undo操作是不可能的。

  图1显示的UML模型显示了示例程序中不同的类之间的关系。


图1:命令中的类:描述我们的命令模式中关系的UML类图表


上一页  1 2 3  下一页

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • VB设计Win2000下截获IP数据包程序
  • 真没想到VB也可以这样用之VB能做什么
  • 用VB编写异步多线程下载程序
  • 适合Visual Basic初学者的10个小技巧
  • 用VB实现实时曲线的绘制和保存
  • 中国IT企业走进欧盟 搭第六框架计划直通车
  • 美邦银行用户注意 警惕新型“钓鱼”邮件
  • 微软三年时间磨出新IE 具有更强大安全性能
  • 高清碟机标准打内战 HDV将状告EVD恶性竞争
  • 正版网上银行为何不安全 客户泄密银行无责任
  • 惠普铁娘子悲壮退场 未能成功扮演拯救者
  • 网上乱用人民币图样是违规行为 最高罚3万
  • “伟哥”要正名 微软携手辉瑞打击假“伟哥”
  • Advertisement