Delphi在表单中共享图像列表的问题

时间:2008-12-18 03:35:49

标签: delphi

多年来,我一直在Delphi中分享多个表单中的图像列表。我在我的应用程序的主要表单上有一个TImageList,然后我有其他形式的组件,我在设计时将Images属性设置为主窗体中的图像列表(例如MyMainForm.MyImageList)。

我遇到的问题是,在主窗体上引用图像列表的那些窗体上随机删除Images属性。

这似乎最近才刚刚开始,但我还没有找到确切的原因。我似乎无法找到一种随意重现问题的方法;它似乎随机发生。我确实注意到它在表单打开时正好发生了。

我最近在Delphi中做过的一件事就是启用了Autosave Project桌面和符号功能。所以现在当我打开这个项目时,它总是会记住哪些表格是开放的。因此,当打开表单时会发生此问题,并且因为它现在重新打开上次打开项目时打开的所有表单,它会更频繁地发生。

我们有一些开发人员在开发这个项目,我们正在使用SVN进行版本控制。启用自动保存项目桌面和符号功能的一个问题是,当我们对项目进行SNV更新时,符号文件可能变为无效(因为我们在版本控制下没有符号文件)。这只会导致Delphi发出错误消息,但除此之外它似乎无害。我们只是重新编译项目并修复了符号文件。

是的,我正在使用Delphi 7。

如果您有任何疑问或需要澄清,请发表评论,我会更新问题。

6 个答案:

答案 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打开的情况下完成的,并且在关闭项目之前总是手动关闭所有表单。


  1. 打开项目
  2. 打开主表单
  3. 打开辅助表格
  4. 结果:工作

    1. 打开项目
    2. 打开辅助表格
    3. 结果:BUG

      1. 打开项目
      2. 打开主表单
      3. 关闭主表单
      4. 开放中学
      5. 结果:BUG

        1. 打开项目
        2. 打开中学表格
        3. 结果:BUG
        4. 将辅助表单上的组件的Images属性设置为主窗体上的图像列表
        5. 关闭辅助表单
        6. 打开辅助表格
        7. 结果:WORKS(仅限二级表单的“缓存”参考;请参阅下面的“缓存”说明)

          1. 打开项目
          2. 打开魔术形式(见下文“魔术”形式的解释)
          3. 结果:WORKS(“缓存”对所有表单的主表单的任何引用;请参阅下面的“缓存”说明)

          4. 其他有趣的发现:

            • 当您打开表单并且图像列表没有显示时,.dfm被修改,但是delphi没有说文件被修改(例如,如果您关闭表单,它不会警告您未保存的更改) 。 只有在表单上按“保存”后,dfm才会清除图像列表参考。
            • 我注意到我的项目中有一些“魔术”形式(因为没有更好的术语)。 Magic表单在他们的.dfm中引用了我的项目的主要表单,并且在打开它们之后它们不会丢失对主表单的引用,即使它们是在任何其他表单之前打开的。
            • 这些魔术形式导致从主窗体中“缓存”所有图像列表引用。一旦打开其中一个表单,就可以打开引用主表单的任何表单,并且在此项目会话期间不会丢失它的引用(即使魔术表单随后关闭)。

答案 5 :(得分:1)

你有项目中包含的mainform.pas吗?不仅仅是在.pas中的某个地方“使用mainform.pas”,而是作为

  fMainForm in 'fMainForm.pas' {MainForm},

在你的申请**。dpr **。 Delphi需要注释 {MainForm} - 用于解析它们之间的继承形式和链接。