多年来,我一直在Delphi中分享多个表单中的图像列表。我在我的应用程序的主要表单上有一个TImageList,然后我有其他形式的组件,我在设计时将Images属性设置为主窗体中的图像列表(例如MyMainForm.MyImageList)。
我遇到的问题是,在主窗体上引用图像列表的那些窗体上随机删除Images属性。
这似乎最近才刚刚开始,但我还没有找到确切的原因。我似乎无法找到一种随意重现问题的方法;它似乎随机发生。我确实注意到它在表单打开时正好发生了。
我最近在Delphi中做过的一件事就是启用了Autosave Project桌面和符号功能。所以现在当我打开这个项目时,它总是会记住哪些表格是开放的。因此,当打开表单时会发生此问题,并且因为它现在重新打开上次打开项目时打开的所有表单,它会更频繁地发生。
我们有一些开发人员在开发这个项目,我们正在使用SVN进行版本控制。启用自动保存项目桌面和符号功能的一个问题是,当我们对项目进行SNV更新时,符号文件可能变为无效(因为我们在版本控制下没有符号文件)。这只会导致Delphi发出错误消息,但除此之外它似乎无害。我们只是重新编译项目并修复了符号文件。
是的,我正在使用Delphi 7。如果您有任何疑问或需要澄清,请发表评论,我会更新问题。
答案 0 :(得分:8)
多年前我遇到了同样的问题。从那时起,我就养成了将几个表单共享的图像列表放到TDataModule上的习惯。然后德尔福不会丢失链接。将非可视组件放在数据模块上还可以减少表单上的设计时间混乱。在运行时,TDataModule在主窗体之前被实例化。
答案 1 :(得分:6)
当我遇到这种类型的行为时,总是因为我打开了“其他”表单而没有在IDE中打开主表单... IDE将尝试解析MyMainForm.MyImageList引用,失败,并且删除引用。
我们通过在代码中手动分配图像列表来解决这个问题(通常在AfterConstruction中)。
答案 2 :(得分:3)
啊 - 而且“AutoSave Project桌面”功能有时会以“反向”顺序打开文件(因此形式) - 加剧了IDE - 不知道MyMainForm“功能”。
答案 3 :(得分:2)
我把一些共享的东西放到Datamodules而不是表单上。试试这种方式。
答案 4 :(得分:1)
我做了一些尝试一些非常奇怪的结果。但我确实做了一些更改,因此我可以在没有出现此问题的情况下处理我的项目。我不得不禁用AutoSave功能(这可以防止可能引用主窗体的辅助表单在主窗体之前打开)。然后我必须确保删除项目的.dsk文件(项目桌面AutoSave文件)。所以现在当我打开项目时它总是打开主窗体,所以我从来没有得到对主窗体的引用问题的清除。但是,如果在打开项目后关闭主窗体然后打开引用主窗体的窗体,我仍然会遇到问题。
此外,我无法在禁用AutoSave功能的全新项目中重现此另一个表单的引用问题,即使我可以在当前项目中禁用AutoSave重现它。我不明白为什么,但我觉得这不值得进一步研究。
以下是我在现有项目中进行的一些实验的数据。 WORKS意味着对主表单的引用很好。 BUG表示已清除对主表单的引用。这是在AutoSave打开的情况下完成的,并且在关闭项目之前总是手动关闭所有表单。
其他有趣的发现:
答案 5 :(得分:1)
你有项目中包含的mainform.pas吗?不仅仅是在.pas中的某个地方“使用mainform.pas”,而是作为
fMainForm in 'fMainForm.pas' {MainForm},
在你的申请**。dpr **。 Delphi需要注释 {MainForm} - 用于解析它们之间的继承形式和链接。