Delphi 如何添加';隐藏的';盒子里的物品?

Delphi 如何添加';隐藏的';盒子里的物品?,delphi,Delphi,我有一个TCombobox,其中我向用户显示了一些项目。但是我向用户显示的项目的文本与我需要的文本不同 例如,我实际需要的组合框项目和文本是: Entry start -> cmd_estart Entry End -> cmd_eend 当用户单击第一项时,我需要的“命令”是“cmd_estart”。有没有办法将第二个项目列表放入组合框 换句话说,我需要另一个项目列表,与已经存在的原始项目列表“并行” 我希望有这样的东西已经制作:)所以,如果你知道这样的控件,

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

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

Entry start    ->  cmd_estart
Entry End      ->  cmd_eend
当用户单击第一项时,我需要的“命令”是“cmd_estart”。有没有办法将第二个项目列表放入组合框

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

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



注意:这不是的重复,因为该问题询问如何在组合框中显示两列。那里提供的解决方案不如这里(由TLama)提供的好。

我提出了这个解决方案。如果你需要对列表进行排序,它将不起作用(我不需要)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;

或者创建一个“command”对象并将其分配给组合框的Objects[Index]属性?“因为该问题询问如何在组合框中显示两列”-这是因为该问题询问的是您的同一问题的错误解决方案,但答案不在后面,它提供了实际问题的解决方案。阅读这里的问题和答案。。。很像这里的答案不符合。你的答案如何解决添加隐藏项的问题?@satter-我读了代码。它不会添加隐藏项,也不会将第二个项目列表放入组合框。它在子代中保留一个单独的列表。@SertacAkyuz-它实现了我想要做的事情。不是吗?字符串列表中有任务名称-值对,所以不需要单独的字符串列表。您可以显示值并获取名称(具有类似于
cmd\u estart=Entry start
)的项。这就是您使用所有者图形的地方。您可以将
样式设置为
csOwnerDrawFixed
,并在
OnDrawItem
事件处理程序中打印项目的值。名称-值对由第一个出现的
namevaluesparator
字符进行解析,如果需要,可以更改该字符。默认情况下,它是
=
字符,因此命令名(名称部分)不能包含此字符。可以对值部分进行排序。我不需要对列表进行排序。这不在要求中。@TLama-你能把它作为一个答案发布,这样我就可以接受它了吗?:)
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;