| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1769 人关注过本帖, 1 人收藏
标题:[求助]在VB6中如何撤消(undo)上一步操作
只看楼主 加入收藏
cnliang
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2005-4-1
收藏(1)
 问题点数:0 回复次数:6 
[求助]在VB6中如何撤消(undo)上一步操作
在VB.NET中有UNDO属性,要撤消上一步操作直接myControl.Undo就行了,但vb6.0中好像没有undo属性,请问如果要返回到操作的上一个状态应如何操作? 下面是网络上一篇关于如何undo的文章的节选,但我按它的方法去做却没达到相应的功能,不知问题出在哪里?请前辈们指点! 文章如下: 由于Undo功能是属于文本框控件,你所需要的是向控件发送一个“undo youself”的消息。这一过程可以使用API函数SendMessage来实现。这一函数的声明为:

Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByValhWnd As Long, _ ByValwMsg As Long, ByValwParam As Long, _ lParam As Any) As Long

第一个参数是接受消息的句柄,在本例中为TextBox控件的hWnd属性。 第二个参数是识别消息的数字。为了能够撤消某一操作,通常传递&HC7值,这也是代表着EM_UNDO常量。 第三个和第四个参数可用于某些消息,但在本例中它没有被使用,你可以将它们置为0。 函数返回的值取决于发送的消息。在本例中可以被省略。 为了能真正使用这一技巧,建立一个带有一个窗体的工程,窗体中包含一个TextBox控件和一个Command按钮控件。在Command按钮控件的点击事件程序中添加以下代码行:

SendMessage Text1.hWnd, EM_UNDO, 0&, 0&

在工程中添加一个模块并在模块中添加如下的代码:

Public Const EM_UNDO = &HC7 Public Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" (ByValhWnd As Long, _ ByValwMsg As Long, ByValwParam As Long, _ lParam As Any) As Long

当运行这一工程时,在TextBox控件中输入和编辑文本。可以看到,按钮撤消了最后一步的操作。

搜索更多相关主题的帖子: undo 撤消 
2005-04-05 09:35
griefforyou
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:3336
专家分:0
注 册:2004-4-15
收藏
得分:0 

Private Const EM_UNDO = &H304 Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

Private Sub Command1_Click() SendMessage Text1.hWnd, EM_UNDO, 0&, 0& End Sub 你的API声明错了,Byval hwnd 中间有个空格。


天津网站建设 http://www./
2005-04-05 10:40
cnliang
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2005-4-1
收藏
得分:0 
        谢谢!问题确实是出在这里(小弟经验不足,错误连连
但还有一个问题想请教:
        如果我连续输入字符 "ABCDEFG", 如何编写才能实现一次只删除一个字符,而不是撤消一次后就把整个字符串都删了?

耐心和持久 胜过 激烈和狂热
2005-04-05 10:54
griefforyou
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:3336
专家分:0
注 册:2004-4-15
收藏
得分:0 
你在Word或者Notepad中试一下可不可以,再来问。

天津网站建设 http://www./
2005-04-05 10:56
griefforyou
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:3336
专家分:0
注 册:2004-4-15
收藏
得分:0 
'单字符Undo/Redo代码
'By:Griefforyou

[QUOTE]Option Explicit
Dim OldText As String, OldSelStart As Long, OldSelLength As Long
Dim UndoArray() As String, MyChangeFlag As Boolean
Dim UndoStep As Long
Private Sub Command1_Click()
    Undo Text1
End Sub
Private Sub Command2_Click()
    Redo Text1
End Sub
Private Sub Form_Load()
    Init Text1
    Command1.Caption = "Undo"
    Command2.Caption = "Redo"
End Sub
Private Sub Init(Obj As TextBox)
    ReDim UndoArray(0) As String
    OldText = Obj.Text
    OldSelStart = Obj.SelStart
    OldSelLength = Obj.SelLength
    UndoArray(0) = OldText
    UndoStep = 0
End Sub
Private Sub Change(Obj As TextBox)
    If MyChangeFlag = False Then
        ReDim Preserve UndoArray(UBound(UndoArray) + 1) As String
        UndoArray(UBound(UndoArray)) = Obj.Text
        UndoStep = UBound(UndoArray)
        Debug.Print UndoStep & " " & Text1.Text
    End If
End Sub
Private Sub Undo(Obj As TextBox)
    If UndoStep > 0 Then
        MyChangeFlag = True
        UndoStep = UndoStep - 1
        Obj.Text = UndoArray(UndoStep)
        MyChangeFlag = False
    End If
End Sub
Private Sub Redo(Obj As TextBox)
    If UndoStep < UBound(UndoArray) Then
        MyChangeFlag = True
        UndoStep = UndoStep + 1
        Obj.Text = UndoArray(UndoStep)
        MyChangeFlag = False
    End If
End Sub
Private Sub Text1_Change()
    Call Change(Text1)
End Sub[/QUOTE]

天津网站建设 http://www./
2005-04-05 11:12
cnliang
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2005-4-1
收藏
得分:0 
谢谢提供!

[此贴子已经被作者于2005-4-5 11:17:39编辑过]



耐心和持久 胜过 激烈和狂热
2005-04-05 11:15
cnliang
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2005-4-1
收藏
得分:0 
经测试可行,补送全部分数,再次感谢!!!

耐心和持久 胜过 激烈和狂热
2005-04-05 11:40
快速回复:[求助]在VB6中如何撤消(undo)上一步操作
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014190 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved