组合盒风格 'csDropDownList' 在德尔福



我在delphi 7中创建了一个表单,并在其上添加了一个组合框。组合框包含项目列表。我不想让用户在Combobox中输入值所以我设置了

combobox.style := csDropDownList;

但是通过代码,我想使用combobox.text := 'New Item';,但它不起作用。注意,我想要显示的文本不在项目列表中,我不想将其添加到列表中。请问有什么解决办法吗?

不,这不是Windows组合框控件的工作方式。

然而,如果你坚持,你不关心你的用户会感到困惑,你可以设置StylecsDropDown,然后执行

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。也许他们想给设计师一个选择,在组合框之外添加一个标签。

最新更新