构建组件时应该从哪里开始?
Posted
技术标签:
【中文标题】构建组件时应该从哪里开始?【英文标题】:Where should I begin when building a component? 【发布时间】:2010-12-18 21:04:14 【问题描述】:我正在寻找构建自己的组件,但不知道从哪里开始。我有一些 Delphi 书籍,但它们已经过时了,我正在寻找一些关于教程/书籍的建议来帮助我做到这一点。该组件将非常简单,基本上是 2 个标签和一个图像。我需要数百个这样的数组,所以我认为一个组件是最好的路线。文本将根据宽度等进行调整,并有一些鼠标悬停事件。所以基本上,我从哪里开始?
我使用的是 Delphi 2009,这将是一个 win32 应用程序。
谢谢!
【问题讨论】:
【参考方案1】:看看this article,它描述了如何构建由一组现有组件组成的新组件。
【讨论】:
没有点击链接,但它是否描述了我的答案? :-)【参考方案2】:据我所知,Danny Thorpe 所著的Delphi Component Design 仍然是该主题的最佳书籍。在过去的 15 年中,组件设计没有显着变化,因此无论您拥有什么书籍,都可能没有您想象的那么过时。阅读较早的参考资料时要记住三件事:
某些单位的名称已更改。例如,不再有 DsgnIDE。而是 DesignIDE。
现在设计时代码与运行时代码严格分开。这意味着您不能在组件的单元中使用 DesignIDE,否则您将被禁止使用运行时包。较旧的 Delphi 版本没有此技术限制(尽管它一直是法律限制),因此您找到的旧代码示例可能需要稍作更改。
字符串现在是 Unicode,因此与您发现的所有旧代码示例一样,您可能需要识别一些关于字符大小的无效假设。
编写组件的最大障碍是您需要使用您所继承的类的各种受保护成员,但这些成员通常没有文档记录,因此您必须非常更愿意去阅读 VCL 源代码,了解如何使用各种方法的示例。
【讨论】:
@Rob:很好的推荐。 Ray Konopka 的《开发自定义 Delphi 组件》一书也不错;我没有 URL,也无法从这里查看亚马逊(代理问题)。 IIRC,有人提到他正在考虑通过 PDF 或 Lulu 重新发布它...... @Rob:如果你知道我在哪里可以买到这本书,我将不胜感激。我试过@亚马逊,但没有运气。那么有人吗? Mihaela,我的答案中的链接指向亚马逊,它说有七个使用过的副本。如果买不到,请尝试其他二手书供应商。【参考方案3】:做你想做的最简单的方法是创建一个新表单。放下标签和图像并按照您想要的方式排列它们;如果它适合您的需要,请将它们放在面板上,以便它们可以作为一个整体移动。
选择您想要包含的所有组件(如果您选择使用一个,则包括面板),然后单击 IDE 主菜单上的“组件”项,然后选择“创建组件模板”。 (仅当您在当前表单上选择了组件时才会启用它。)将出现一个对话框,询问您新组件的名称,以及您希望它出现的组件面板页面。
【讨论】:
【参考方案4】:您可以订购 Ray Konopka 的书 Dev。 Custom Delphi 3 Components - PDF 25 美元。这是一本关于该主题的专业书籍,也非常适合初学者。
开发组件背后的主要原则是:
组件是可视的还是 不需要(是否需要画布来绘制)
是否需要窗口句柄(可视或非可视)
回答完这些问题后,您可以查看 Delphi 的源代码以获取示例。
【讨论】:
+1 我找到的关于该主题的最佳书籍。不要让标题中的 Delphi 3 吓到你,它仍然与任何版本的 Delphi 都非常相关。希望有一天雷能有时间更新它。【参考方案5】:不用担心你的书会过时。
几乎所有过去的东西都可以正常工作,而很少有什么不正常是由于名称冲突或在 2009 版本中添加了 Unicode。
他们不是微软,他们不会无故破坏旧代码。事实上,从旧的 DOS 时代获取一些代码——假设它不尝试操纵屏幕,它可能以最少的修复运行。
【讨论】:
【参考方案6】:不用担心你的旧书! 自 v3 以来,Delphi 并没有太大变化。这就是为什么大多数使用 D3 编译的程序仍然可以在 D7 甚至更新版本中编译的原因。如果它不能编译,可能你需要在这里改变一两行。
我建议您在 Internet 上搜索其他非常简单的组件,看看它们是如何制作的。然后自己制作并张贴在这里。让其他人看看它并提出改进建议或发现错误。
关于控件的设计:
1) 也许你不需要这两个标签。您可以直接在图像上绘制文本。如果你有很多你说的那些组件,你可能会节省一点内存。
2) 您可能不希望在一个表单中加载大量图片。开销可能很大。您可以做的是仅在屏幕上可见的图像中加载图片 - 您将仅在屏幕上放置 5-10 张图像(或者您可以在表单上显示的任何数量的图像而不会离开屏幕)。当用户向下滚动时,您会在屏幕上保留相同的 TImage 控件,但您会在其中加载新的(下一个)图像。
3)您可能不想将标签和 TImage 存储在一个数组中(我想它是一个 TImage,因为您似乎想在屏幕上显示它们,否则您将不需要标签 - 您需要在如果我弄错了,请提供更多详细信息)。但是你可以存储一个 TBitmap 和文本(你想在标签中显示)。
因此,您可能需要计算数百个控件将创建多少 CPU/磁盘开销以及它们需要多少内存。如果你保持在 1GB 以下并且加载时间在 10 秒以下,那么它是相对可以的。如果没有,您可能需要在开始实际实施之前考虑控件的设计。
希望这对您有所帮助。 再见。
【讨论】:
以上是关于构建组件时应该从哪里开始?的主要内容,如果未能解决你的问题,请参考以下文章
在 joomla 组件中,我应该在哪里存储数据库函数,以及如何调用它们?
我应该如何构建多用途 Vue 组件以从不同的 Vuex 路径加载数据?