Паскаль: Как я могу выбрать элементы из ListBox1, чтобы отобразить результаты в listBox 2?

Я новичок в программировании на Паскале. Я максимально внимательно следил за онлайн-учебниками. Для моей программы я хочу иметь возможность выбирать элемент из списка 1 (страна) и отображать результаты (города) в списке 2. Я знаю это там наверное простое решение. Любая помощь приветствуется.

       procedure TForm1.ListBox1Enter(Sender: TObject);
           begin
               ListBox1.Items.Add('America');
               ListBox1.Items.Add('United Kingdom');
               ListBox1.Items.Add('France');
           end;

Результаты, например, могут быть такими: Америка-Нью-Йорк,Вашингтон,Феникс, Великобритания-Йорк,Лондон,Манчестер,Испания-Мадрид,Барселона,Валенсия.


person P Grant    schedule 29.02.2016    source источник


Ответы (2)


Окно со списком имеет свойство ItemIndex, которое сообщает вам индекс выбранного элемента в его массиве Items[] (или -1, если ничего не выбрано);

Таким образом, вы можете использовать ItemIndex для получения текстового значения элемента в списке (AString := Listbox1.Items[ListBox1.ItemIndex]) и использовать его для вызова Items.Add во втором LB.

Очевидно, вы можете получить доступ к любому значению в массиве Items[] списка в коде, независимо от того, показано ли оно как выбранное в графическом интерфейсе.

Обратите внимание, что массив Items в ListBox, как и многие другие массивы в Delphi, начинается с нуля.

person MartynA    schedule 29.02.2016

Я создал для вас быстрый пример: просто создайте новую форму, поместите в нее 2 списка и объявите обработчик OnCreate для формы и обработчик OnClick для первого списка.

Обратите внимание, что использование константного массива записей — это всего лишь быстрый заполнитель.

interface

uses
  Vcl.Forms, Vcl.StdCtrls;

type

  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

type
  //just a quick Record to contain a country and 3 cities
  //this should be an dynamic array later.. or a class
  TCountryCitiesRecord = record
    Country: string;
    Cities: array[0..2] of string;
  end;

const
  //declare our 3 countries and their cities as constant
  //this might be loaded from a file or whatever later
  FCountriesCities : array[0..2] of TCountryCitiesRecord  =
  ((Country: 'USA'; Cities: ('New York','Washington','Phoenix')),
  (Country: 'United Kingdom'; Cities: ('York','London','Manchester')),
  (Country: 'Spain'; Cities: ('Madrid','Barcelona','Valencia')));

//onCreate of Form
procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  //Initialize the first ListBox with the countries
  for I := Low(FCountriesCities) to High(FCountriesCities) do
    ListBox1.Items.Add(FCountriesCities[I].Country)
end;

//onclick of listbox1
procedure TForm1.ListBox1Click(Sender: TObject);
var
    I: Integer;
begin
  //clear the second listbox
  ListBox2.Items.Clear;
  //if an item is selected
  if ListBox1.ItemIndex <> -1 then
    //add the cities, that belong to the currently selected country
    //to the second listbox
    for I := Low(FCountriesCities[ListBox1.ItemIndex].Cities) to High(FCountriesCities[ListBox1.ItemIndex].Cities) do
      ListBox2.Items.Add(FCountriesCities[ListBox1.ItemIndex].Cities[I])
end;

end.
person Sebastian Proske    schedule 29.02.2016