Опубликован: 07.04.2008 | Доступ: свободный | Студентов: 11863 / 2857 | Оценка: 4.44 / 4.10 | Длительность: 20:15:00
Специальности: Программист, Преподаватель
Лекция 22:

Динамические массивы

< Лекция 21 || Лекция 22: 123 || Лекция 23 >

Теперь рассмотрим на практике работу с динамическим массивом и напишем программу – телефонный справочник.

Создайте форму, наподобие такой:

Внешний вид приложения

Рис. 22.1. Внешний вид приложения

Здесь у нас 7 компонентов Label, 2 ComboBox, 1 MaskEdit для ввода номера телефона и 4 Edit для ввода пользовательских данных. Кроме того, 2 кнопочки с надписями "Добавить телефон" и "Выйти из программы". В компоненте MaskEdit создайте маску для ввода телефона, наподобие указанной в рисунке, но с кодом своего города.

Расположите компоненты на форме так, как подсказывает вам дизайнерский вкус. Верхний ComboBox будет нужен для выбора телефона из списка, чтобы сразу же высвечивались данные этой записи.

Проверьте свойство TabOrder всех компонентов для ввода, они должны идти один за другим при нажатии клавиши <Tab>. Свойство TabOrder показывает индекс компонента на форме. Тот компонент, у которого TabOrder равен 0, при открытии формы будет иметь фокус ввода, то есть, будет выделенным. Когда пользователь нажмет клавишу <Tab>, выделение перейдет к компоненту с TabOrder равным 1, и так далее. С помощью этого свойства мы можем указывать очередность выделения компонентов, как правило, она идет сверху - вниз, и слева - направо. Разумеется, такие компоненты, как Label, фокуса ввода не имеют и у них отсутствует свойство TabOrder.

Форму переименуйте в fMain, модуль будет называться Main а проект – tfSprav.

Названия компонентов оставим по умолчанию, их не так много, и мы не запутаемся. Установите форму в стиль bsDialog, а позицию – по центру экрана.

Прежде всего, нужно объявить глобальную запись для хранения необходимых данных, а также глобальный массив элементов типа этой записи. В этот массив мы будем собирать данные, записывать их в файл и считывать из файла. Он должен быть глобальным, чтобы мы могли работать с ним из всех процедур. Поэтому выше раздела implementation пишем такой код:

type
myTFSprav = record
  TelNum : String[15]; //номер телефона
  Mobil : Boolean; //мобильник – да? Нет?
  Imya : String[20]; //имя владельца телефона
  Otchestvo : String[20]; //его отчество
  Familiya : String[20]; //его фамилия
  Adres : String[50]; //его адрес
end; //record

var
  fMain: TfMain;
  sprav: array of myTFSprav; //объявляем динамический массив нашей записи

Как видите, мы указали немало полей в записи. Однако, не все из них будут обязательны для заполнения. Есть данные? Запишем. Нет? Поля можно оставить пустыми. Фактически, необходимыми записями являются только две – номер телефона и имя его владельца. Номер телефона нам нужен, потому что это ведь телефонный справочник, и нет смысла в записи, если мы не указываем там поле с номером телефона. Имя нам тоже необходимо, ведь зачем нам в файле номер телефона, если мы не знаем, чей это номер?

Сразу же создадим обработчик событий для кнопки "Выйти из программы". Там пишем просто:

Close;

Далее обработаем кнопку "Добавить телефон". В самом начале у нас ведь еще нет записей, поэтому первым делом пользователь введет парочку – другую телефонных номеров.

{Добавить телефон}
procedure TfMain.Button1Click(Sender: TObject);
var
  i : Integer;  //для счетчика записей
begin
  {Проверяем обязательные параметры:} 
 //если номера телефона нет, выходим:
  if MaskEdit1.Text = '8(374)-   -  -  ' then begin  //здесь введите свой код города
    ShowMessage('Впишите номер телефона!');
    MaskEdit1.SetFocus;
    Exit;
  end; //if

  //если имени нет, выходим:
  if Edit1.Text = '' then begin
    ShowMessage('Впишите имя владельца телефона!');
    Edit1.SetFocus;
    Exit;
  end; //if

  //действительно ли пользователь хочет сохранить телефон?
  if Application.MessageBox('Вы уверены, что хотите сохранить этот телефон?',
    'Внимание!', MB_YESNOCANCEL+MB_ICONQUESTION)<> IDYES then Exit;

  {Пользователь указал номер телефона и имя, и желает сохранить телефон
   в список.}

  //проверяем номер телефона на совпадение с имеющимися номерами, 
  //если там есть записи. Для проверки используем цикл, сверяем каждую запись.
  //Если такая запись уже есть, сообщаем об этом и выходим из процедуры:
  if length(sprav) > 0 then
    for i := Low(sprav) to High(sprav) do
      if sprav[i].TelNum = MaskEdit1.Text then begin
        ShowMessage('Такой номер уже есть!');
        Exit;
      end; //if

  //добавляем новый элемент к массиву:
  SetLength(sprav, Length(sprav)+1);

  //записываем новый телефон в список:
  sprav[High(sprav)].TelNum := MaskEdit1.Text;
  if ComboBox2.ItemIndex = 0 then
    sprav[High(sprav)].Mobil := True
  else sprav[High(sprav)].Mobil := False;
  sprav[High(sprav)].Imya := Edit1.Text;
  sprav[High(sprav)].Otchestvo := Edit2.Text;
  sprav[High(sprav)].Familiya := Edit3.Text;
  sprav[High(sprav)].Adres := Edit4.Text;

  //очищаем поля на форме:
  MaskEdit1.Text := '8(374)-   -  -  ';
  ComboBox2.ItemIndex := 0;
  Edit1.Text := '';
  Edit2.Text := '';
  Edit3.Text := '';
  Edit4.Text := '';

  ShowMessage('Телефон '+ sprav[High(sprav)].TelNum + ' добавлен!');

  //обновим ComboBox с телефонами:
  ChangeCombo;
end;
< Лекция 21 || Лекция 22: 123 || Лекция 23 >
Виктор Пелих
Виктор Пелих

Здравствуйте.
Прохожу курс "Введение в программирование на Delphi"
Добрался до Лекции 29: Введение в базы данных.

Установлена RAD Studio 11.3, у которой отсутствует вкладка BDE и, соответственно, компонент Table,  который обеспечивает доступ к таблице средствами механизма BDE.
Поиск в интернете подсказал 
BDE Installer for RAD Studio, Delphi, C++Builder 10.3 Rio
Подскажите, имеется ли ещё возможность использовать механизм BDE в Delphi11 и если такая возможность есть, как подключить BDE к Delphi11?
С уважением...

 

Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?