Страницы

понедельник, 5 августа 2013 г.

Выбор животного - задача на Delphi

Сегодня рассмотрим простую задачу на Delphi.
Задание. На форме располагаются: главное меню с шестью опциями-названиями животных, контейнер Image, кнопка Close и радионабор для выбора  животного. Выбор осуществляется мышью или клавишами клавиатуры. Выбранное животное отображается на элементе Image, а соответствующая ему опция в меню становится невидимой. Кнопка Close заканчивает программу.
Приведу сначала самый простой, длинный, но понятный способ выполнения.
Итак, собираем изображения шести животных и складываем их, допустим, в папку images, которая будет располагаться в каталоге с программой.
Запускаем Delphi, устанавливаем параметры формы, какие удобно, располагаем нужные элементы. У меня получилась форма с именем frmZoo и клиентскими размерами 800 на 600 пикс., кнопка button1 с подписью «Close», контейнер для рисунка Image1 из вкладки additional панели инструментов, меню menu1 c 6 пунктами – названиями животных, радиогруппа rgZoo с 6 вариантами выбора. В радионаборе элементы можно внести через свойство Items. Итог на рисунке.
 Жмем на кнопку «Close» и переходим к тексту программы в процедуру Button1Click, которая уже была создана средой программирования Delphi. Поскольку нам нужно, чтобы при нажатии этой кнопки форма просто закрывалась, пишем просто Close. Получилась такая процедура:
procedure TfrmZoo.Button1Click(Sender: TObject);
begin
  Close;
end;
Затем нажимаем на форме левой кнопкой мыши на первом пункте меню, открывается процедура N1Click, где N1 – это название первого пункта. Что должно происходить при выборе пункта меню? Должен выбираться нужный пункт из радионабора, в контейнере рисунков должно появиться изображение животного, а сам пункт меню должен становиться недоступным. При выборе элемента из радиогруппы также должно появляться изображение животного, а пункт меню – становиться недоступным. Все остальные пункты должны быть доступны.
У компонента radiogroup есть свойство ItemIndex. Это свойство показывает номер выбранного элемента. Отсчет начинается с нуля, то есть, если выбран первый элемент, то ItemIndex равен 0. Если не выбран ни один элемент, то -1.
Создадим процедуры для обработки  выбора каждого пункта меню и в каждой из них пропишем соответствующее значение ItemIndex для радиогруппы.
procedure TfrmZoo.N1Click(Sender: TObject);
begin
  rgZoo.ItemIndex:=0;
end;

procedure TfrmZoo.N2Click(Sender: TObject);
begin
  rgZoo.ItemIndex:=1;
end;

procedure TfrmZoo.N3Click(Sender: TObject);
begin
  rgZoo.ItemIndex:=2;
end;

procedure TfrmZoo.N4Click(Sender: TObject);
begin
  rgZoo.ItemIndex:=3;
end;

procedure TfrmZoo.N5Click(Sender: TObject);
begin
  rgZoo.ItemIndex:=4;
end;

procedure TfrmZoo.N6Click(Sender: TObject);
begin
  rgZoo.ItemIndex:=5;
end;

Как только у радионабора меняется свойство ItemIndex или если кликнуть мышкой на любом пункте, происходит событие OnClick. В процедуре обработки этого события будем менять изображение и доступность пунктов меню.
Текст процедуры:
procedure TfrmZoo.rgZooClick(Sender: TObject);
begin
  case rgZoo.ItemIndex of
  0:begin
      image1.Picture.LoadFromFile('./images/dog.jpg');
      n1.Visible:=false;
      n2.Visible:=true;
      n3.Visible:=true;
      n4.Visible:=true;
      n5.Visible:=true;
      n6.Visible:=true;
    end;
  1:begin
      image1.Picture.LoadFromFile('./images/cat.jpg');
      n1.Visible:=true;
      n2.Visible:=false;
      n3.Visible:=true;
      n4.Visible:=true;
      n5.Visible:=true;
      n6.Visible:=true;
    end;
  2:begin
      image1.Picture.LoadFromFile('./images/giraffe.jpg');
      n1.Visible:=true;
      n2.Visible:=true;
      n3.Visible:=false;
      n4.Visible:=true;
      n5.Visible:=true;
      n6.Visible:=true;
    end;
  3:begin
      image1.Picture.LoadFromFile('./images/hare.jpg');
      n1.Visible:=true;
      n2.Visible:=true;
      n3.Visible:=true;
      n4.Visible:=false;
      n5.Visible:=true;
      n6.Visible:=true;
    end;
  4:begin
      image1.Picture.LoadFromFile('./images/fox.jpg');
      n1.Visible:=true;
      n2.Visible:=true;
      n3.Visible:=true;
      n4.Visible:=true;
      n5.Visible:=false;
      n6.Visible:=true;
    end;
  5:begin
      image1.Picture.LoadFromFile('./images/bear.jpg');
      n1.Visible:=true;
      n2.Visible:=true;
      n3.Visible:=true;
      n4.Visible:=true;
      n5.Visible:=true;
      n6.Visible:=false;
    end;
end
end;
Выбор действия в зависимости от значения ItemIndex производится с помощью оператора множественного выбора case of. При этом выбирается нужная картинка и определяется доступность пунктов меню. Результат на рисунке:

 Можно решать задачу более коротким способом. Например, сделать отдельную процедуру загрузки изображений:

procedure TfrmZoo.LoadImage(imgIndex: integer);
const
  strImages: array[0..5] of string = ('./images/dog.jpg','./images/cat.jpg','./images/giraffe.jpg','./images/hare.jpg','./images/fox.jpg', './images/bear.jpg');
begin
  image1.Picture.LoadFromFile(strImages[imgIndex]);
end;
Убрать оператор множественного выбора, а пункт меню выбирать в соответствии со значением ItemIndex.
Тогда процедура rgZooClick примет такой вид:
procedure TfrmZoo.rgZooClick(Sender: TObject);
begin
  LoadImage(rgZoo.ItemIndex);
  n1.Visible:=true;
  n2.Visible:=true;
  n3.Visible:=true;
  n4.Visible:=true;
  n5.Visible:=true;
  n6.Visible:=true;
  menu1.Items[rgZoo.ItemIndex].Visible:=false;
end;
Каждый компонент на форме имеет свойство tag. Это свойство можно использовать по своему усмотрению. Присвоим каждому пункту меню значение свойства tag в соответствии со значением ItemIndex. В процедуре OnClick первого пункта запишем:
procedure TfrmZoo.N1Click(Sender: TObject);
begin
  rgZoo.ItemIndex:=TComponent(Sender).Tag;
end;
У всех остальных пунктов в списке событий нужно указать именно эту процедуру:

В итоге остаются всего четыре коротких процедуры.
Если нужно, добавлю готовые программы с исходниками.