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ę

- Rejestracja:prawie 20 lat
- Ostatnio:około 2 godziny
- Lokalizacja:Gorlice
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;