- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最初的问题必须是如何首先访问组件,但是我设法设法弄清楚了。我只是在学习Delphi,所以我很容易出现愚蠢和明显的问题。我还处在一个阶段,实际上我并没有在写任何有用的东西,而只是在弄乱随机的东西以了解它是如何工作的,甚至可以学习一些东西。
文字墙传来,我想解释一下我现在正在探索的东西...
基本上我有一个带有button1的form1,按下它会创建一个frame2,那个frame2有一个button2,按下button2会在frame2内创建一个frame3(它是frame3的父级和所有者)。每个框架都有另一个freeandnil按钮。按下每个按钮1/2/3时,它将被禁用以防止创建多个实例。我的原始问题是,在使用freeandnil-button之后,我无法访问上一帧的按钮(对于窗体,它工作正常,form1.button1.enabled:=true
在frame2内工作正常),该按钮被禁用以便重新启用它(frame2.button1.enabled:=true
我认为从frame3内部创建访问冲突。
假设我将来写一些需要这种交流的东西吗?因此,我在每个框架上添加了一个编辑框,在另一个框架上添加了一个按钮来更改编辑框文本,这是我目前的工作解决方案:
procedure TFrame2.Button3Click(Sender: TObject);
var i,z:integer;
begin
for i := 0 to ComponentCount - 1 do
if components[i] is tframe3 then
for z := 0 to (components[i] as tframe3).ComponentCount - 1 do
if (components[i] as tframe3).Components[z] is TEdit then
((components[i] as tframe3).Components[z] as TEdit).Text:='ping';
end;
procedure TFrame3.Button3Click(Sender: TObject);
var i:integer;
begin
for i := 0 to parent.ComponentCount-1 do
if parent.components[i] is TEdit then
(parent.Components[i] as TEdit).Text:='pong';
end;
something AS something
这么多组件并不真正正确或有效。
frame2.button1.enabled:=true
)从“子框架”访问“父框架”组件的原因吗?
最佳答案
要点:
控件/组件通常设置为由控制其生命周期的窗体/框架拥有,并以显示它们的控件为父。因此,当您创建一个TEdit放在TForm的TPanel上时,您将TForm设置为所有者,并将TPanel设置为TEdit的父级。对于框架,您可以执行相同的操作:框架是框架上所有控件的所有者,控件是框架上所容纳的任何容器(可以是框架本身)的父级,因此负责显示(绘画)它。
当您迭代控件的子代时,遍历Components时会使用Owner关系。遍历Controls使用Parent关系。因此,如果要遍历控件,则上面的代码已经做的工作要少得多。
当然,您可以“笨拙”地引用其他控件,但必须提供访问方法。如果需要其他控件(而不仅仅是子框架),则至少必须声明一个方法来检索该控件。有很多方法可以做到这一点。一种是在需要时“询问”表单(使用表单上的方法),或者在表单创建时在框架上设置属性...
避免访问表单和框架的已发布属性。它们主要用于Delphi的流系统。当您使用上述方法将应用程序捆绑在一起时,它很快就会变成一团糟。
示例出现(今天晚上的某个时候),这将花费我一些时间来解释,我还有工作要做...
以下示例仅处理框架之间的乒乓游戏。从自己的事件处理程序之一中释放任何形式或框架并不是一个好主意。为此使用Release
方法,因为它可防止表单/框架在释放后处理消息。 (顺便说一下,关于SO的很多问题)。另外,当您从其自己的按钮之一释放框架时,需要注意创建该框架的框架有机会将其持有的对该框架的引用无效,否则您将需要进行一些有趣的设置调试混乱。查看“通知”和“ NotifyControls”,以及通过表单和框架自动发送给其所有者/父母的通知,以便它们可以从其组件/控件集合中删除该控件。在您的示例中,如果要从其自己的“ FreeAndNil”按钮的OnClick事件处理程序中释放Frame3,则必须确保Frame2对删除(我认为)通知消息作出响应,并且对框架3持有的所有引用都为nil(除此以外)那些将在组件/控件集合中自动清除的文件)。
现在,乒乓球比赛。有两种方法可以解决此问题。
方法1
第一种方法是您已经尝试过循环另一框架的组件。虽然这当然是避免必须“使用”另一个框架的一种方法,但它很麻烦而且不够简洁。另外,当您在窗体/框架上获得更多控件时,您将必须在名称上添加对勾以知道您具有正确的TEdit。然后,您也可以直接使用该名称,特别是因为一个框架在其uses子句中已经具有另一框架,因为它是创建它的。
// PingFrame (your Frame2)
uses
...
Pong_fr;
type
TPingFrame = class(TFrame)
...
procedure CreateChildBtnClick(Sender: TObject);
procedure PingPongBtnClick(Sender: TObject);
private
FPong: TPongFrame; // This is the "extra" reference you need to nil when
// freeing the TPongFrame from one of its own event handlers.
...
end;
procedure TPingFrame.CreateChildBtnClick(Sender: TObject);
begin
CreateChildBtn.Enabled := False;
FPong := TPongFrame.Create(Self);
FPong.Parent := ContainerPnl;
FPong.Align := alClient;
end;
procedure TPingFrame.PingPongBtnClick(Sender: TObject);
begin
if Assigned(FPong) then
FPong.Edit1.Text := 'Ping';
end;
// PongFrame (your Frame3)
type
TPongFrame = class(TFrame)
...
procedure PingPongBtnClick(Sender: TObject);
end;
implementation
uses
Ping_fr;
procedure TPongFrame.PingPong1BtnClick(Sender: TObject);
begin
(Owner as TPingFrame).Edit1.Text := 'Pong called';
end;
type
TPingFrame = class(TFrame)
...
public
procedure Ping;
end;
implementation
procedure TPingFrame.PingPongBtnClick(Sender: TObject);
begin
if Assigned(FPong) then
FPong.Ping;
end;
procedure TPingFrame.Ping;
begin
Edit1.Text := 'Someone pinged me';
end;
type
TPongFrame = class(TFrame)
...
public
procedure Ping;
end;
implementation
procedure TPongFrame.PingPongBtnClick(Sender: TObject);
begin
(Owner as TPingFrame).Ping;
end;
procedure TPongFrame.Ping;
begin
Edit1.Text := 'Someone pinged me';
end;
type
TPongFrame = class(TFrame)
private
FOnPingPongClicked: TNotifyEvent;
protected
procedure DoPingPongClicked;
public
property OnPingPongClicked: TNotifyEvent
read FOnPingPongClicked write FOnPingPongClicked;
end;
procedure TPongFrame.PingPongBtnClick(Sender: TObject);
begin
DoPingPongClicked;
end;
procedure TPongFrame.DoPingPongClicked;
begin
if Assigned(FOnPingPongClicked) then
FOnPingPongClicked(Self);
end;
type
TPingFrame = class(TFrame)
...
protected
procedure HandleOnPingPongClicked(Sender: TObject);
procedure TPingFrame.CreateChildBtnClick(Sender: TObject);
begin
CreateChildBtn.Enabled := False;
FPong := TPongFrame.Create(Self);
FPong.Parent := ContainerPnl;
FPong.Align := alClient;
// Listen to event fired by PongFrame whenever it's PingPingBtn is clicked
FPong.OnPingPongClicked := HandleOnPingPongClicked;
end;
procedure TPingFrame.HandleOnPingPongClicked(Sender: TObject);
begin
Edit1.Text := 'OnPingPongClicked event was fired';
end;
procedure TPingFrame.HandleOnPingPongClicked(Sender: TObject);
var
Pong: TPongFrame;
begin
// This checks that Sender actually is a TPongFrame and throws an exception if not
Pong := Sender as TPongFrame;
// Use properties from the Pong instance that was passed in
Edit1.Text := 'OnPingPongClicked event was fired by ' + Pong.Name;
end;
关于delphi - 使用frame2访问frame1的组件,其中frame2在frame1上,在delphi中,动态创建帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662472/
最近,我在 XCode 上的调试器停止正常工作,并给出了以下错误: 此帧内的前一帧(gdb 无法展开超过此帧) 我已经浏览过 SO 的另一个线程,谈论丢失的符号。我通过删除符号目录并让它从 iPod
当我在设备上遇到断点时,出现以下调试器错误: 来自调试器的错误:此帧内的上一帧(gdb 无法展开超过此帧) 当应用程序遇到断点时,就会发生这种情况。如果我点击调试器中的继续按钮,它会愉快地继续,直到下
如何在 WinRT XAML 应用程序中操作框架的历史记录? 用户将从我的中心页面开始,他们可以在其中选择一个现有项目以转到其编辑屏幕,或者他们可以选择“新项目”。 “新项目”将引导他们完成一个简短的
2 帧,我希望第 2 帧“覆盖”/更新第 1 帧。基本上,其中 Table1-colB-value = Table2-oldB-value,用 Table2-newB-value 覆盖 Table1-
我正在尝试逐帧动画,但它给了我一个强制关闭,我不确定为什么它给我一个强制关闭。在我看来一切都很好。 这是我的代码,我希望有人能帮忙吗?提前致谢。 动画测试.java import android.ap
这是我的主课。 package pomsystem; public class POMSystem { public static void main(String[] args) {
如果为TRUE,我想从函数返回一个data.frame,否则使用return(ifelse(condition, mydf, NA)) 返回NA 但是, ifelse 会从 data.frame 中删
我正在处理两个 csv 文件并导入为数据框 df1 和 df2 df1 有 50000 行,df2 有 150000 行。 我想比较(遍历每一行)df2 的“时间”df1,求时间差,返回所有列的值对应
我将许多文件夹中的小文本文件读取到一个列表中。因此,我有一个长度为 n 的列表,其中包含 2 个 data.frames。 这是列表元素 3 的示例(在问题末尾输入) ip_list[[3]] $`d
为了找出数据框 df.a 是否是数据框 df.b 的子集,我做了以下操作: df.a semi_join(df.b, df.a) Joining by: c("x", "y") x y 1 1
在某些情况下,出于实现原因,我有一个只包含一个列的 data.frame df=as.data.frame(alpha=1:15) 如果我现在使用 df[-1, ] 它返回一个向量,但我想将它保留为一
Windows 8.1 商店应用中的 Frame.Navigate() 和 this.Frame.Navigate() 有什么区别? 这有什么区别 Frame.Navigate(typeof(Logi
我有两个 data.frames (df1, df2),我想用 df1$V2 的值替换 P1-P10 列中的字母值,但保留前两列df2. df1 = data.frame(V1=LETTERS, V2
有没有更好的方法来制作与现有 data.frame 具有相同维度、列名和行名的空白 data.frame? BAM<-read.table(~/myfile) # 10 rows and 10 co
我有一个列表 data.frame s。例如 set.seed(1) my_list result.df id var_p var_m var_d var_a
假设我有两个数据框 df1 和 df2 如下 Df1 Id Price Profit Month 10 5 2 1 10 5 3 2 10 5 2
我将创建一个网站,除了它自己的内容之外,它还将链接(在 iframe 中)到世界最大的报纸网站,如纽约时报、金融时报和其他一些网站。 但是我遇到了框架许可的问题。例如,纽约时报向我展示了一个错误 Lo
假设我有一个 data.frame: df x x A 1 10 2 20 3 30 从文档中(参见 ?"[" )您可以找到: If drop=TRUE the result is coer
我有一个想要克隆的现有 data.frame,但没有其中的值。 IE。我希望新框架具有与现有框架相同的列名称和类型。原始帧的大小可能为 GB 量级,因此复制和删除数据似乎不是正确的方法,并且迭代现有列
给定两个在列名称/数据类型方面相同的数据帧,其中某些列唯一标识行,是否有一种有效的函数/方法可以让一个数据帧“更新”另一个数据帧? 例如,在下面的例子中,原始和替换由'Name'和'Id'标识>。 g
我是一名优秀的程序员,十分优秀!