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