问题标签 [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.

0 投票
4 回答
6808 浏览

delphi - 在对象检查器上显示 TFrame 后代的附加属性

Delphi 对象检查器没有按设计显示 TFrame 后代的附加属性。人们倾向于建议使用通常用于在对象检查器上显示 TForm 后代属性的已知技巧。诀窍是:通过设计时包将 TForm 后代的自定义模块注册到 Delphi IDE,例如:

对象检查器可以通过这种方式显示 TFrame 后代实例的其他属性,但它在嵌入表单时会丢失其帧行为。不可重新设计,无法为其子组件实现事件,并且它接受子控件(它不能)。但它在自己的设计区域中表现正常。

看起来,Delphi IDE 专门为 TFrame 提供的那些行为。它们可能不是一种通用设施。

有没有其他方法可以在不丢失帧行为的情况下做到这一点?

我正在使用德尔福 2007


@Tondrej,

阅读问题的评论,在此先感谢。

框架单元.dfm:



0 投票
2 回答
3497 浏览

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 没有任何变化的“基本框架类”,然后在添加任何属性、方法等之前从它继承,似乎可以极大地稳定继承流。不知道为什么,但到目前为止。

0 投票
5 回答
3827 浏览

delphi - Delphi IDE 将 TFrame 视为表单

每隔一段时间,当我调整我的 TFrame 类(添加属性、方法等)时,IDE 就会感到困惑并表现得好像它认为框架是一个表单,包含标题/标题、边框等。然而,很明显该类被声明为 TFrame 后代。关于导致这种情况的原因,如何预防以及如何解决的任何想法?

我正在使用 Delphi 2007 Pro。另请注意(如果重要的话),TFrame 后代通常通过设计时包在 IDE 中注册(即在调色板上)。


后来:附加“细节”:我目前遇到这个问题的框架在视觉上是一个非常基本的 TFrame(从全新的 TFrame 改变的只是大小和背景颜色)。

这是它的类声明:

这个框架被用作许多其他框架的基类。我通常直接从它所属的 BPL 项目编辑它(因为所有这些框架都安装到调色板),而不是作为 EXE 项目的一部分,打开相关的表单等。

此外,在“工具”->“选项”中选中“嵌入式设计器”。

我也将所有 DFM 文件保存为文本而不是二进制文件(如果这很重要的话)。

0 投票
5 回答
3048 浏览

delphi - 将参数传递给delphi TFrame

为了避免单例和全局变量,我希望能够将参数传递给 TFrame 组件。但是,由于 TFrame 通常在设计时包含在表单中,因此只能使用默认构造函数。

父窗体当然可以在创建 TFrame 后在 OnCreate 回调中设置一些属性。但是,这并不能确保不会忘记属性,并且依赖关系不像使用构造函数那样清晰。

如果可以在读取 dfm 文件时注册一个用于创建组件的工厂,那么一个不错的方法是。然后可以在工厂创建时将所需的参数传递给 TFrame 构造函数。有没有办法做到这一点?

或者有人对如何将参数传递给 TFrame 有更好的解决方案吗?

0 投票
5 回答
7110 浏览

delphi - 注册自定义框架

在 Delphi 2009 中,在我的一个项目中,我有一个自定义框架,上面有一些控件,我想将其用作其他一些控件的基类。我想将此框架注册为 IDE 向导,以便在新项目列表中可用。当我将新添加的项目(我的自定义框架)添加到项目时,我希望它:

  1. 在对象检查器中显示我添加到自定义框架的所有属性和事件。
  2. 从我的自定义框架而不是 TFrame 派生新创建的框架。

好的,为了让它在 Object Inspector 中显示我的属性和事件,我在 IDE 中注册了一个自定义模块。它不适用于框架。幸运的是,有人在 StackOverflow 上提到了这一点,并给出了答案:

在对象检查器上显示 TFrame 后代的附加属性

然后,为了让它加载我的自定义框架的 DFM,我将 InitInheritedComponent 添加到我的自定义框架的构造函数中。像这样的东西:

它不起作用!它仍然在设计器中创建一个空框架,而不是我自己的框架。如果我没有将自定义模块注册到 IDE 中,即使不需要 InitInheritedComponent,它也会正确显示我的框架,但对象检查器中不会显示其他属性!

如果我将构造函数源更改为此(用 TFrame 替换 TMyFrame):

框架已正确添加到设计器中,并且在 Object Inspector 中可以看到其他属性,但运行应用程序失败,因为它抱怨框架上的组件已经存在。

所以,我的问题是:让 Delphi IDE 向导使用 DFM 从自定义框架(不是表单)创建派生框架并在 Object Inspector 中显示其附加属性的解决方案是什么?

顺便说一句,我不想​​在运行时在框架中构建控件,因为我也需要它们在设计时可用。

我希望有人能把这件事告诉我。

问候

编辑:

这些框架实际上用作向导组件的页面。我的向导组件在运行时创建它们。我希望用户在“新建项目”菜单中有一个选项,可以将向导页面添加到项目中,并在 IDE 设计器中设计其布局,并将其注册到我的向导组件中以显示在向导中。我从 TFrame 继承了一个基类,因为我的向导页面应该有一些强制控件和一些自定义属性和事件。

0 投票
4 回答
5201 浏览

delphi - 我应该将 delphi tframes 用于多页表单吗?

我的应用程序中有一些表单,根据用户的操作,它们具有不同的“状态”;例如,在列出他的文件时,表单会在网格中显示有关该文件的一些数据,但如果他单击某个按钮,则该网格会被与其相关的图形替换。简单地说,表单中的控件取决于用户想要做什么。

当然,这样做的明显方法是根据需要显示/隐藏控件,这对于小数字来说就像一个魅力,但是一旦你达到每个状态的 10/15+ 控件(或者实际上超过 3 个状态),它就无法使用了。

我现在正在尝试使用 TFrame:我为每个状态创建一个框架,然后在我的表单上创建一个每个框架的实例,然后我只显示我想要使用 Visible 的那个 - 同时有一些控件最重要的是,在任何框架之外,因为它们都共享它们。

这是做我想做的事情的正确方法,还是我在此过程中错过了什么?我以为我只能创建一个 tframe 实例,然后选择要在其中显示的实例,但看起来并非如此。

谢谢

0 投票
1 回答
499 浏览

delphi - 包中的框架继承和重复文件

我一直在使用 TFrames 和 ModelMaker 开发许多组件——我发现视觉设计/开发 + 继承 + ModelMaker 的组合非常引人注目。然后我注册这些带有注册单元的 TFrame 后代,它们从那里成为成熟的基于调色板的组件。我正在使用德尔福 2007。

在我了解这个过程的小“障碍”的早期,我发现通过引入 TFrame 后代流错误(通常在 IDE 中显示为表单,而不是帧)可以完全消除我遇到的一些问题我自己的“TBaseFrame”类从 TFrame 继承而没有 chanegs,然后使用 THAT 作为基类来开发组件(添加方法、属性等)。如果我将属性和方法等添加到直接从 TFrame 继承的类/框架中,则 dfm 文件流式传输经常会感到困惑。

所以,总的来说,它工作得很好,一旦我解决了问题。

不过,昨天我遇到了一个新问题:

我将生成的组件安装在包集中,以有意义的方式分组(即,应用程序 1 的所有“面板”都在一个包中,应用程序 2 的许多“查看器”在另一个包中,等等)。

如果包中不包含 TBaseFrame 类,则继承的 TFrame-descendant 组件将不会加载到 IDE 中。但是,如果我将 TBaseFrame 添加到包中,当它在多个包中具有相同的源 PAS 文件时,我会遇到 Delphi 报告的冲突。

可以将所有基于框架的组件放入一个巨大的包中,但我真的非常不喜欢这样做,因为我可以清楚地看到随着时间的推移会变得太大/失控,考虑到多少套的性质我打算开发。有没有其他方法可以解决这个冲突?


更新——有一个技巧可以让它“正常”工作——一定要阅读下面的评论。

0 投票
2 回答
2692 浏览

delphi - TFrame 中的 EventHandler?

我有一个TForm(TVehicleEditForm),里面有3个相同的TFrames(TVehicleUnitFrame)。

这个想法是框架的每个实例都通过框架eventhandler内部的 a 处理自己的事件。问题是eventhandler没有调用。

我试图eventhandler通过覆盖 Create 方法在框架内分配 by 代码,但在这种情况下也不会调用处理程序。

但是,如果我从表单中分配eventhandler框架的外部,它就可以正常工作。像这样:

这仅适用于一个按钮!由于我在框架中有许多组件,这将导致许多分配......当这应该直接在对象检查器中完成时,这是相当丑陋的代码。

我正在使用 D2007。知道原因吗?

问候罗兰

0 投票
7 回答
10391 浏览

delphi - Delphi,框架与表格。多文档界面是什么?

昨天我开始讨论“MDI 与选项卡式界面”。我问过我是否应该继续将我的应用程序开发为基于 MDI 的应用程序,还是应该将子表单嵌入到选项卡表中。有人指出我应该改用 TFrames ......我的问题是:为什么?

在 TFrame 上嵌入表单时使用 TFrame 有什么优点?到目前为止我什么都不知道,切换只需要我重写部分代码......

(无论如何,我不会在设计时使用嵌入!)

提前致谢

0 投票
4 回答
13795 浏览

delphi - 在 Delphi 中使用框架的公认方法是什么?

我像往常一样四处闲逛,碰到了一些框架讨论。

我主要是 Delphi 爱好者而不是专业人士,所以我必须学习如何以自己的方式使用 TFrame,即:

  • 在其单元内创建一个 TFrame。
  • 将该单元添加到主表单 Uses 子句中。
  • 拥有该 TFrame 类型的私有变量
  • 表单的 OnCreate 实例化 TFrame 并将其附加到 Create 和 .Parent 上的 TPanel
  • 在我的一个操作中设置了 TFrame.Visible := True 和 .BringToFront。

这是我经过个人深思熟虑后的做法。

还有什么其他方式可以使用框架?