【发布时间】:2017-01-14 23:23:40
【问题描述】:
我一直在使用 TStack 尝试在我的程序中实现一个简单的撤消/重做功能。这背后的想法是,当一个动作被执行时,程序的当前状态被保存——即被压入堆栈。当用户单击撤消时,程序的最后一个状态被重新加载 - 即从堆栈中弹出。
这个想法的缺陷是堆栈不能永远增长,这意味着在达到容量值后,应该删除最旧的项目(堆栈底部的那些),因为新项目被推到顶部。
Delphi 中的 TStack 对象包含一个容量属性,我假设它会自动执行此“清理”,但是当我使堆栈过载(例如,将 11 个项目推入一个容量为 10 的项目)时,容量会更新以容纳更多项目。
谁能就在这种情况下如何更有效地使用 TStack 向我提供任何建议?我知道另一种方法是使用数组结构,但我喜欢使用堆栈的预期易用性。
问候
【问题讨论】:
-
也许更容易使用队列和队列中最后添加的项目所在的指示符。这样你就可以选择重做。
-
堆栈不适合你。放弃。这是错误的数据结构。您可能正在寻找双端队列。或者只是使用固定长度的数组创建自己的。当数组已满时使用循环索引。
-
抱歉,
Capacity属性是,正如你所发现的,自动增加。他与所有TOrderedList派生集合对象相同。也没有设置强迫它不增长。您可以使用OnNotify事件来检查是否达到了您自己的限制,如果达到,请根据需要更改内容。 -
@TomBrunberg 堆栈不适合从底部移除,那么您将如何执行限制?
-
@DavidHeffernan 你是对的。最好按照您的建议在数组的基础上从头开始构建它。
标签: arrays delphi stack undo redo