我开始学习Delphi。因此,我决定从头开始编写像MS Excel这样的应用程序。在新的Form1中,我确实放置了一个仅包含1页的TPageControl组件。在该页面中,我确实放置了一个TAdvStringGrid和一个TPanel,其中包含一些按钮(button1,button2)和一个Popup1菜单,用于定义网格上的某些操作,例如复制单元格,复制行,删除行等。对于该StringGrid,我定义了一些属性,例如颜色,字体等。我在主窗体中添加了带有按钮的工具栏,以便向PageControl添加更多页面。该按钮的OnClick方法定义了两个操作:
1)将新的Page2添加到PageControl,然后
2)在新创建的Page2中添加新的StringGrid。
在Tpagecontrol的新页中创建的新的(运行时定义的)StringGrid应该继承(获取,复制,克隆,重复)设计时在第一页中已经定义的StringGrid父级的属性和方法,并且应该能够调用PopUp1菜单就像StringGrid父级一样。我们如何做到这一点?
一开始,我以为我应该使用assing()复制StringGrid属性,但是使用这种方法时,右键单击新的StringGrid ...和按钮(button1和button2)时,弹出菜单不会弹出。的Form1只能与第一个StringGrid一起使用,而不能与新添加的StringGrid一起使用。我确实读过某个地方,以解决此问题,我可以使用读写TMemoryStream复制StringGrid组件(将父stringgrid保存到内存流中,创建一个新的stringgrid,然后将该内存流读取到新创建的stringgrid中),所以我做了,但是当程序执行此组件克隆方法时,出现运行时错误。 :-(
我确实仔细检查了帮助。在该主题上找不到任何内容。似乎没有任何Delphi组件库或第三方组件可以应付此类任务。有人可以帮忙吗? :o)
最佳答案
我会使用tabcontrol而不是pagecontrol。这样,您最终将获得多个选项卡,但只有一个页面和一个网格。然后,我将建立某种数据结构以保留所有单元格信息,并将此结构呈现给网格。这样,我可以拥有多个结构,并让活动选项卡确定要呈现的结构。您还将最终在gui和逻辑之间造成松散的耦合,从而使以后更轻松地进行更改。例如。如果您需要将其他电子表格中的某些值引入当前电子表格中的单元格,则可以加载结构并选择所需的值。完全不需要为第二个电子表格创建任何GUI。
对于3.party组件,我将推荐TMS FlexCell和TAdvSpreadGrid。这将为您提供大部分需求。