我按照排序顺序将StringList中的项加载到ComboBox。当我在ComboBox中选择一个项目时,我想知道该项目在StringList中的相应顺序。
例如: 我的StringList的第一项是 FFFFF ,但这是我的ComboBox中的最后一项。因此,当在ComboBox中选择 FFFFF 时,我的程序需要告诉我它是StringList中的最后一项。
这是我的程序编译得很好,但没有显示所需的结果,我无法找到错误。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Edit1: TEdit;
BitBtn1: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var ItemList : TStringList;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if ComboBox1.ItemIndex = -1
then
begin
Edit1.Text := 'Select Items';
end
else if ComboBox1.ItemIndex <> -1
then
begin
if ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('ItemList.IndexOf(0)')
then
begin
Edit1.Text := 'First Line Selected'
end
else if ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('ItemList.IndexOf(1)')
then
begin
Edit1.Text := 'Second Line Selected'
end
else if ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('ItemList.IndexOf(2)')
then
begin
Edit1.Text := 'Third Line Selected'
end
else if ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('ItemList.IndexOf(3)')
then
begin
Edit1.Text := 'Forth Line Selected'
end
else if ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('ItemList.IndexOf(4)')
then
begin
Edit1.Text := 'Fifth Line Selected'
end
else if ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('ItemList.IndexOf(5)')
then
begin
Edit1.Text := 'Sixth Line Selected'
end
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ItemList.Clear;
ItemList.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.Sorted := true;
ItemList := TStringList.Create;
with ItemList do
begin
Add('FFFFF');
Add('EEEEE');
Add('DDDDD');
Add('CCCCC');
Add('BBBBB');
Add('AAAAA');
end;
ComboBox1.Items.BeginUpdate;
try
begin
ComboBox1.Items.AddStrings(ItemList);
end
finally
begin
ComboBox1.Items.EndUpdate;
end
end;
end;
end.
答案 0 :(得分:4)
在这种情况下,我会将TStringList
索引直接存储在TComboBox
本身,然后在需要时使用它们,例如:
procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
begin
ComboBox1.Sorted := true;
ItemList := TStringList.Create;
ItemList.Add('FFFFF');
ItemList.Add('EEEEE');
ItemList.Add('DDDDD');
ItemList.Add('CCCCC');
ItemList.Add('BBBBB');
ItemList.Add('AAAAA');
ComboBox1.Items.BeginUpdate;
try
for I := 0 to ItemList.Count-1 do begin
ComboBox1.Items.AddObject(ItemList[I], TObject(I));
end;
finally
ComboBox1.Items.EndUpdate;
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Idx: Integer;
begin
Idx := ComboBox1.ItemIndex;
if Idx = -1 then begin
Edit1.Text := 'Select Items';
end else
begin
case Integer(ComboBox1.Items.Objects[Idx]) of
0: Edit1.Text := 'First Line Selected';
1: Edit1.Text := 'Second Line Selected';
2: Edit1.Text := 'Third Line Selected';
3: Edit1.Text := 'Forth Line Selected';
4: Edit1.Text := 'Fifth Line Selected';
5: Edit1.Text := 'Sixth Line Selected';
end;
end;
end;
答案 1 :(得分:3)
if ComboBox1.ItemIndex = ComboBox1.Items.IndexOf('ItemList.IndexOf(0)') then begin Edit1.Text := 'First Line Selected' end
在此,您可以调查组合框中所选项目的索引是否等于ComboBox项目中文本'ItemList.IndexOf(0)'的索引。您让ComboBox在其项目中搜索字符串'ItemList.IndexOf(0)'。您只添加了'FFFFF' .. 'AAAAA',因此字符串'ItemList.IndexOf(0)'不会出现在ComboBox中。因此ComboBox1.Items.IndexOf()
将返回-1
。
ComboBox中的所选项目索引为0
到5
(因为有六个项目,从0
开始),因此ComboBox1.ItemIndex
不会是{{1}因此这个等式导致False。和其他五个相似的-1
- 陈述一样。这就是为什么您的编辑框没有按照预期的方式更新的原因。
将选定的ComboBox项与StringList if
中的所有项进行比较:
ItemList
此代码包含七个 if ComboBox1.Text = ItemList[0] then
begin
Edit1.Text := 'First Line Selected'
end
else if ComboBox1.Text = ItemList[1] then
begin
Edit1.Text := 'Second Line Selected'
end
...
- 语句可以重构为:
if
或者,您可以将其参数化为一个procedure TForm1.BitBtn1Click(Sender: TObject);
begin
case ItemList.IndexOf(ComboBox1.Text) of
0: Edit1.Text := 'First line Selected';
1: Edit1.Text := 'Second line Selected';
2: Edit1.Text := 'Third line Selected';
3: Edit1.Text := 'Fourth line Selected';
4: Edit1.Text := 'Fifth line Selected';
5: Edit1.Text := 'Sixth line Selected';
else
Edit1.Text := 'Select items';
end;
end;
语句:
if