Есть несколько вариантов.
Простой индекс
Простое решение:
case ListBox1.ItemIndex of
0 : temp := TApple.Create;
1 : temp := TPineapple.Create;
2 : temp := TGrape.Create;
else
raise EFruitError.Create('Unknown fruit');
end;
Это ясно, но вы должны поддерживатьсписок в двух местах, что может привести к ошибкам.
Ссылки на классы
Предположим, что все фрукты происходят из TFruit с помощью виртуального конструктора.Тогда вы можете сделать:
procedure TForm1.FormCreate(const Sender: TObject);
begin
ListBox1.AddObject('Apple', TApple);
ListBox1.AddObject('Pineapple', TPineapple);
ListBox1.AddObject('Grape', TGrape);
end;
// Event handler:
procedure TForm1.CreateButtonClick(const Sender: TObject);
begin
if ListBox1.ItemIndex>=0 then
temp := TFruit(ListBox1.Items.Objects[ListBox1.ItemIndex]).Create;
end;
Это имеет одну точку обслуживания.Что здорово.
Ссылка на основе имени Но если вы хотите создать объекты на основе имени в списке, вы можете создать некую фабрику:
type
TFruitClass = class of TFruit;
TFruitFactory = class
public
class function CreateFruit(const AName: string): TFruit;
class procedure RegisterFruit(const AName: string; const AFruitClass: TFruitClass);
end;
Фабрика используется для привязки классов к именам.Каждый класс регистрируется с использованием имени.А теперь вы просто даете имя фабрике, и фабрика возвращает требуемый класс.