我有一个组合框,其样式设置为csDropDown。我试图在OnSelect事件处理程序中执行此操作;
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 :(得分:5)
在Text
事件期间,您对OnSelect
所做的更改随后会被框架覆盖。无论是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;
答案 1 :(得分:1)
您可以将Style设置为OwnerDrawFixed并使用OnDrawItem自行绘制希望的文本。 此示例中的查找将显示all,仅选择修剪后的字符串。
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;