说我有一个带有
的组合框apples
apples
pears
oranges
oranges
我想让它显示
apples
pears
oranges
我该怎么做?
答案 0 :(得分:5)
for iter := combobox.Items.Count - 1 downto 0 do
begin
index := combobox.Items.IndexOf(combobox.Items[iter]);
if index < iter then
combobox.Items.Delete(iter);
end;
答案 1 :(得分:2)
我建议您每次只需重新填充组合框。这使得逻辑变得更简单:
ComboBox.Items.BeginUpdate;
try
ComboBox.Clear;
for Str in Values do
begin
if ComboBox.Items.IndexOf (Str) = -1 then
ComboBox.Items.Add (Str);
end;
finally
ComboBox.Items.EndUpdate;
end;
答案 2 :(得分:2)
只是将方法相互对立:一个保持订单,但随着项目数量的增加而越来越慢。另一个保持相对较快但不保持秩序:
procedure SortStringlist;
var
i,index,itimer: integer;
sl : TStringlist;
const
numberofitems = 10000;
begin
sl := TStringlist.Create;
for i := 0 to numberofitems-1 do begin
sl.Add(IntToStr(random(2000)));
end;
Showmessage(IntToStr(sl.Count));
itimer := GetTickCount;
sl.Sort;
for I := sl.Count-1 downto 1 do begin
if sl[i]=sl[i-1] then sl.Delete(i);
end;
Showmessage(IntToStr(sl.Count)+' Time taken in ms: '+IntToStr(GetTickCount-itimer));
sl.free;
sl := TStringlist.Create;
for i := 0 to numberofitems-1 do begin
sl.Add(IntToStr(random(2000)));
end;
Showmessage(IntToStr(sl.Count));
itimer := GetTickCount;
for i := sl.Count - 1 downto 0 do
begin
index := sl.IndexOf(sl[i]);
if index < i then
sl.Delete(i);
end;
Showmessage(IntToStr(sl.Count)+' Time taken in ms: '+IntToStr(GetTickCount-itimer));
end;
答案 3 :(得分:2)
如果您不关心项目是否重新排序(或者它们已经排序),TStrings
可以为您完成工作 - 它会消除所有循环,删除和其他工作。 (当然,它需要创建/销毁一个临时的TStringList
,所以如果这对你来说是个问题就行不通。)
var
SL: TStringList;
begin
ComboBox1.Items.BeginUpdate;
try
SL := TStringList.Create;
try
SL.Sorted := True; // Required for Duplicates to work
SL.Duplicates := dupIgnore;
SL.AddStrings(ComboBox1.Items);
ComboBox1.Items.Assign(SL);
finally
SL.Free;
end;
finally
ComboBox1.Items.EndUpdate;
end;
end;
要与Igor的答案(不包括BeginUpdate/EndUpdate
)进行正确比较,请删除以下内容:
var
SL: TStringList;
begin
SL := TStringList.Create;
try
SL.Sorted := True; // Required for Duplicates to work
SL.Duplicates := dupIgnore;
SL.AddStrings(ComboBox1.Items);
ComboBox1.Items.Assign(SL);
finally
SL.Free;
end;
end;
答案 4 :(得分:0)
您必须从源数据中删除重复项。
在大多数情况下,ComboBox在运行时填充数据,这意味着数据来自某些来源。这里基本上有两种情况:来自数据库的数据集和来自任何其他来源的字符串集合。在这两种情况下,您都可以在将任何内容插入ComboBox之前过滤掉重复项。
如果source是数据库中的数据集,只需使用SQL DISTINCT
关键字。
如果source是任何字符串集合,请使用@Smasher在答案中提供的代码。
答案 5 :(得分:0)
之前我曾多次遇到过这个问题,并且我使用了之前的所有方法,我仍在使用它们,但是你知道吗:我认为最好的方法虽然没有在这里提到,但是要继承TComboBox,创建一个新的方法(比如AddUnique)只在以前不存在的情况下才将字符串添加到组合中,否则它将删除它。 这个解决方案在开始时可能会花费一些额外的时间,但它会一劳永逸地解决问题。