一步穷
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:4156回复:15

我们经常见的编辑菜单中"撤消"与"恢复"是如何工作的?

楼主#
更多 发布于:2004-07-29 17:18
<P>如题所说.小弟现在做一个鼠标操作的东东.要实现撤消与恢复.不知从何下手.望各位高人给个思路.对象是C#与MO2.3下的加点,移点或删点等操作.谢谢!</P>
喜欢0 评分0
一步穷
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
1楼#
发布于:2004-08-13 08:30
得到很大的启发,多谢GIS.
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
2楼#
发布于:2004-08-12 12:37
<TABLE fixed; WORD-BREAK: break-all" cellSpacing=0 cellPadding=0 width="90%" border=0><TR><TD class=oblog_t_4><FONT color=#2a2af8 size=3>今天讲讲利用MO实现编辑过程中的Undo、Redo的一种思路,利用临时图层实现图层编辑过程中的Undo,Redo。今天举得例子比较简单,就是增添要素和删除要素的撤销和重做(假设编辑过程中点线面图层每类只有一个)。</FONT></TD></TR><TR><TD><TABLE cellSpacing=0 cellPadding=0 width="100%" border=0><TR><TD><DIV align=right></DIV></TD></TR></TABLE><P><FONT color=#444444><b>1. 建立临时图层</b></FONT></P><P><FONT color=#444444>临时图层是在每次程序加载的时候创建,利用shapefile文件,包含4个字段,分别表示操作标识,操作流水号,关键字段,字段内容,当然为了实现点线面各个图层的操作,需要创建3个shp。</FONT></P><P><FONT color=#444444><b>2.在添加和删除要素后</b></FONT></P><P><FONT color=#444444>系统中当前流水号增加1,向临时图层增加或者删除这一次操作影响的要素以及他们的字段信息,当然操作流水号也需要增添,操作标识标识这次的操作类型,也需要添加。</FONT></P><P><FONT color=#444444><b>3.在进行一些操作后Undo</b></FONT></P><P><FONT color=#444444>有了以上信息,在执行操作的过程中就可以Undo了,比如我在一次操作中增添了两个点、一条线,那么在Undo的时候就先从临时图层中通过当前操作流水号分别查询出添加的记录,这些记录的操作标识应该是“<EM>添加操作</EM>”,然后通过关键字段,在实际图层中查找,删除相应的要素。同时系统的操作流水号-1。</FONT></P><P><FONT color=#444444><b>4.我现在要Redo了</b></FONT></P><P><FONT color=#444444>如果上面的Undo错了,我需要恢复删除的要素,那么就需要首先将系统中当前流水号增加1,然后从临时图层中查询当前操作流水号所影响的记录,然后由于操作标识是“<EM>添加操作</EM>”,所以我们将这些要素和相应的字段信息进行分解,添加到对应的图层。</FONT></P><P><FONT color=#444444><b>5.我在Undo操作后执行添加和删除操作拉</b></FONT></P><P><FONT color=#444444>这个时候首先需要从流水表删除操作流水号>系统当前流水号的记录,然后同2进行操作。</FONT></P></TD></TR></TABLE>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
sharkkyan
路人甲
路人甲
  • 注册日期2003-09-19
  • 发帖数58
  • QQ
  • 铜币210枚
  • 威望0点
  • 贡献值0点
  • 银元0个
3楼#
发布于:2004-08-12 12:25
<img src="images/post/smile/dvbbs/em05.gif" /><img src="images/post/smile/dvbbs/em05.gif" />
http://geoexplore.blog.hexun.com/ qq: 657824310 电子邮箱:jayon@126.com
举报 回复(0) 喜欢(0)     评分
goodwang
路人甲
路人甲
  • 注册日期2004-08-12
  • 发帖数16
  • QQ
  • 铜币113枚
  • 威望0点
  • 贡献值0点
  • 银元0个
4楼#
发布于:2004-08-12 11:32
有点思路,谢谢
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
5楼#
发布于:2004-08-09 15:26
<P>不写代码好象是不行的,需要定义很多变量来记录操作次数和状态等</P><P>Function Redo(map As MapObjects2.map, times As Long)
    If undoNow >= undoTimes Then
    MsgBox "Too big"
    ElseIf undoNow < 0 Then
    MsgBox "Less than zero"
    Else
   Select Case undoType(undoNow)
   Case utMovePoint
    URMovePoint map
   Case utMovePoints
    URMovePoints map
   Case utAddPoint
    URAddPoint map
   Case utAddShape
    URAddShape map
   Case utLineDelPoint
    URLineDelPoint map
   Case utPolygonDelPoint
    URPolygonDelPoint map
   Case utAddLine
    URAddLine map
   Case utMoveLinePoint
    URMoveLinePoint map
   Case utMovePolygonPoint
    URMovePolygonPoint map
   Case utMoveLine
    URMoveLine map
   Case utMovePolygon
    URMovePolygon map
   Case utDelShape
    URDelShape map
   Case utZoom
    URZoom map
   Case utChangeShape
    URChangeShape map
   Case Else
   End Select
    End If
End Function</P>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
一步穷
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
6楼#
发布于:2004-08-09 14:45
版主是论坛上屈指可数的好版主之列的版主.能讲一下大概思路吗?你的属标操作的信息是如何记录的?如果撤消以后又后悔了或者又后悔了咋办呀?如果我也写这么多代码的话,头儿早把我扔垃圾篓了.版主救我!<img src="images/post/smile/dvbbs/em02.gif" />
[此贴子已经被作者于2004-8-9 15:04:53编辑过]
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
7楼#
发布于:2004-08-09 09:21
<P>程序很多,点线面的redo和undo都要写,这里贴上两个函数看看先</P><P>'添加线
Function UAddLine(map As MapObjects2.map, layerNum As Long, Line As MapObjects2.Line)
On Error GoTo exit1
Dim lineNew As New MapObjects2.Line</P><P> Set m_map = map
 
 Dim recs As MapObjects2.Recordset
 Set recs = map.Layers(layerNum).Records
 CopyLine lineNew, Line
 
 pushTypeAStep utAddLine
 pushInt layerNum
 pushObject lineNew
 pushEnd
 
 recs.Edit
 recs.AddNew
 Set recs.Fields("Shape").Value = lineNew
 
 recs.Update
 recs.StopEditing
 
 
 Refresh map
Set lineNew = Nothing
exit1:
End Function</P><P>Private Function URAddLine(map As MapObjects2.map) 'redo
On Error GoTo exit1
Dim typea, layerNum As Long</P><P>Dim Line As MapObjects2.Line</P><P> typea = pipType
 layerNum = pipInt
Set Line = pipObject
 pipEnd</P><P>Dim recs As MapObjects2.Recordset
Set recs = map.Layers(layerNum).Records
 recs.Edit
 recs.AddNew
 Set recs.Fields("Shape").Value = Line
 recs.Update
 recs.StopEditing
 Refresh map
exit1:
End Function</P>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
一步穷
路人甲
路人甲
  • 注册日期2003-12-15
  • 发帖数107
  • QQ
  • 铜币221枚
  • 威望0点
  • 贡献值0点
  • 银元0个
8楼#
发布于:2004-08-09 09:14
多谢!急等!
举报 回复(0) 喜欢(0)     评分
edward22
路人甲
路人甲
  • 注册日期2004-07-01
  • 发帖数121
  • QQ
  • 铜币506枚
  • 威望0点
  • 贡献值0点
  • 银元0个
9楼#
发布于:2004-08-06 08:25
<P>谢谢GIS!</P>
如果你爱他就让他学GIS,如果你恨他就让他学GIS!
举报 回复(0) 喜欢(0)     评分
上一页
游客

返回顶部