更改ComboBox的显示(200分)

  • 主题发起人 主题发起人 mvb
  • 开始时间 开始时间
M

mvb

Unregistered / Unconfirmed
GUEST, unregistred user!
想写一个控件,从TCustomComboBox继承下来,它的Items属性中的列为以下格式:A|a, B|b.在用户选择时在文本框中只显示A,请问应该怎么办?
 
可以在OnChange事件中处理一下,分解得到的选项字串TCustomComboBox.Text,把你需要的那一部分串值重新赋给TCustomComboBox.Text
 
如果Style被设置为csOwnerDrawFixed的话,不能设置Text属性为不在列表中的值
 
这样不行。我覆盖了TCustomComboBox的Change方法,没有用。仍然显示的是全部内容。
procedure Change;override;
begin
inherited;
//分解现在的Text字符串。重新给Text赋值
Text := GetNewText(Text);
end;
 
我也想要这个
功能?
有谁能指点?
 
设置style为csOwnerDrawFixed


procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var s:String;
begin
with ComboBox1.Canvas do
begin
FillRect(Rect);
s:=ComboBox1.Items[Index];
s:=Copy(s,1,POS('|',s)-1);
TextOut(Rect.Left, Rect.Top,s);
end;
end;
 
给你一个变通的方法,试验通过:
constructor TMyCustomComboBox.Create(AOwner: TComponent);
begin
inherited;
Style := csOwnerDrawFixed;
end;

procedure TMyCustomComboBox.DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
inherited;
if odComboBoxEdit in State then // 在Edit中
begin
Canvas.FillRect(Rect);
if Index >= 0 then
Canvas.TextOut(Rect.Left + 2, Rect.Top, Copy(Items[Index], 3, MaxInt));
end;
end;
 
多谢xiammy.但不知道能不能用拦截消息的方式来实现?我想让这个控件与Delphi的标准控件类似,让用户也能输入。
 
定义一个TStringList记录Items。。。然后给Items重新赋值
 
定义一个TStringList记录Items。。。然后给Items重新赋值

??能在详细点吗?

谢谢。
 
好象没有什么更好的办法了。谢谢各位。
 
后退
顶部