Uzupełnianie interfejsu po wybraniu pozycji z ComboBox

0

Witam.
Mam takie pytanie.
Mam w Combobox wpisane teksty np.:
jabłko
gruszka
Jaki należy wpisać polecenie w combobox aby w label po wybraniu np. jabłko pojawił się napis "antonówka" oraz aby w TImage pojawiło się zdjęcie takiego jabłka i analogicznie z gruszką.
To jest pewnie proste pytanie ale ja dopiero zaczynam a najlepiej zapytać się specjalistów.
Z góry dziękuję

2

Jest milion (no może przesadzam ale na pewno sporo) sposobów aby osiągnąć coś takiego jednym z nich jest wykorzystanie faktu że ComboBox może przechowywać obiekty a te z kolei różne przydatne informacje.
Prosty przykład w sekcji deklarujesz nowy typ danych będzie to obiekt TFruit przechowujący informacje o owocu. Ja posłużę się prostym przykładem i mój obiekt będzie zawierał tylko nazwę owocu i ścieżkę do obrazka:

  TFruit = class(TObject)
  private
    fName: string;
    fLink: string;
  public
    constructor Create(AName, ALink: string);
    property Name: string read fName write fName;
    property Link: string read fLink write fLink;
  end;

W sekcji implementation piszesz kod konstruktora obiektu i cały kod ofpowiedzialny za dodawania pozycji do listy i to co się wydarzy przy zmianie wybranej pozycji.

constructor TFruit.Create(AName, ALink: string); //implementacja konstruktora obiektu
begin
  inherited Create;
  fName:= AName;
  fLink:= Alink;
end;

procedure TForm1.btnAddClick(Sender: TObject); 
begin
  //tak dodajesz pozycje do ComboBox
  ComboBox1.Items.AddObject('jabłko', TFruit.Create('antonówka', 'images\antonowka.jpg'));
  ComboBox1.Items.AddObject('gruszka', TFruit.Create('lipcówka', 'images\lipcowka.jpg'));
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
var
  FileName: string;
begin
  if ComboBox1.ItemIndex > -1 then //czy wybrano jakaś pozycję
  begin
    //to co sie ma zdarzyć po wybraniu zauważ jak odczytywane są dane które przechowuje dodany obiekt
    Label1.Caption:= TFruit(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).Name;
    FileName:= ExtractFilePath(Application.ExeName) +
                 TFruit(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).Link;
    Image1.Picture.LoadFromFile(FileName);
  end;
end;

EDIT:
Jak zauważył @wloochacz nie napisałem nic o tym że obiekty trzeba zwolnić.
Ponieważ ani ComboBox nie staje się właścicielem tych obiektów (ani dany Item obiektu) trzeba zwolnić każdy obiekt przed usunięciem pozycji z listy (wywołaniem Delete). Zwalnia się normalnie używając metody Free lub procedury FreeAndNil jak "się dobrać" do obiektu danego item już pokazałem. Na końcu działania aplikacji (np. w OnDestroy) też trzeba zadbać po zwolnienie wszystkich obiektów np. tak:

procedure TForm1.FormDestroy(Sender: TObject);
begin
  while ComboBox1.Items.Count > 0 do
  begin
    if Assigned(ComboBox1.Items.Objects[0]) then ComboBox1.Items.Objects[0].Free;
    ComboBox1.Items.Delete(0);
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1