Delphi如何使用其他窗体中的类型?

2024-05-11

抱歉,这是一个非常新手的问题。

我正在对这个庞大的应用程序进行维护。它有5种不同的形式。我们将全局变量放在一个单元(uGlobal)中。但我似乎无法从数据单元(uData)访问它。

我有这个:

Unit uGlobal
type
TmyType: (alpha, beta);
...

Unit uGlobal

Stuff:  TmyType  <- error, undeclared indentifier

当我尝试将 uGlobal 放入 uData 的使用部分时,它抱怨循环引用。所以,这里有点无知。他们都在同一个项目中。这是使用 BDS 2006。


你有一个循环引用,因为你有东西uGlobal想要利用其中的东西uData反之亦然。循环引用是大型项目中的一个大问题,因为它们大大增加了复杂性 - 如果您有循环依赖项,它就会变得更像一个更大的单元。我怀疑在你的项目被认为是大型的之前还有很长的路要走,更不用说“大规模”了。 ;)

您有 2 种可能的解决方案:

  • 使用循环依赖,建立一个依赖weak, 和另一个strong.
  • 进行一些重新设计以完全消除问题。 (把事情分成更小的块。)

保持循环依赖

David 已经给出了答案:至少其中一个单元必须使用实施部分中的另一个单元。

  • A 使用 B 使用 A 是绝对不允许的,但是您可以将接口和实现部分视为几乎就像单独的单位本身(带有一堆特殊的引用规则)。
  • 所以问问你自己,每个sub-unit need?
  • If for example:
    • 你声明了一个类型uData interface并在其中引用了uGlobal interface,则界面为uGlobal needs uData并且需要相应的uses子句。
    • 如果有一个类型uData implementation在任何地方都被引用uGlobal,然后该声明在uData implementation必须移至界面部分。
    • 如果有一个类型uGlobal interface它必须仅从实现部分引用uData那么 use 子句在实现部分就可以了。
  • 如果您遇到不幸的情况,即在两个接口部分中都键入了另一个接口部分中的引用类型,那么您have to通过应用该技术来进一步模块化删除循环依赖.

删除循环依赖

消除循环依赖需要将您的单元分解为更易于管理的更小的单元。为此,您must了解依赖关系每个之间的things在您的应用程序中。 例如:

  • Suppose uGlobal声明 A 和 C
  • A依赖于C,但C不需要A
  • 还假设uData声明 B 需要 C
  • 但事实证明A也需要B
  • 这就是为什么你有循环依赖

在这种情况下,你所要做的就是在移动 C 处声明一个新单位。

  • 然后两个uGlobal and uData将使用uNewUnit
  • 但双方都不需要对方
  • 并且您的循环依赖将被完全删除。

免责声明

我并不以任何方式提倡你对 uGlobal 的做法。事实上,这是一个非常糟糕的主意,当您的项目开始变大时,它会在两个方面给您带来很大的麻烦。不幸的是,这个解释本身就是一个巨大的答案。

  • 使用全局变量是危险的,应该避免。
  • 使用像 uGlobal 和 uData 这样的“大倾销单位”也是危险的,而且你才刚刚经历过他们的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi如何使用其他窗体中的类型? 的相关文章

  • Delphi 2007 中的 HelpInsight 文档

    我正在使用 D2007 并尝试使用 HelpInsight 功能 自 D2005 起提供 来记录我的源代码 我主要对让 HelpInsight 工具提示正常工作感兴趣 通过各种网上冲浪和实验 我发现了以下内容 使用三斜杠 注释样式比其他记录
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何追踪手柄泄漏?

    在我的一个应用程序中 我观察到句柄数量不断增加 在不使用应用程序的情况下 该数字大约每秒增加一次 因此后台处理代码的某些部分一定存在句柄泄漏 我如何追踪此类泄漏 有什么工具可以帮助解决这个问题吗 跟踪句柄泄漏时要寻找哪些模式 导致手柄泄漏的
  • 我需要避免尝试更新连接到 TSQLQuery 的 Delphi TClientDataset 中的非物理字段

    概要 我的代码正在尝试更新 Delphi XE 中的非物理字段TClientDataset 连接到TSQLQuery以其SQL属性集 作为运行时的结果创建Open命令 我有一个TClientDataset连接到一个TDatasetProvi
  • 如何追踪“地址 00000000”的访问违规

    我知道如何创建 map 文件来在错误消息包含实际地址时跟踪访问冲突错误 但是如果错误消息说怎么办 Access violation at address 00000000 Read of address 00000000 我从哪里开始寻找这
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 如何将数据库查询的行转换为 XML 文件?

    我正在开发一个 Delphi 应用程序 该应用程序需要从一段工作中获取行并将其转换为单个 XML 文件 以便上传到第三方 Web 服务 有没有可用的组件或库可以做到这一点 如果不是 那么构建 DB2XML 转换器的最佳代码方法是什么 我注意
  • 当 Delphi 处于覆盖模式时,如何更改它的光标形状?

    当使用 Delphi 的任何版本时 我有时会碰巧按下插入键并打开覆盖模式 这通常是一个很大的麻烦 并且您进入覆盖模式的唯一指示是编辑器底部的小文本 当使用其他程序 首先想到的是 Notepad 时 当您处于插入模式时 文本光标是 当您处于覆
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何使 StringGrid 的列适合网格的宽度?

    我已经寻找解决方案很长时间了 但没有任何运气 有谁知道一个简单的方法来做到这一点 例如 我想拉伸网格的第二列以适应网格的宽度 Use the ColWidths财产 像这样 with StringGrid1 do ColWidths 1 C
  • 将图像加载到 TImageList 并读取它们?

    我试图通过将 jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中 从上到下的代码片段 Selectdir 有效 fileexists 部分有效 这用于加载文件夹中的所有图像 所有图像都以 0 jpg
  • logback的“谨慎模式”是如何实现的?

    The 审慎模式 http logback qos ch manual appenders html prudentlogback 中的序列化所有 JVM 之间的 IO 操作 写入同一文件 可能运行在不同的主机上 在其他日志记录框架中 如果
  • 如果加载 dll 找不到依赖项,有什么方法可以捕获错误吗?

    我正在编写一个 Windows 32 位程序 可以使用多个可能的 dll 之一 所以它尝试依次加载每个 dll 使用SysUtils SafeLoadLibrary如果加载成功 它就会使用该 dll 不幸的是 其中一些 dll 静态链接到其
  • 使用 Delphi 读取 Excel 电子表格

    我需要使用 Delphi 2010 读取和写入 Excel 电子表格 没什么花哨的 只需读取和写入不同工作表上特定单元格和范围的值 需要在没有安装 Excel 的情况下工作并支持 Excel 2007 我看过的一些东西 我尝试过使用ADO
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • 使用 Delphi 10.2.1 Tokyo 的模态 Android 对话框

    我有以下用于在 Android 上显示模式消息的 Delphi 代码 该代码在 10 1 Berlin 上运行良好 但在 Delphi 10 2 1 Tokyo 上停止运行 此过程现在会挂起 Android 应用程序 procedure c
  • (发件人:TObject)

    发件人 TObject 是什么意思 如 procedure TForm1 Button1Click Sender TObject var s Integer begin end Sender 是对触发事件的组件的引用 在这种情况下 Send
  • 如何修复这个 delphi 7 编译错误 - “重复资源”

    我正在尝试编译我继承的 Delphi 7 项目 但收到此错误 错误 警告 重复资源 错误 类型 2 位图 ID 编辑 错误 文件 C 路径缩短 common CRGrid res 资源已保留 文件 c common raptree RES

随机推荐

  • 如何通过 Web3-react 保持 MetaMask 与 UI 的连接持久?

    我正在使用 web3 react 但我不知道如何在浏览器刷新时保持与 MetaMask 钱包的连接持续 这是代码 define the injectedConnectors const injectedConnector new Injec
  • java中初始化并返回一个字节数组

    在我的代码中 我必须将一个 bye 数组 byte temp null 传递给 函数在其内部分配并填充数据 后 从函数返回它仍然为空 我怎样才能找到一个 解决这个问题 请帮我 byte temp null ret foo temp bool
  • Rails 3.1 资源预编译 - 包含所有 javascript 文件

    我希望 Rails 3 1 能够获取更多我的资源进行预编译 特别是 编译文件的默认匹配器不会添加 js文件来自vendor assets javascripts 我可以将资产添加到config assets precompile列表 但这似
  • 需要帮助解决 Project Euler 问题 200 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试制定一个算法来解决 We
  • 发布 ndb StructuredProperty _Message__decoded_fields

    我的问题 我正在尝试使用 POST 请求填充 GAE 中包含 ndb Structured Property 的数据存储模型 这个问题最近被问过但没有得到解答 如何 发布 ndb StructuredProperty https stack
  • mySQL 基于不同表的 SELECT(计数)更新表

    我有一个课程表和一个科目表 CLASS class id class name subject id date time imagine some rows here SUBJECT subject id subject name curr
  • 如何使 collectionViewCell 仅按高度自动调整大小?

    我使用collectionView的自动调整流布局的功能 self flow UICollectionViewFlowLayout alloc init self flow scrollDirection UICollectionViewS
  • 如何正确调整 R 中 ggplot 的各个方面的大小,包括图例?

    我在 ggplot2 中制作散点图 然后使用 ggsave 导出特定宽度和高度的 PDF 但是 图形图例永远不会使用 ggsave 正确调整大小 其边框不会留在绘图内 是否有另一种方法可以同时调整 ggplot 所有部分的大小以便于导出 我
  • 为什么 main() 中的 try-catch 不好?

    有人可以向我解释为什么在 main 方法中使用 try catch 来捕获未处理的异常被认为是不合适的吗 STAThread static void Main try Application Run new Form1 catch Exce
  • 如何检查 lib 文件?

    我有一个包含 390 个库的列表 需要将软件从实验室 CVI 移植到 Visual C 这些依赖关系快要了我的命 我无法导入所有这些 这太过分了 而且并非所有它们都是唯一的和 或根本可以加载 有没有一种简单的方法可以确定 lib 文件进行哪
  • 如何重新启动/重置 Jquery 动画

    如何在 jquery 中重置动画 例如 CSS block position absolute top 0 left 0 JS block animate left 50 top 50 如果我做 block stop 动画将停止 但我怎样才
  • HTML5 范围输入中的样式下限和上限填充

    正如所解释的here http www hongkiat com blog html5 range slider style IE 允许在 CSS 中设置下部和上部填充或轨道区域的样式 如下所示 The following only aff
  • 如果字符串包含列表中的单词,则返回与列表值相邻的值

    目前我有一组单元格 每个单元格在无用的信息中都有一个唯一的标识符 我还有这些唯一标识符的列表 以及每个标识符对应的值 我想做的是找到一个单元格包含哪个标识符 如果有的话 然后输出相应的值 下面是一个例子 https i stack imgu
  • 使用批量乘法的tensorflow的tensordot中的障碍

    我正在张量流中实现 RBM 使用小批量实现参数更新存在障碍 有2个张量 第一个张量的形状是 100 3 1 第二个张量的形状是 100 1 4 数字 100 是批次大小 所以我想将这些张量相乘 得到 100 3 4 张量 但是当我实现这样的
  • Bash:循环遍历字符串数组后无法读出带空格的字符串

    我正在使用循环读取数组的内容 该数组包含名为 music 的目录层次结构中的所有目录和文件 内容是 find 命令先前输出的字符串 这个想法是根据流派 艺术家和标题将 directory contents 中每个数组元素的完整目录路径分成子
  • 单元格的 Fieldnames 函数的等效项

    正如标题所说 只是想知道是否有一个函数可以用作字段名 http www mathworks co uk help matlab ref fieldnames html 但适用于单元格 所以如果我有类似的东西 a imread redsqua
  • 哪些编程语言不被视为高级语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在信息学理论中 我一直听到和读到有关高级和低级语言的内容 然而我不明白为什么这仍然相关 因为除了今天使用的汇编语言之外 没有任何 相关的 低级语
  • 使用 Android 创建 ZIP 文件

    如何从 XML 文件创建 ZIP 文件 我想以 XML 格式备份所有收件箱消息 并压缩 XML 文件并将其存储在SD card http en wikipedia org wiki Secure Digital 下面的代码解决了我的问题 p
  • 问:Google Photos Library API - 我不知道它是如何工作的,有人知道吗?

    我正在尝试通过 javascript 从 Google Photos 加载相册 但我不明白 api 是如何工作的 我开始阅读谷歌照片API https developers google com photos 但没有运气 是否有代码参考可以
  • Delphi如何使用其他窗体中的类型?

    抱歉 这是一个非常新手的问题 我正在对这个庞大的应用程序进行维护 它有5种不同的形式 我们将全局变量放在一个单元 uGlobal 中 但我似乎无法从数据单元 uData 访问它 我有这个 Unit uGlobal type TmyType