标签: tactionmanager

Delphi:如何在ActionManager中添加新类别?

我希望我的行为按类别进行组织,但在"类别"框中,我无法添加新类别.

当我点击添加标准动作时,它有不同的类别,如"编辑","互联网",.... 甚至可以使用自定义类别,还是我遇到默认类别?

delphi delphi-2010 tactionmanager

8
推荐指数
1
解决办法
3322
查看次数

在Visual Studio中是否有Delphi的ActionManager替代品

我是VS和C#的新手,但在Delphi方面有多年的经验.在Delphi中设计GUI时,我最喜欢的组件之一是ActionManager - 为操作分配事件处理程序以及启用/禁用它们的集中方式.令人惊讶的是,我在Visual Studio 2008 Professional中找不到这样的东西.我确信应该有第三方实现,但我更喜欢标准的东西.

谁能为我推荐一些东西?也许有一些替代方法可以有效地管理我缺少的GUI操作?

c# delphi visual-studio winforms tactionmanager

6
推荐指数
1
解决办法
1326
查看次数

TSpeedButton with TAction - 自动生成的禁用图像仅考虑黑色

首先,我已经知道当你实现a时TSpeedButton,当你分配它时Glyph,如果你没有多个字形,那么NumGlyphs应该是1,当它被禁用时,它将自动使用相同的图像自动生成一个禁用版本的字形.

但是,在我的情况下,我正在为此速度按钮分配一个动作.在TActionManager既有的ImagesDisabledImages指向非常相同TImageList.我还测试了没有任何DisabledImages分配,以及使用全黑蒙版创建图像的副本,并通过分配DisabledImages.

启用时,字形显示正常(基于操作上设置的图像).但是当它被禁用时,图像中只有纯黑色将用于禁用的图像.任何具有除纯黑色之外的任何颜色,甚至略微偏黑的颜色都被完全忽略,并且在渲染禁用图像时不包括在内.

以下是测试启用图像与自动生成的禁用图像之间的比较.图像只是一个16x16位图,有一些垂直线.从最右边开始,一条完全黑色的线条,然后是它左边略微更亮的线条.

比较启用和禁用的操作

如您所见,禁用时,它只考虑完全黑线.下一条线只比完全黑色轻一点.

我不能自己分配Glyph属性,因为它将被分配给它的动作覆盖.我也无法在图像列表上设置双字形宽图像,因为这些图像广泛用于许多其他没有多个字形概念的地方.我也不想对我的图像使用全黑.

当分配了一个动作时,如何禁用TSpeedButton(由于禁用TAction)以显示禁用(灰显)图像?

注意:同样的情况发生在TBitBtn或依赖于任何控制依赖于Glyph.


u44169002.pas

unit u44169002;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, System.ImageList,
  Vcl.ImgList, System.Actions, Vcl.ActnList, Vcl.PlatformDefaultStyleActnCtrls, Vcl.ActnMan, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Actions: TActionManager;
    actTest: TAction;
    ImageList: TImageList;
    SpeedButton1: TSpeedButton;
    BitBtn1: TBitBtn;
    procedure actTestExecute(Sender: TObject); …
Run Code Online (Sandbox Code Playgroud)

delphi tactionmanager delphi-10.1-berlin

6
推荐指数
1
解决办法
631
查看次数

解决TActionMainMenuBar绘画错误,其中项目未取消选择

TActionMainMenuBar有一个绘制根元素没有子项的错误.

使用Delphi XE2/w7-32bit**

如何重现:
使用TActionMainMenuBar构建菜单,向其添加一些操作:

 file  | options | help
 - New
 - Open
 - Save
  -Exit
Run Code Online (Sandbox Code Playgroud)

为所有操作分配一个空方法

procedure TfrmMain.ActionExecute(Sender: TObject); 
begin 
// 
end;
Run Code Online (Sandbox Code Playgroud)

现在运行应用程序并尝试单击选项或帮助元素.
现在单击表单,但菜单元素仍然按下!

有任何变通方法吗?

upd:看截图,菜单元素是down,但是鼠标光标不在菜单上,而autocheck是false,并且检查也是false.
在此输入图像描述
这里不是表单上的任何色彩映射,经理风格是平台默认

delphi menu tactionmanager

5
推荐指数
1
解决办法
683
查看次数

如何从TActionManager获取所有TAction?

TActionManager在应用程序中定义了所有动作。我需要获取其所有动作的列表;当前,使用其Actions属性,我可以获取action(GetNamePath)的“路径”,但我也想获取其标题。

是否可以从动作管理器获取所有动作?

delphi taction delphi-xe tactionmanager

3
推荐指数
1
解决办法
570
查看次数

如何以编程方式将操作添加到Delphi 2010中的操作管理器

我正在尝试动态添加actionitems,我可以添加项目,当我这样做时它可以工作:

HostActionItem := ActionManager.ActionBars[0].Items[0].Items[2];
  NewItem := HostAction.Items.Add;
  NewItem.Action :=  MyActionToPerform;
  NewItem.Caption := Description;
  NewItem.ImageIndex := 1;
  NewItem.Tag := 13;
Run Code Online (Sandbox Code Playgroud)

但是,当操作Execute方法触发时,我尝试从Sender对象获取ActionComponent,如下所示:

  if (Sender is TAction) then
  tag := (Sender As TAction).ActionComponent.Tag;
Run Code Online (Sandbox Code Playgroud)

但是ActionComponent总是为零.为什么ActionComponent没有初始化?

delphi taction delphi-2010 tactionmanager

2
推荐指数
1
解决办法
2958
查看次数

如何在运行时递归创建ActionBars?

我正在编写一个类,它将大型遗留应用程序的TMainMenu层次结构映射到TActionMainMenuBar项目.

从Steve Trevethen的EDN CodeCentralC文章中大量借鉴的最重要的方法看起来像这样.我为长度道歉,但这可能是我在这种情况下可以有意义地显示的最短代码长度:

procedure TMainMenuSkin.DoLoadMenu(
    ActionList: TCustomActionList;
    Clients: TActionClients;
    AMenu: TMenuItem;
    SetActionList: Boolean = True;
    bRecurseFlag:Boolean = False);
var
  I: Integer;
  J: Integer;
  AC: TActionClientItem;
  ca : TCustomAction;
  newAction : TSkinnedMenuAction;
  aci:TActionClientItem;
  submenuitem : TMEnuItem;

  procedure PopulateNodeFromMenuItem(menuitem:TMenuItem);
  begin
        newAction := TSkinnedMenuAction.Create(Application.MainForm);
        menuitem.FreeNotification(newAction);
        newAction.FMenuItem := menuitem;
        newAction.Name := 'action_'+newAction.FMenuItem.Name;
        FNewMenuActions.Add(newAction);
        newAction.ActionList := ActionManager;
        newAction.Tag := menuitem.Tag;
        ca := newAction;
        ca.ImageIndex  := menuitem.ImageIndex;
        ca.HelpContext := menuitem.HelpContext;
        ca.Visible     := menuitem.Visible;
        ca.Checked     := menuitem.Checked;
        ca.Caption     := menuitem.Caption;
        ca.ShortCut    := …
Run Code Online (Sandbox Code Playgroud)

delphi action tactionmanager delphi-xe4

2
推荐指数
1
解决办法
1178
查看次数

如何在操作中从 TShortCut 获取快捷方式字符串?

我正在使用 a TActionManager,其中每个操作都ShortCut分配有一个键盘。我想向用户显示代表键盘快捷键的文本。例如,F4Ctrl+FCtrl+Shift+S。然而, 的TShortCut定义为:

type
  TShortCut = Low(Word)..High(Word);
Run Code Online (Sandbox Code Playgroud)

如何获取用户可读的字符串来表示分配给操作的快捷方式?

delphi keyboard-shortcuts tactionmanager

2
推荐指数
1
解决办法
2884
查看次数

当Action Manager在数据模块中时,未捕获键盘快捷键?

在Delphi XE2中,我的应用程序中有一个数据模块,数据模块中有一个Action Manager.我已经为每个操作分配了键盘快捷键,但是当我尝试在应用程序中使用这些快捷键时,它并没有捕获它们.

我正在应用程序的初始化中创建数据模块(由于IDE扭曲了项目主文件中的代码,它被移动到另一个单元)...

unit AppInit;

interface

uses
  Vcl.Forms,
  Vcl.Themes,
  Vcl.Styles,
  uMain,
  uDataModule
  ;

procedure RunApp;

implementation

procedure RunApp;
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'My App';
  TStyleManager.TrySetStyle('Carbon');
  DM:= TDM.Create(nil);
  try
    Application.CreateForm(TfrmMain, frmMain);
    Application.Run;
  finally
    DM.Free;
  end;
end;

end.
Run Code Online (Sandbox Code Playgroud)

创建这样的数据模块的原因是,所有各种形式的应用程序都能够使用其中的组件,特别是Action Manager.必须在创建主窗体之前创建它.

当操作管理器位于数据模块中时,如何使操作项的键盘快捷键起作用?

delphi keyboard-shortcuts datamodule delphi-xe2 tactionmanager

1
推荐指数
1
解决办法
453
查看次数

如何以非模态形式禁用所有组件?

场景:

  • TActionManager,TAction和TButton(与此操作相关联)
  • ActionManager在其OnUpdate事件处理程序中不断启用Action
  • 动作事件处理程序中的代码使用ShellExecAndWait方法启动外部程序(使用Jedi代码库JCL)
  • 要求:应用程序不应允许再次快速单击按钮启动应用程序两次

问题:

  • ShellExecAndWait不会阻止应用程序消息循环,因此用户可以在外部应用程序仍处于打开状态时单击
  • 如果他的Action处理程序方法在ShellExecAndWait调用之前禁用Action,Update方法将立即重新启用它

所以我可以这样写

procedure TMyForm.OnMyAction(Sender: TObject);
begin
  try  
    // notify Action Manager that the Action is temporarily disabled
    SomeGlobalFlag := True;

    // disable the action 
    (Sender as TAction).Enabled := False;

    // do the call
    ShellExecAndWait( ... );

  finally

    // enable the action 
    (Sender as TAction).Enabled := True;

    // allow ActionManager to control the action again
    SomeGlobalFlag := False; 

  end;
end;
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法?正如这个问题的标题所说 - 我可以阻止执行外部应用程序的输入吗?

delphi vcl modal-dialog tactionmanager

0
推荐指数
1
解决办法
5912
查看次数