- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个返回两个 TForm
之一的函数实例,根据用户设置的配置:
function TfrmMain.GetCurrentRamEditFrm: TForm;
{ Get the RAM Editor Form instance according to currenttly-set protocol. }
begin
if frmSetup.GetCurrentProtocol() = FooBus then
result := RAM_Editor_FooBus.frmRAM_Editor_FooBus
else
result := RAM_Editor_SXcp.frmRAM_Editor_SXcp;
end;
Main.pas
) 在 RAM 编辑器表单中读取/写入大量变量。
GetCurrentRamEditFrm().StatusBar1.Panels[1].Text := get_text(96);
Undeclared identifier 'StatusBar1'
RAM_Editor_SXcp.frmRAM_Editor_SXcp.StatusBar1.Panels[1].Text := get_text(96);
StatusBar
在两种形式中都这样声明:
type
TfrmRAM_Editor_SXcp = class(TForm)
StatusBar1: TStatusBar; // i.e. the scope is "published"
...
GetCurrentRamEditFrm().show();
最佳答案
您的函数将实例返回为 TForm
对StatusBar1
一无所知的人您已在 TfrmRAM_Editor_SXcp
中声明.GetCurrentRamEditFrm().show();
之所以有效,是因为 TForm
类有方法Show
.
您必须创建基本表单类型来声明要使用的所有变量和方法,或者声明两个表单将共享的接口(interface)。
解决方案一:
type
TBaseForm = class(TForm)
StatusBar1: TStatusBar;
type
TfrmRAM_Editor_SXcp = class(TBaseForm)
// this type will automatically inherit StatusBar1
function TfrmMain.GetCurrentRamEditFrm: TBaseForm;
{ Get the RAM Editor Form instance according to currenttly-set protocol. }
begin
if frmSetup.GetCurrentProtocol() = FooBus then
result := RAM_Editor_FooBus.frmRAM_Editor_FooBus
else
result := RAM_Editor_SXcp.frmRAM_Editor_SXcp;
end;
type
IBaseForm = interface
procedure SetStatus(const s: string);
end;
type
TfrmRAM_Editor_SXcp = class(TForm, IBaseForm)
StatusBar1: TStatusBar; // i.e. the scope is "published"
...
procedure SetStatus(const s: string);
procedure TfrmRAM_Editor_SXcp.SetStatus(const s: string);
begin
StatusBar1.Panels[1].Text := s;
end;
function TfrmMain.GetCurrentRamEditFrm: IBaseForm;
{ Get the RAM Editor Form instance according to currenttly-set protocol. }
begin
if frmSetup.GetCurrentProtocol() = FooBus then
result := RAM_Editor_FooBus.frmRAM_Editor_FooBus
else
result := RAM_Editor_SXcp.frmRAM_Editor_SXcp;
end;
GetCurrentRamEditFrm().SetStatus(get_text(96));
StatusBar
这样抓取 UI 元素。直接地。如果有一天你确实需要使用接口(interface)而不是通用基类,如果你已经有了方法,那么引入接口(interface)将非常容易。
关于delphi - 如何编写在运行时返回现有 TForm 实例的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27224439/
我经常将一个 TForm 后代嵌入到另一个 TForm 后代中,如下所示: var Form1: TForm1; Form2: TForm2; begin Form2.Parent
我注意到一些非常奇怪的事情。我在关闭表单时保留表单的顶部、左侧、宽度和高度属性,并使用此信息在通过使用先前存储的信息调用 SetBounds 再次打开表单时恢复表单的最后位置。这很有效,但前提是在设计
我已经在 stackoverflow 上找到了一些东西,但它并没有真正解决我的疑问。我知道创建对象的正确方法是在创建后将代码包围在 try-finally block 中。但是关于: procedur
我目前(在某些情况下依赖于配置文件)为多个表单创建父子关系。 也就是说一个父表单可以有多个子表单。 我遇到的问题是,当我最小化子窗体并且父窗口当前未最大化(我正在根据配置文件设置父窗体的大小)时,我丢
我有一个用 OwlNext 创建的主窗体,它调用一个在 vcl 中创建的对话框。 MyOtherFormClass Form2=new Form2(); void MyMainForm::ShowFo
我制作了一个 TForm 衍生产品,它的作用类似于组合的下拉部分、提示窗口或弹出菜单 - 一个临时的东西。它没有标题 - 它的 BorderStyle 设置为 bsNone。使用 Show 以非模态方
我正在尝试编写一个返回两个 TForm 之一的函数实例,根据用户设置的配置: function TfrmMain.GetCurrentRamEditFrm: TForm; { Get the RAM
我经常将主窗体句柄传递给其他线程,以便它们可以将消息发回主线程。我在 2013 年 9 月 28 日看到 Remy Lebeau 说: ...the TWinControl.Handle proper
我想使用泛型功能在Delphi 2010中实现单例模式。 type TgrsObj = class class function Singleton(O: T): T; static;
我正在编写一个组件,并希望将基本类型更改为 TForm,但是在运行时我收到错误“找不到资源 TMyComp”。我猜这是因为没有 dfm,但我不知道该怎么办。 谢谢 unit Unit65; inter
我的应用程序有一个主表单,该表单上有一个用于关闭/退出应用程序的按钮。目前它是通过调用 Windows 来关闭句柄编写的: SendMessage(Handle, WM_CLOSE, 0, 0); 但
我正在将一些函数转换为与 Windows 7 功能相关的 DLL。我无法通过 DLL 传递 TForm,因此我需要传递它的句柄。除了,一旦我在另一侧有了该句柄,如何将其重建回 TForm 实例?另外,
TForm.TipMode是什么?属性? 它已被添加到 Delphi XE3 中,但文档中没有提及此属性。 最佳答案 TTipMode 在 Controls.pas 中定义,用于跟踪位于 TabTip
我在 Delphi XE2 中编写了代码,运行完美。但在Delphi XE6中它不起作用。我创建了一个 Tform,其属性 AutoSize 为 true。我使用 TPanel 将 alTop 与按钮
当我显示一个表单时,我将它显示在上次使用 TForm.Left 的位置我保存在ini文件中的属性。 我想添加对多台显示器的支持,因为如果有 2 台显示器,Left 可以是 2500,所以 2 台显示器
我想制作使用tform作为参数的dll,简单的计划是如果将该表单传递给dll,则dll文件返回包含组件名称的数组。 可以将 tform 作为参数传递吗? 最佳答案 您的进程中很可能有两个 VCL 实例
作为 this question 的扩展: TForm.OnResize 有时会在首次显示表单之前触发,但并非总是如此。例如,如果 BorderStyle 为 bsDialog 或 bsNone,则
我目前正在为现有的 Delphi 应用程序编写一个窗口系统。 目前,该程序由许多全尺寸表单组成,这些表单按照需要的顺序以模态方式显示,并且用户无法移动其中任何一个。我的目标是让所有这些形式都可以移动。
这个问题看起来很简单,但由于某种原因我很难找到答案。 我有一个应用程序,可以将表单的大小和位置保存在 INI 文件中。这一切都很好,但是当您在最大化时关闭应用程序时,它将保存最大化表单的大小和位置,但
直到今天,我一直在使用以下代码来捕获应用程序主窗体中的 WM_DEVICECHANGE 消息,并且效果良好。但是,如果我尝试在自定义控件中使用它,我不会收到有关设备插入或删除的通知。发生了什么事?
我是一名优秀的程序员,十分优秀!