Стиль комбинированного списка 'csDropDownList' в Delphi - PullRequest
1 голос
/ 23 августа 2011

Я создал одну форму в Delphi 7 и добавил один комбинированный список. В выпадающем списке содержится список предметов. Я не хочу, чтобы пользователь мог ввести значение в Combobox, поэтому я установил

combobox.style := csDropDownList;

Но вот код, который я хочу использовать combobox.text := 'New Item';, но он не работает. Обратите внимание, что текст, который я хочу показать, отсутствует в списке элементов, и я не хочу добавлять его туда. Пожалуйста, есть какое-либо решение для этого?

Ответы [ 4 ]

5 голосов
/ 23 августа 2011

Нет, это просто не то, как работает элемент управления Windows со списком.

Однако, если вы настаиваете, и вам все равно, что ваши пользователи будут сбиты с толку, вы можете установить Style на csDropDown, а затем сделать

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
  Key := #0;
end;

как событие в поле со списком 'OnKeyPress. Тогда пользователь не может вводить текст вручную, а может выбирать только элементы из списка. Тем не менее, вы по-прежнему можете установить текст на что угодно (даже если его нет в списке), установив свойство Text:

ComboBox1.Text := 'Sample';
4 голосов
/ 23 августа 2011

Установите свойство ItemIndex.Вы можете получить ComboBox.Items.IndexOf('New Item'), чтобы получить индекс этого текста, если вы его еще не знаете.

Combobox.ItemIndex := Combobox.Items.IndexOf('New item');
2 голосов
/ 23 августа 2011

Ниже пример кода демонстрирует, как можно нарисовать пользовательский текст в ответ на сообщение WM_DRAWITEM, отправленное в родительское окно элемента управления ComboBox (это должна быть форма для работы образца, в противном случае элементы управления подклассами или полное рисование элементовнеобходим элемент управления).

Чтобы получить это сообщение, установите для свойства 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;
0 голосов
/ 29 октября 2012

Я думаю, что вы хотите, чтобы обычные вещи отображали что-то в ComboBox, когда еще не сделан выбор. Момент пустого прямоугольника. Вообразите форму, полную пустых списков ...;)

То, что я видел у большинства программистов, это первый элемент в качестве заголовка для отображения в ComboBox.

Итак, в FormCreate (после того, как вы заполнили ComboBox), вы устанавливаете его ItemIndex равным 0, и это отображает заголовок.

В его событии OnChange вы можете не предпринимать никаких действий, если выбран элемент 0 («реальные» элементы имеют базу 1 для индекса), или получить ItemIndex-1 и пропустить действие, если <0. </p>

Должно быть очень распространенная жалоба всех, кто впервые использовал Combobox. Я не могу понять, как никто из кодеров не узнает это.

Все, что пришлось бы делать Borland и другим, - это инициализировать новый ComboBox с ItemIndex = 0, и путаница исчезла бы. Конечно, не очевидно, что вам нужно установить индекс 0 - поскольку при нажатии вы видите пустую строку, логический вывод заключается в том, что it имеет индекс 0. Вероятно, они хотели дать дизайнерам возможность добавить метку снаружи вместо этого комбинированный ящик.

...