我希望我的行为按类别进行组织,但在"类别"框中,我无法添加新类别.
当我点击添加标准动作时,它有不同的类别,如"编辑","互联网",.... 甚至可以使用自定义类别,还是我遇到默认类别?
我是VS和C#的新手,但在Delphi方面有多年的经验.在Delphi中设计GUI时,我最喜欢的组件之一是ActionManager - 为操作分配事件处理程序以及启用/禁用它们的集中方式.令人惊讶的是,我在Visual Studio 2008 Professional中找不到这样的东西.我确信应该有第三方实现,但我更喜欢标准的东西.
谁能为我推荐一些东西?也许有一些替代方法可以有效地管理我缺少的GUI操作?
首先,我已经知道当你实现a时TSpeedButton,当你分配它时Glyph,如果你没有多个字形,那么NumGlyphs应该是1,当它被禁用时,它将自动使用相同的图像自动生成一个禁用版本的字形.
但是,在我的情况下,我正在为此速度按钮分配一个动作.在TActionManager既有的Images和DisabledImages指向非常相同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) 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.
这里不是表单上的任何色彩映射,经理风格是平台默认
我TActionManager在应用程序中定义了所有动作。我需要获取其所有动作的列表;当前,使用其Actions属性,我可以获取action(GetNamePath)的“路径”,但我也想获取其标题。
是否可以从动作管理器获取所有动作?
我正在尝试动态添加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没有初始化?
我正在编写一个类,它将大型遗留应用程序的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) 我正在使用 a TActionManager,其中每个操作都ShortCut分配有一个键盘。我想向用户显示代表键盘快捷键的文本。例如,F4或Ctrl+F或Ctrl+Shift+S。然而, 的TShortCut定义为:
type
TShortCut = Low(Word)..High(Word);
Run Code Online (Sandbox Code Playgroud)
如何获取用户可读的字符串来表示分配给操作的快捷方式?
在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
场景:
问题:
所以我可以这样写
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 ×10
tactionmanager ×10
delphi-2010 ×2
taction ×2
action ×1
c# ×1
datamodule ×1
delphi-xe ×1
delphi-xe2 ×1
delphi-xe4 ×1
menu ×1
modal-dialog ×1
vcl ×1
winforms ×1