Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi “关闭”后,我创建的操作将在功能区中被阻止;定制";窗户,为什么会这样?_Delphi_Delphi Xe2_Ribbon - Fatal编程技术网

Delphi “关闭”后,我创建的操作将在功能区中被阻止;定制";窗户,为什么会这样?

Delphi “关闭”后,我创建的操作将在功能区中被阻止;定制";窗户,为什么会这样?,delphi,delphi-xe2,ribbon,Delphi,Delphi Xe2,Ribbon,我使用Delphi XE2 TRibbon中的组件,当我打开“自定义”窗口向“RibbonQuickAccessToolbar”添加新操作时,我遇到了一个问题。当我关上窗户;由我创建的ActionManager操作在功能区中被阻止。为什么会发生这种情况 dfm: 如果没有为OnExecute事件分配事件处理程序,则会自动禁用操作。无论是在功能区的快速访问栏中,还是在TActionToolBar或TActionMainMenuBar中,还是在标准TButton中,只要将操作分配给其Action`属

我使用Delphi XE2 TRibbon中的组件,当我打开“自定义”窗口向“RibbonQuickAccessToolbar”添加新操作时,我遇到了一个问题。当我关上窗户;由我创建的ActionManager操作在功能区中被阻止。为什么会发生这种情况

dfm:


如果没有为
OnExecute
事件分配事件处理程序,则会自动禁用操作。无论是在功能区的快速访问栏中,还是在
TActionToolBar
TActionMainMenuBar
中,还是在标准
TButton中,只要将操作分配给其
Action`属性,都是如此。(默认情况下,它们在未分配OneExecute处理程序的情况下被禁用,因为没有OneExecute处理程序,如果启用了它,并且用户选择了它,则它将无事可做。)

标准操作通常会在内部分配一个默认的
OnExecute
处理程序。例如,
TEditCopy
操作会根据是否选择了要复制到剪贴板的文本自动启用/禁用自身

要启用自己的操作,请确保为事件分配了处理程序。您可以在运行时使用
TAction.OnUpdate
事件处理程序更改它是启用还是禁用。例如,要仅在数据库字段“已处理”为false时启用
DeleteRecord
操作,可以使用:

procedure TForm1.actDeleteRecordUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := not OrderDataProcessed.AsBoolean;
end;

请注意,每次应用程序空闲时,都会经常调用OnUpdate。这意味着您放在那里的任何代码都应该执行得非常快,因为它被频繁地调用;如果您将代码放在其中,需要很长时间才能运行,它将大大降低应用程序的用户界面,并增加CPU使用。

什么是“功能区中的阻塞”?你是说“禁用”吗?我刚试过你的示例代码,效果很好。我按照下面给出的相同说明(相反)将代码从这里移动到一个新的、空的Delphi应用程序。我运行它,通过拖动将您的
操作2
添加到快速访问栏,然后关闭自定义对话框并单击该操作。我收到了“你好,世界!”的信息。然后我更改了代码,将ShowMessage更改为“你好,世界!”!您单击了“+TAction(发件人)。标题),然后再次执行相同的操作。我收到的信息是“你好,世界!你点击了Action2”。所以两次添加的动作都很好,这就是你的代码。嗯。。这个问题不是事实,可能正在发生,这让我更加困惑。谢谢Ken,最好的尊敬Shi Ken,你测试了我的代码?哪个可能导致此错误?。我在家里的电脑上做了一个快速的例子,我安装了Delphi2010,同样的问题也发生了。在我的工作中,我安装了delphi xe2,出现了相同的错误。正如我在上一篇评论中所说的,“我刚刚尝试了您的示例代码”,它工作得很好。再读一遍我写的。我自己的行为,他们已经将事件分配给了OnExecuteSorry。您需要编辑您的问题(如我之前所问),以提供足够的信息,使我们能够重现问题。我可以做一个适合我的快速测试应用,如果你自定义快速访问栏来添加操作,Delphi附带的Ribbon演示也可以。因此,是您的代码中的某些内容导致了问题,而您没有提供足够的信息供我们使用,以了解是什么导致了问题。演示了如何使用OnUpdate。要启用/禁用,请使用
(发送方作为策略)。启用:=无论什么条件启用您的操作。例如,仅当数据库行尚未处理时才允许用户删除该行的操作可能是
(发送方为TAction)。Enabled:=not DataSetProcessed.AsBoolean。尝试对应用程序进行快速测试,看看是否出现上述情况。谢谢,我期待你的回复。向凯纳姆问好,不,我的工作不是重现你的问题。我不是那个寻求帮助的人。您创建了“应用程序快速测试**。您是向我们寻求帮助的人,而您遇到的问题需要解决。您的工作是向我们展示问题,以便我们能够帮助您,并将您的问题包括在内(正如我以前要求过您,但您仍然没有这样做)。
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ActnList, Vcl.ActnMan, Vcl.ToolWin,
  Vcl.ActnCtrls, Vcl.Ribbon, Vcl.RibbonLunaStyleActnCtrls;

type
  TForm1 = class(TForm)
    Ribbon1: TRibbon;
    RibbonPage1: TRibbonPage;
    RibbonGroup1: TRibbonGroup;
    RibbonPage2: TRibbonPage;
    ActionManager1: TActionManager;
    Action1: TAction;
    Action2: TAction;
    Action3: TAction;
    Action4: TAction;
    Action5: TAction;
    Action6: TAction;
    Action7: TAction;
    Action8: TAction;
    RibbonGroup2: TRibbonGroup;
    RibbonGroup3: TRibbonGroup;
    RibbonGroup4: TRibbonGroup;
    RibbonQuickAccessToolbar1: TRibbonQuickAccessToolbar;
    procedure Action1Execute(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Action1Execute(Sender: TObject);
begin
  ShowMessage('Hello world!');
end;

end.
procedure TForm1.actDeleteRecordUpdate(Sender: TObject);
begin
  (Sender as TAction).Enabled := not OrderDataProcessed.AsBoolean;
end;