我在delphi 7中创建了一个表单,并在其上添加了一个组合框。组合框包含项目列表。我不想让用户在Combobox中输入值所以我设置了
combobox.style := csDropDownList;
但是通过代码,我想使用combobox.text := 'New Item';
,但它不起作用。注意,我想要显示的文本不在项目列表中,我不想将其添加到列表中。请问有什么解决办法吗?
不,这不是Windows组合框控件的工作方式。
然而,如果你坚持,你不关心你的用户会感到困惑,你可以设置Style
为csDropDown
,然后执行
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
Key := #0;
end;
作为组合框' OnKeyPress
事件。然后,用户不能手动输入文本,而只能从列表中的项目中进行选择。但是,您仍然可以通过设置Text
属性将文本设置为您喜欢的任何内容(即使它不在列表中):
ComboBox1.Text := 'Sample';
设置ItemIndex
属性。如果您还不知道该文本的索引,您可以使用ComboBox.Items.IndexOf('New Item')
来获取该文本的索引。
Combobox.ItemIndex := Combobox.Items.IndexOf('New item');
下面的示例代码演示了如何绘制自定义文本以响应发送到ComboBox控件的父窗口的WM_DRAWITEM
消息(这应该是示例工作的形式,否则子类化控件或控件的全部项目将是必要的)。
要接收此消息,将控件的Style
属性设置为'csOwnerDrawFixed',但不要为OnDrawItem
事件设置处理程序,以便在我们干预绘图的所有其他情况下应用默认绘图。
示例在ItemIndex
为-1时设置文本,但可以调整/调整。请注意,绘图代码不完整或不准确,示例只是演示了如何完成:
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
[..]
private
procedure WMDrawItem(var Msg: TWMDrawItem); message WM_DRAWITEM;
end;
[...]
procedure TForm1.WMDrawItem(var Msg: TWMDrawItem);
var
Font: HFONT;
begin
inherited;
if (Msg.Ctl = ComboBox1.Handle) and (Msg.DrawItemStruct.itemID = $FFFFFFFF) and
((Msg.DrawItemStruct.itemAction and ODA_DRAWENTIRE) = ODA_DRAWENTIRE) then begin
Font := SelectObject(Msg.DrawItemStruct.hDC, ComboBox1.Canvas.Font.Handle);
SelectObject(Msg.DrawItemStruct.hDC, GetStockObject(DC_BRUSH));
if (Msg.DrawItemStruct.itemState and ODS_SELECTED) = ODS_SELECTED then begin
SetDCBrushColor(Msg.DrawItemStruct.hDC, ColorToRGB(clHighlight));
SetBkColor(Msg.DrawItemStruct.hDC, ColorToRGB(clHighlight));
SetTextColor(Msg.DrawItemStruct.hDC, ColorToRGB(clHighlightText));
end else begin
SetDCBrushColor(Msg.DrawItemStruct.hDC, ColorToRGB(clWindow));
SetBkColor(Msg.DrawItemStruct.hDC, ColorToRGB(clWindow));
SetTextColor(Msg.DrawItemStruct.hDC, ColorToRGB(clWindowText));
end;
FillRect(Msg.DrawItemStruct.hDC, Msg.DrawItemStruct.rcItem, 0);
TextOut(Msg.DrawItemStruct.hDC, 4, 4, '_no_selected_item_', 18);
SelectObject(Msg.DrawItemStruct.hDC, Font);
end;
end;
我认为你想要正常的东西,在没有选择的情况下在组合框中显示一些东西。一个空白矩形的瞬间。想象一个充满空白组合框的表单……;)
我所看到的大多数程序员所做的是将第一项作为标题显示在ComboBox中。
因此,在FormCreate中(在您填充了ComboBox之后),您将其ItemIndex设置为0,这将显示标题。
在它的OnChange事件中,你可以选择不采取任何行动,如果项目0被选中("真实的"项目有基数1的索引),或获得ItemIndex-1,并跳过行动,如果<</p> 0。
一定是每个第一次使用组合框的人的一个超级常见的抱怨。我不明白为什么编码员都认不出来。
所有Borland等人所要做的就是初始化一个新的ComboBox, ItemIndex=0,混乱就会消失。显然,您必须设置索引0—因为单击时看到的是空行,因此逻辑上的结论是 It 具有索引0。也许他们想给设计师一个选择,在组合框之外添加一个标签。