2010-04-16 108 views
2

我有一個窗體,其大部分功能使用標準TAction實現。我有一個菜單,一個工具欄和一些按鈕。我已經使用TEditCopy和TEditPaste操作實現了剪貼板複製/粘貼,並且沒有任何代碼。它適用於我有的TEdit和TMemo盒子。擴展delphi的TEditCopy動作也複製列表框項目到剪貼板

現在,我希望它也能與TListBox一起工作。具體來說,我希望能夠使用相同的菜單項,快捷鍵和工具按鈕將所選列表項複製到TListBox中。

所以,我相信我需要延長TEditCopy行動。但對我來說這似乎並不那麼直截了當。特別是,TEditAction檢查集中控制是一個TCustomEdit控件,它不是TListBox控件。我有點害怕,這將是太多的工作。

明顯的選擇是忘記標準操作並在通用TA的OnExecute方法中實現複製到clipbard。但是,在放棄之前,你是否有一些想法,暗示或竅門能夠幫助我擴展標準的TEditCopy操作?

回答

0

您應該重寫TAction的事件處理程序或創建一個將來自TEditAction/TEditCopy的代碼與TListBox的額外處理結合在一起的新的後代。

操作的擴展點是設置OnExecute/OnUpdate事件處理程序,並且在這裏不起作用,因爲它會禁用現有的TEdit處理。你可以從TEditCopy中下載並重寫這些方法,但是它可能會和從TAction直接下降的新類一樣多。可能還有其他一些低級別的破解方法可行,但我沒有看到它,即使存在,也可以保證比文檔化方法更易於維護。

+0

感謝您的回答,這正是我認爲我需要的,以及我很想做的事情。在我自己的新TEditCopyAction中重新實現完整的TEditAction和TEditCopy以處理TListBox。 – 2010-04-16 16:32:58

+0

我已經提出了一個解決方案,請參閱下面的我自己的答案。爲了感謝你的興趣,你應該接受你的答案。謝謝 - – 2010-04-17 10:15:38

+0

@克雷格彼得森:你能否支付一點關注這個[貼問題](http://stackoverflow.com/q/8652072/744588)處理TAction呢? – menjaraz 2012-01-02 07:41:50

0

我記得在網上看了一些關於它的東西,但是我找不到鏈接。如果我找回來,我會更精確地告訴你。

但是我記得的是,一個動作檢查是否可以使用「TBasiAction.HandlesTarget」方法(它是虛擬的)應用(或不)到特定目標。執行Action時,應該檢查「HandlesTarget」,「UpdateTarget」和「ExecuteTarget」(TBasicAction的所有成員)的方法。

再一次,如果我找到鏈接回來,更多關於此。

[編輯]

這不是我一直在尋找的職位,但它似乎準確地描述你想要什麼: etutorials : Defining Custom Actions

+0

謝謝,我也找到了這個鏈接。雖然它提供了完整描述實施全新的TAI所需的內容,但它並不適用於我的案例。在我的情況下,我已經使用標準的TEditCopy操作,我想保留並擴展以處理集中控件是TListbox的情況。 – 2010-04-16 16:30:47

2

這是我出來實施的黑客攻擊。

它不需要手動更改我已有的ActionList或MenuItems和ToolButtons,因爲我保留同名 TEditCopy for class。

type 
TEditCopy = class(StdActns.TEditCopy) 
    public 
    function HandlesTarget(Target: TObject): Boolean; override; 
    procedure ExecuteTarget(Target: TObject); override; 
    procedure UpdateTarget(Target: TObject); override; 
    end; 

它擴展了標準的TEditCopy動作,同時支持TListBox所需的功能。

function TEditCopy.HandlesTarget(Target: TObject): Boolean; 
begin 
    result:=(inherited handlesTarget(Target)) or (target is TListbox); 
end; 

procedure TEditCopy.ExecuteTarget(Target: TObject); 
begin 
    if (target is TListBox) and (TListBox(Target).ItemIndex<>-1) then 
    clipboard.AsText:=TListBox(Target).Items[TListBox(Target).ItemIndex] 
    else 
    inherited; 
end; 

procedure TEditCopy.UpdateTarget(Target: TObject); 
begin 
    if target is TListbox then 
    Enabled := true 
    else 
    inherited; 
end; 

應用程序的其餘部分沒有改變。所有的複製/粘貼功能仍然是在沒有代碼的情況下實現的。

+0

您應該更改UpdateTarget,使Enabled語句爲'Enabled:= TListBox(Target).ItemIndex <> -1)'。使用當前的代碼,即使沒有選擇,它也會被啓用,但ExecuteTarget會調用繼承的處理程序,並且會因爲期望進行編輯而崩潰。 – 2010-04-17 12:34:50

+0

是的,你是對的!實際上,這絕不會發生在我的生產代碼中(我有兩個IF,而不是一個IF,只有一個ELSE),它只是我在這裏複製的代碼,有錯誤。 – 2010-04-17 17:18:36