如何获取在RunTime添加的ActionClient ChildItem的索引和标题

时间:2009-09-17 23:25:00

标签: delphi

这在运行时从stringList:

添加一个ActionClientItem
var
  ActionClient: TActionClient;
  ChildItem: TActionClientItem;
if FileExists( ARecentFilesFilename ) then
begin
  ARecentFilesList.LoadFromFile( ARecentFilesFilename );
  // remove any duplicates
  RemoveDuplicates( ARecentFilesList );
  for i := 0 to ARecentFilesList.Count - 1 do
    begin
      Ribbon1.AddRecentItem( ARecentFilesList.Strings[ i ] );
      ActionClient := RibbonGroup1.ActionControls[ 1 ].ActionClient;
      ChildItem := ActionClient.Items.Add;
      ChildItem.Tag := i;
      ChildItem.Action := ActionOpenFileFromButton1;
      ChildItem.Caption := ARecentFilesList.Strings[ i ];
    end;
end;

这会尝试获取所选ActionClientItem的文件名,但失败了。

procedure TMainForm.ActionOpenFileFromButton1Execute( Sender: TObject );
var
  ActionClient: TActionClient;
  ChildItem: TActionClientItem;
  AFilename: string;
  AIndex: integer;
begin
  ActionClient := RibbonGroup1.ActionControls[ 1 ].ActionClient;
  AIndex := ActionClient.Index;
  ChildItem := ActionClient.Items.ActionClients[ AIndex ];
  AFilename := ChildItem.Caption;
  OpenZipFileFromChildButton( AFilename );
end;

我做错了什么? 有没有不同的方法呢?

1 个答案:

答案 0 :(得分:1)

您可以使用Sender来访问文件名,但它是TAction,因此您需要为每个最近的文件执行一次操作。将它们添加到ActionManager中,并在列表中保留对它们的引用。

修改

如果您的表单上没有TActionManager,请在其上放一个并将其与功能区关联。然后,创建说10个动作,将它们称为RecentFileAction1,RecentFileAction2等。然后,在表单的OnCreate事件处理程序中,将它们添加到FRecentFileActions列表中:

TMainForm = class (TForm)

  //...

private
  FRecentFileActions: TList<TAction>;

  //...

end;


procedure TMainForm.FormCreate(ASender: TOject);
begin
  FRecentFileActions := TList<TAction>.Create;

  FRecentFileActions.Add(RecentFileAction1);
  FRecentFileActions.Add(RecentFileAction2);
  FRecentFileActions.Add(RecentFileAction3);
  // etc

  LoadRecentFilenames;
  RefreshActions;

end;

<强> /修改

然后,将每个操作的标题更改为文件的文件名。

procedure TMainForm.RefreshActions;
var
  i: integer;
begin
  for i := 0 to FRecentFileList.Count - 1 do
  begin     
    if i < FRecentFileActions.Count then
      FRecentFileActions[i].Caption := FRecentFileList[i];
  end;
end;

因此,最后,您的事件处理程序可能如下所示:

procedure TMainForm.ActionOpenFileFromButton1Execute( Sender: TObject );
var
  LAction: TAction;
begin
  LAction := Sender as TAction;
  OpenZipFileFromChildButton(LAction.Caption);
end;

N - [