将项目从StringList加载到ComboBox并根据StringList进行选择

时间:2014-10-13 19:19:09

标签: delphi delphi-xe2

我按照排序顺序将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.

2 个答案:

答案 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中的所选项目索引为05(因为有六个项目,从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