【问题标题】:How to add 'hidden' items in a TComboBox?如何在 TComboBox 中添加“隐藏”项目?
【发布时间】:2015-06-19 10:50:23
【问题描述】:

我有一个 TCombobox,我在其中向用户显示一些项目。但是我向用户显示的项目的文本与我需要的文本不同。

例如组合框 Items 和我实际需要的文本是:

Entry start    ->  cmd_estart
Entry End      ->  cmd_eend

用户单击第一项时我需要的“命令”是“cmd_estart”。有没有办法将第二个项目列表放入组合框中?

换句话说,我需要另一个项目列表,与已存在的项目列表的原始列表“平行”。

我希望已经有类似的东西了 :) 所以,如果你知道这样的控件,请发布一个链接。


注意:这不是 How to create a combobox with two columns (one hidden) in Delphi 7? 的重复项,因为该问题询问如何在组合框中显示两列。并且那里提供的解决方案不如此处提供的解决方案(由 TLama 提供)。

【问题讨论】:

  • 或者创建一个“命令”对象,并将其分配给组合框的 Objects[Index] 属性?
  • “因为该问题询问如何在组合框中显示两列” - 那是因为该问题询问您相同问题的错误解决方案,但答案不遵循,它为实际问题提供了解决方案。阅读那里的问题和答案。
  • .. 非常喜欢这里的答案没有遵循。您的答案如何解决添加隐藏项?
  • @Altar - 我读了代码。它不会添加隐藏项目,也不会将第二个项目列表放入组合框中。它在后代中保留一个单独的列表。
  • @SertacAkyuz- 这实现了我想要做的。不是吗?

标签: delphi


【解决方案1】:

我想出了这个解决方案。如果您需要对列表进行排序(我不需要),它将不起作用。 TLama 提供的解决方案更好。请为他的答案投票。

TYPE
  TDualComboBox = class(TComboBox)
   private
    FDItems: TStrings;      { Strings are separated with ##}
    function getDItems: TStrings;
    procedure setDItems  (const DualItems: TStrings);
   protected
   public
    constructor Create(AOwner : TComponent); override;
    destructor Destroy; override;
    procedure AddDualItem(const DualItem: String);
    function  SelectedDualItem: string;
    property  DualItems: TStrings read getDItems write setDItems; { Strings are separated with ##}
   published
   end;

procedure Register;

IMPLEMENTATION

Constructor TDualComboBox.Create(AOwner : TComponent);
begin
 inherited Create(AOwner);
 FDItems:= TStringList.Create;
end;


destructor TDualComboBox.Destroy;
begin
 FreeAndNil(FDItems);
 inherited;
end;



procedure TDualComboBox.AddDualItem(CONST DualItem: String);
VAR
   sField, sValue: string;
begin
 SplitString(DualItem, '##', sField, sValue);
 Items  .Add(sField);
 FDItems.Add(sValue);
end;


function TDualComboBox.SelectedDualItem: string;
begin
 if ItemIndex < 0
 then Result:= ''
 else Result:= FDItems[ItemIndex];
end;

这是测试程序:

procedure TForm5.FormCreate(Sender: TObject);
begin
 Box:= TcComboBox.Create(Self);
 Box.Parent:= Self;
 Box.Top := 200;
 Box.Left:= 200;
 Box.OnChange:= ComboChange;

 Button1Click(Sender);
end;


procedure TForm5.Button1Click(Sender: TObject);
begin
 Box.AddDualItem('User nice text##usr_bkg_text');
end;


procedure TForm5.ComboChange(Sender: TObject);
begin
 lblInfo.Caption:= Box.SelectedDualItem;
end;

【讨论】:

  • 字符串列表具有您的任务名称值对,因此不需要单独的字符串列表。您可以显示值并获取名称(具有 cmd_estart=Entry start 之类的项目)。
  • 这就是你使用所有者绘图的地方。您设置 Style 例如到csOwnerDrawFixed 并在OnDrawItem 事件处理程序中打印出项目的值。某事like this.
  • 名称值对由第一次出现的 NameValueSeparator 字符解析,您可以根据需要更改该字符。默认情况下它是= 字符,因此命令名称(名称部分)不得包含此字符。值部分可以。
  • @KenWhite-我不需要对列表进行排序。这不在要求中。
  • @TLama- 你能把它作为答案发布以便我接受吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 2012-06-26
相关资源
最近更新 更多