问题标签 [tframe]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - 在对象检查器上显示 TFrame 后代的附加属性
Delphi 对象检查器没有按设计显示 TFrame 后代的附加属性。人们倾向于建议使用通常用于在对象检查器上显示 TForm 后代属性的已知技巧。诀窍是:通过设计时包将 TForm 后代的自定义模块注册到 Delphi IDE,例如:
对象检查器可以通过这种方式显示 TFrame 后代实例的其他属性,但它在嵌入表单时会丢失其帧行为。不可重新设计,无法为其子组件实现事件,并且它接受子控件(它不能)。但它在自己的设计区域中表现正常。
看起来,Delphi IDE 专门为 TFrame 提供的那些行为。它们可能不是一种通用设施。
有没有其他方法可以在不丢失帧行为的情况下做到这一点?
我正在使用德尔福 2007
@Tondrej,
阅读问题的评论,在此先感谢。
框架单元.dfm:
delphi - TFrame继承重构
我的另一个 TFrame IDE 注册组件问题。感谢所有的帮助,各位程序员。:)
在这里玩 Darrian 的 TFrame 继承建议:
规格:
基本上,我有一个已注册到 IDE 的基于 TFrame 的组件,它运行良好。我现在正在开发一些“姐妹”组件,它们将共享大量现有组件的非可视功能和属性。因此,将其中的大部分内容移至新旧组件都可以继承的父/超类是有道理的。
以这种方式“重构” TFrame 继承的最佳方法是什么?(这也可能适用于 TForm 类的后代,不确定)。有哪些注意事项和注意事项?
例子:
例如,我尝试创建一个没有任何内容的新 TFrame,然后调用该框架 TMyBaseFrame。然后修改了我现有组件的类定义(我们称之为 TMyFrameTreeView)以继承自该组件而不是 TFrame。
它编译得很好,但是当我尝试将它放在表单上时,我得到“找不到 ClientHeight”(或“找不到 ClientHeight 属性”),并且它不会放在表单上。从相关的 DFM 中删除 ClientHeight 和 ClientWidth 造成了严重破坏,并且最终在调整大小时被替换。我注意到后代类中的 ExplicitHeight 和 ExplicitWidth ,并且我认为这与继承值的属性值覆盖有关,但不确定。通过 New -> Inherited Items 重新创建一个全新的框架,然后复制所有内容,也没有产生很好的结果。
最后说明
我意识到这可能会很快变得一团糟,流式传输 DFM 文件和多代后代等......这也是我要求整体“需要注意的事项”概念方面的部分原因,但也给出了具体的现实世界中更简单的问题版本(在我看来,这应该是可行的)。
我已经创建了一个小测试包来破解学习尝试,并且正在学习很多东西,但它进展缓慢,并且您的德尔福“绝地大师”的任何指导/见解将非常感激。:)
稍后回复更新:
下面的两个答案都很有帮助。同样,创建一个与普通 TFrame 没有任何变化的“基本框架类”,然后在添加任何属性、方法等之前从它继承,似乎可以极大地稳定继承流。不知道为什么,但到目前为止。
delphi - Delphi IDE 将 TFrame 视为表单
每隔一段时间,当我调整我的 TFrame 类(添加属性、方法等)时,IDE 就会感到困惑并表现得好像它认为框架是一个表单,包含标题/标题、边框等。然而,很明显该类被声明为 TFrame 后代。关于导致这种情况的原因,如何预防以及如何解决的任何想法?
我正在使用 Delphi 2007 Pro。另请注意(如果重要的话),TFrame 后代通常通过设计时包在 IDE 中注册(即在调色板上)。
后来:附加“细节”:我目前遇到这个问题的框架在视觉上是一个非常基本的 TFrame(从全新的 TFrame 改变的只是大小和背景颜色)。
这是它的类声明:
这个框架被用作许多其他框架的基类。我通常直接从它所属的 BPL 项目编辑它(因为所有这些框架都安装到调色板),而不是作为 EXE 项目的一部分,打开相关的表单等。
此外,在“工具”->“选项”中选中“嵌入式设计器”。
我也将所有 DFM 文件保存为文本而不是二进制文件(如果这很重要的话)。
delphi - 将参数传递给delphi TFrame
为了避免单例和全局变量,我希望能够将参数传递给 TFrame 组件。但是,由于 TFrame 通常在设计时包含在表单中,因此只能使用默认构造函数。
父窗体当然可以在创建 TFrame 后在 OnCreate 回调中设置一些属性。但是,这并不能确保不会忘记属性,并且依赖关系不像使用构造函数那样清晰。
如果可以在读取 dfm 文件时注册一个用于创建组件的工厂,那么一个不错的方法是。然后可以在工厂创建时将所需的参数传递给 TFrame 构造函数。有没有办法做到这一点?
或者有人对如何将参数传递给 TFrame 有更好的解决方案吗?
delphi - 注册自定义框架
在 Delphi 2009 中,在我的一个项目中,我有一个自定义框架,上面有一些控件,我想将其用作其他一些控件的基类。我想将此框架注册为 IDE 向导,以便在新项目列表中可用。当我将新添加的项目(我的自定义框架)添加到项目时,我希望它:
- 在对象检查器中显示我添加到自定义框架的所有属性和事件。
- 从我的自定义框架而不是 TFrame 派生新创建的框架。
好的,为了让它在 Object Inspector 中显示我的属性和事件,我在 IDE 中注册了一个自定义模块。它不适用于框架。幸运的是,有人在 StackOverflow 上提到了这一点,并给出了答案:
然后,为了让它加载我的自定义框架的 DFM,我将 InitInheritedComponent 添加到我的自定义框架的构造函数中。像这样的东西:
它不起作用!它仍然在设计器中创建一个空框架,而不是我自己的框架。如果我没有将自定义模块注册到 IDE 中,即使不需要 InitInheritedComponent,它也会正确显示我的框架,但对象检查器中不会显示其他属性!
如果我将构造函数源更改为此(用 TFrame 替换 TMyFrame):
框架已正确添加到设计器中,并且在 Object Inspector 中可以看到其他属性,但运行应用程序失败,因为它抱怨框架上的组件已经存在。
所以,我的问题是:让 Delphi IDE 向导使用 DFM 从自定义框架(不是表单)创建派生框架并在 Object Inspector 中显示其附加属性的解决方案是什么?
顺便说一句,我不想在运行时在框架中构建控件,因为我也需要它们在设计时可用。
我希望有人能把这件事告诉我。
问候
编辑:
这些框架实际上用作向导组件的页面。我的向导组件在运行时创建它们。我希望用户在“新建项目”菜单中有一个选项,可以将向导页面添加到项目中,并在 IDE 设计器中设计其布局,并将其注册到我的向导组件中以显示在向导中。我从 TFrame 继承了一个基类,因为我的向导页面应该有一些强制控件和一些自定义属性和事件。
delphi - 我应该将 delphi tframes 用于多页表单吗?
我的应用程序中有一些表单,根据用户的操作,它们具有不同的“状态”;例如,在列出他的文件时,表单会在网格中显示有关该文件的一些数据,但如果他单击某个按钮,则该网格会被与其相关的图形替换。简单地说,表单中的控件取决于用户想要做什么。
当然,这样做的明显方法是根据需要显示/隐藏控件,这对于小数字来说就像一个魅力,但是一旦你达到每个状态的 10/15+ 控件(或者实际上超过 3 个状态),它就无法使用了。
我现在正在尝试使用 TFrame:我为每个状态创建一个框架,然后在我的表单上创建一个每个框架的实例,然后我只显示我想要使用 Visible 的那个 - 同时有一些控件最重要的是,在任何框架之外,因为它们都共享它们。
这是做我想做的事情的正确方法,还是我在此过程中错过了什么?我以为我只能创建一个 tframe 实例,然后选择要在其中显示的实例,但看起来并非如此。
谢谢
delphi - 包中的框架继承和重复文件
我一直在使用 TFrames 和 ModelMaker 开发许多组件——我发现视觉设计/开发 + 继承 + ModelMaker 的组合非常引人注目。然后我注册这些带有注册单元的 TFrame 后代,它们从那里成为成熟的基于调色板的组件。我正在使用德尔福 2007。
在我了解这个过程的小“障碍”的早期,我发现通过引入 TFrame 后代流错误(通常在 IDE 中显示为表单,而不是帧)可以完全消除我遇到的一些问题我自己的“TBaseFrame”类从 TFrame 继承而没有 chanegs,然后使用 THAT 作为基类来开发组件(添加方法、属性等)。如果我将属性和方法等添加到直接从 TFrame 继承的类/框架中,则 dfm 文件流式传输经常会感到困惑。
所以,总的来说,它工作得很好,一旦我解决了问题。
不过,昨天我遇到了一个新问题:
我将生成的组件安装在包集中,以有意义的方式分组(即,应用程序 1 的所有“面板”都在一个包中,应用程序 2 的许多“查看器”在另一个包中,等等)。
如果包中不包含 TBaseFrame 类,则继承的 TFrame-descendant 组件将不会加载到 IDE 中。但是,如果我将 TBaseFrame 添加到包中,当它在多个包中具有相同的源 PAS 文件时,我会遇到 Delphi 报告的冲突。
我可以将所有基于框架的组件放入一个巨大的包中,但我真的非常不喜欢这样做,因为我可以清楚地看到随着时间的推移会变得太大/失控,考虑到多少套的性质我打算开发。有没有其他方法可以解决这个冲突?
更新——有一个技巧可以让它“正常”工作——一定要阅读下面的评论。
delphi - TFrame 中的 EventHandler?
我有一个TForm
(TVehicleEditForm),里面有3个相同的TFrames
(TVehicleUnitFrame)。
这个想法是框架的每个实例都通过框架eventhandler
内部的 a 处理自己的事件。问题是eventhandler
没有调用。
我试图eventhandler
通过覆盖 Create 方法在框架内分配 by 代码,但在这种情况下也不会调用处理程序。
但是,如果我从表单中分配eventhandler
框架的外部,它就可以正常工作。像这样:
这仅适用于一个按钮!由于我在框架中有许多组件,这将导致许多分配......当这应该直接在对象检查器中完成时,这是相当丑陋的代码。
我正在使用 D2007。知道原因吗?
问候罗兰
delphi - Delphi,框架与表格。多文档界面是什么?
昨天我开始讨论“MDI 与选项卡式界面”。我问过我是否应该继续将我的应用程序开发为基于 MDI 的应用程序,还是应该将子表单嵌入到选项卡表中。有人指出我应该改用 TFrames ......我的问题是:为什么?
在 TFrame 上嵌入表单时使用 TFrame 有什么优点?到目前为止我什么都不知道,切换只需要我重写部分代码......
(无论如何,我不会在设计时使用嵌入!)
提前致谢
delphi - 在 Delphi 中使用框架的公认方法是什么?
我像往常一样四处闲逛,碰到了一些框架讨论。
我主要是 Delphi 爱好者而不是专业人士,所以我必须学习如何以自己的方式使用 TFrame,即:
- 在其单元内创建一个 TFrame。
- 将该单元添加到主表单 Uses 子句中。
- 拥有该 TFrame 类型的私有变量
- 表单的 OnCreate 实例化 TFrame 并将其附加到 Create 和 .Parent 上的 TPanel
- 在我的一个操作中设置了 TFrame.Visible := True 和 .BringToFront。
这是我经过个人深思熟虑后的做法。
还有什么其他方式可以使用框架?