2011-02-13 112 views
4

我正要用一個TButtonedEdit控件替換TEdit + TButton組合,但是當我嘗試測試它時,我發現無法「按下」(右)按鈕鍵盤。使用鍵盤「按下」TButtonedEdit按鈕使用鍵盤

我嘗試了Alt + Enter,Alt + Down,Alt + Right,與Ctrl和其他幾個組合鍵相同的按鍵,但都沒有工作。 VCL的資料也沒有說明這個問題(但嘿,「專業程序員不會看VCL資源」)

我錯過了什麼嗎?

這是在Windows XP的Delphi 2010上,TButtonedEdit組件在Delphi 2009 IIRC中引入的。

注意:我接受了Andreas Rejbrand的回答,因爲它回答了問題。但我也爲自己實際上可能感興趣的人的利益添加了自己的答案。

+3

專業程序員廣泛研究RTL/VCL源代碼。 – 2011-02-13 11:32:02

+1

@安德里亞斯:是的,我知道,我當然可以。這僅僅是指英巴卡迪諾評論不包括新入門級德爾福版本的RTL/VCL源代碼。 – dummzeuch 2011-02-13 12:48:00

回答

3

不,沒有這樣的鍵盤快捷鍵,部分(可能)是由於鍵盤快捷鍵應該執行的按鈕(左鍵或右鍵)的模糊性。

我總是做這樣的:

procedure TForm1.ButtonedEdit1KeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
    if (Key = VK_RETURN) and (ssCtrl in Shift) then 
    ButtonedEdit1RightButtonClick(Sender); 
end; 

的Ctrl + Enter快捷鍵是很自然的,如果按鈕,將顯示一個模式對話框(幫助用戶填寫編輯框),或類似的東西。如果它執行以編輯文本作爲參數的過程(例如,地址欄或搜索框),則單獨輸入更合適。如果按鈕是清除按鈕(清除編輯框),則Escape可能是最好的快捷方式,或者根本沒有快捷方式(然後沒有默認快捷方式是件好事)。

事實上,適當的捷徑取決於情況也表明,應該沒有默認的捷徑,我想。

順便說一下,不要忘記使TButtonedEditDoubleBuffered,否則它會閃爍太多。

+0

當然,使用`DoubleBuffered`可能導致某些主題(如Windows Basic)中的繪畫損壞。而閃爍來自哪裏,我沒有看到它。 – 2011-02-13 11:46:57

+1

@大衛:快速移動鼠標穿過控件(這樣鼠標有時在控件之上,而在其他時間在控件之外)。位圖將閃爍。 – 2011-02-13 11:48:08

0

鑑於沒有辦法將輸入焦點傳遞給這些嵌入式按鈕,並且假設它們顯示字形,怎麼會有鍵盤訪問?用戶如何發現它?

在模式對話框中,您可以按回車鍵,只要焦點控件不是按鈕,則默認按鈕被按下,表單關閉。這是平臺UI標準的一部分。同樣用於轉義和取消。許多其他控件具有標準鍵盤訪問(列表,下拉列表,編輯等)

這不是一個標準控件,因此將某些默認鍵盤訪問強加到編輯控件所期望的範圍之外是錯誤的。設計師可以添加訪問權限,因爲他們知道他們的表單上有什麼合理的內容,但是VCL設計人員通過不包括適用於此控件的每個實例的默認行爲來解決問題。

2

我現在已經創建一個interposer class,看起來像這樣:通過聲明

interface 
{...} 
type 
    TdzButtonedEdit = class(TButtonedEdit) 
    protected 
    procedure KeyDown(var _Key: Word; _Shift: TShiftState); override; 
    public 
    procedure Loaded; override; 
    end; 

{...} 

implementation 

{...} 

{ TdzButtonedEdit } 

procedure TdzButtonedEdit.KeyDown(var _Key: Word; _Shift: TShiftState); 
begin 
    inherited; 
    if (_Key = VK_RETURN) and (ssCtrl in _Shift) then 
    if Assigned(OnRightButtonClick) then 
     OnRightButtonClick(Self); 
end; 

procedure TdzButtonedEdit.Loaded; 
begin 
    inherited; 
    if RightButton.Visible and (RightButton.Hint = '') then begin 
    RightButton.Hint := _('Ctrl+Return to ''click'' right button.'); 
    ShowHint := true; 
    end; 
end; 

我在表單中使用:

TButtonedEdit = class(TdzButtonedEdit) 
end; 

形式的類聲明之前。

如果我可以被打擾,我會讓它成爲一個完整的自定義組件。

btw:爲什麼Embarcadero使TEditButton.TGlyph嚴格私密?這很不方便,因爲 通常我會調用RightButton.Glyph.Click而不是OnRightButtonClick。