gpt4 book ai didi

forms - 在同一应用程序中,以另一种独立的形式更改控件的状态

转载 作者:行者123 更新时间:2023-12-03 19:24:52 25 4
gpt4 key购买 nike

情况:


具有2个表单和1个DataModule单元的应用程序
这两个包含表单的单元在“用途”中都具有DataModule。包含Form1的单元在“使用情况”中包含包含Form2的单元
Form1上有两个按钮
两种形式同时显示,Form1不是Form2的父级,反之亦然


我需要的:

我需要能够通过对Form2进行操作来控制Form1上两个按钮的状态。

我做了什么:

我在Form1上使用了一个计时器,该计时器连续(250毫秒)检查DataModule中的一个变量,并根据其值更改Form1上按钮的状态。然后,我从Form2修改DataModule中的变量。

DataModule中的变量:

public
BtnToDisable: string;


Form1上的计时器:

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin
if Datamodule4.BtnToDisable = 'All' then
for i := 0 to Form1.ControlCount - 1 do
begin
if Form1.Controls[i].ClassType = TButton then
Form1.Controls[i].Enabled := False;
end
else if Datamodule4.BtnToDisable = 'None' then
for i := 0 to Form1.ControlCount - 1 do
begin
if Form1.Controls[i].ClassType = TButton then
Form1.Controls[i].Enabled := True;
end
else if Datamodule4.BtnToDisable = 'Button1' then
for i := 0 to Form1.ControlCount - 1 do
begin
if Form1.Controls[i].Name = 'Button1' then
Form1.Controls[i].Enabled := False;
end
else if Datamodule4.BtnToDisable = 'Button2' then
for i := 0 to Form1.ControlCount - 1 do
begin
if Form1.Controls[i].Name = 'Button2' then
Form1.Controls[i].Enabled := False;
end;
end;


Form2上的操作:

DataModule4.BtnToDisable := 'All'     // All, None, "name"
DataModule4.BtnToDisable := 'Button1' // All, None, "name"
...


问题:

是的,它可以工作,但是在更复杂的情况下,要启用/禁用许多按钮,使用更多表单以及更多可能的组合(启用三个特定的按钮,禁用所有其他按钮等),它变得很复杂,并且难以维护。考虑到我没有可以从Form2访问的Form1对象,是否可以直接访问Form1上的那些按钮?

最佳答案

您始终可以访问每个Form对象,即使您不直接use它们的单位也是如此。所有创建的TForm对象都存储在Forms[]单元中全局Screen对象的Forms属性中。

话虽如此,我建议不要使用TTimerTAction(List).OnUpdate事件处理程序来执行Button更新,而不是使用TApplication(Events).OnIdle。每当主UI消息循环完成对来自主消息队列的消息的处理并使其空闲以等待新消息到达时,就会触发这些事件。当您开始处理需要更新的多个表单时,可以为每个表单提供自己的TAction(List)TApplicationEvents

我还建议定义一个Enum来代表每个按钮,然后将BtnToDisable变量更改为这些Enum值的Set。这样,您可以禁用所需的任何按钮组合。将这些Enum值分配给每个Button的Tag属性,或使用Dictionary或类帮助器,或将Enum值与Button对象关联的任何其他方式。然后,当需要更新时,您可以简单地遍历Button,如果给定Button的关联Enum值位于Set中,则禁用该Button,否则启用它。完全不需要检查Name属性。

最后,我建议让一个Form将其Button存储在可以循环的数组或T(Object)List中,而不是每次都循环遍历Form的Controls[]属性。

关于forms - 在同一应用程序中,以另一种独立的形式更改控件的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49701999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com