2009-09-17 22 views
0

這在運行時增加了一個ActionClientItem從的StringList:如何獲得ActionClient ChildItem添加的指標和標題在運行時

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; 

我在做什麼錯? 有沒有不同的方式做到這一點?

+2

「它失敗」 是沒有問題的充分說明。它不會編譯?它會給你一個你沒有想到的結果嗎?它會崩潰嗎?它是否會讓您的打印機着火?如果是,請告訴我們錯誤信息或發送打印機照片。 – 2009-09-17 23:38:25

+0

AIndex返回不正確的索引,因爲它總是返回「1」。我認爲它是返回ActionClient的索引,而不是TActionClientItem ....你如何獲得TActionClientItem的索引? – 2009-09-18 00:49:10

+0

爲什麼*不會成爲ActionClient的索引?您通過閱讀「ActionClient.Index」來分配它。 – 2009-09-18 02:17:16

回答

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 - [

+0

+1絕對要走的路。我可能會創建一個TMRUAction或類似的東西,它將整個文件路徑保存在一個屬性中,但是您的基本策略是點對點的。 – 2009-09-18 07:27:29

+0

在此之後花費了一整天的時間後,我仍然無法獲得演示中所選動作的索引或標題。如果FRecentFileActions是一個TA,你不能通過它進行交流,因爲TAction每個動作只有一個標題。你必須使用Actionlist或ActionManager來做到這一點嗎? if if 2009-09-18 22:16:04

+0

是的,你需要一個ActionManager或一個ActionList。我以爲你有一個ActionManager,因爲你似乎在使用功能區。在我的答案頂部看到我的新編輯。 – Nat 2009-09-20 01:14:45