2013-07-08 62 views
3

我有一個組合框,其樣式設置爲csDropDown。我正在嘗試在OnSelect事件處理程序中執行此操作;如何截斷delphi組合框中的選定文本?

if cboEndTime.ItemIndex > -1 then 
    cboEndTime.Text := AnsiLeftStr(cboEndTime.Text, 5); 

但它沒有效果。

組合項目看起來像這樣;

09:00(0分鐘)
09:30(30分鐘)
10:00(1小時)
10:30(1.5小時)
...

如果我選擇例如第二項,我希望組合框的文本顯示爲09:30,即截斷。這會將ItemIndex設置爲-1。

我該如何實現這一目標?

+0

是的,它是csDropDown。爲什麼這是不可能的?我可以設置其他代碼的文本並鍵入我喜歡的任何內容。我可以理解,如果它是csDropDownList,但它不是。 – srayner

回答

5

這樣看來,你的OnSelect活動期間作出Text變化隨後由框架覆蓋。無論是Windows API還是VCL,我都沒有調查過哪些。

一種解決方案是推遲實際更改,直到原始輸入事件處理完成。像這樣:

const 
    WM_COMBOSELECTIONCHANGED = WM_USER; 

type 
    TForm1 = class(TForm) 
    ComboBox1: TComboBox; 
    procedure ComboBox1Select(Sender: TObject); 
    protected 
    procedure WMComboSelectionChanged(var Msg: TMessage); message WM_COMBOSELECTIONCHANGED; 
    end; 

implementation 

{$R *.dfm} 

procedure TForm1.ComboBox1Select(Sender: TObject); 
begin 
    PostMessage(Handle, WM_COMBOSELECTIONCHANGED, 0, 0); 
end; 

procedure TForm1.WMComboSelectionChanged(var Msg: TMessage); 
begin 
    if ComboBox1.ItemIndex<>-1 then 
    begin 
    ComboBox1.Text := Copy(ComboBox1.Text, 1, 1); 
    ComboBox1.SelectAll; 
    end; 
end; 
+0

完美的答案。非常感謝。 – srayner

1

您可以將Style設置爲OwnerDrawFixed,並使用OnDrawItem自己繪製希望的文本。 在這個例子中的查找將顯示全部,只選擇修剪的字符串。

procedure TForm3.ComboBox1DrawItem(Control: TWinControl; Index: Integer; 
    Rect: TRect; State: TOwnerDrawState); 

    var 
    C:TComboBox; 

    Function Strip(const s:String):String; 
    begin 
     if C.DroppedDown then result := s 
     else Result := Copy(s,1,pos('(',s)-1); 
    end; 
begin 
    C := TComboBox(Control); 
    C.Canvas.FillRect(Rect); 
    C.Canvas.TextOut(Rect.left + 1,Rect.Top + 1, Strip(C.Items[Index])); 
end; 
+0

如果我老闆畫的控件不會底層的值還是不正確?與視覺上顯示的更差不一致。這難道不會編輯文本真的很難嗎? – srayner

+0

這是正確的,我解釋爲'顯示09:30'只是顯示值改變,而不是改變它。如果你想使用'9:30',你只能通過Stripped(Combobox.Items [Combobox.ItemIndex])來訪問這個值,而不是直接訪問Text直接使用'功能條「和訪問項目。但看看@DavidHeffernan的解決方案,它會更適合你。 – bummi