Опубликован: 07.04.2008 | Уровень: специалист | Доступ: свободно
Лекция 22:

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

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

Процедуры ChangeCombo еще нет, мы предназначили ее для того, чтобы пользователь мог выбрать нужный телефон из списка, а процедура обновляет список. Поскольку эта процедура должна быть описана выше того места, где мы ее используем, то опишем ее самой первой, после директивы компилятору {$R *.dfm}:

{Процедура обновления ComboBox1}
procedure ChangeCombo;
var
  i : Integer;  //счетчик для цикла
begin
  //если массив пустой - выходим:
  if Length(sprav) = 0 then Exit;
  //если что-то есть, то сначала очистим ComboBox:
  fMain.ComboBox1.Items.Clear;
  //затем добавим в него каждый номер телефона из массива:
  for i := 0 to High(sprav) do
    fMain.ComboBox1.Items.Add(sprav[i].TelNum);
end;

Сохраните проект и скомпилируйте его, впишите пару телефонов и убедитесь, что они попадают в ComboBox. Программа уже вовсю работает с динамическим массивом и сохраняет в него данные. Однако пока что данные хранятся только в памяти, нужно научить программу сохранять их в файл. Создаем для формы обработчик событий onDestroy, то есть, когда форма разрушается, наши данные попадут в файл. Файл будет создаваться, если его не было, или перезаписываться, если он уже был.

{при выходе из программы обновим файл:}
procedure TfMain.FormDestroy(Sender: TObject);
var
  f : File of myTFSprav;
  i : Integer;
begin
  //создаем или перезаписываем файл:
try
  AssignFile(f, 'mySprav.dat');
  Rewrite(f);
  //записываем все данные архива:
  for i := Low(sprav) to High(sprav) do
    Write(f, sprav[i]);
finally
  CloseFile(f);
end; // try

end;

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

Write(f, sprav[i]);

причем делаем это в цикле от первого до последнего элемента массива. Эта функция записывает в файл f запись нужного типа sprav[i]. В примере у нас в этой строке сохраняется только один элемент массива, все его поля, после чего указатель перемещается к концу. В следующем проходе цикла сохраняться будет уже следующий элемент массива, и так далее, увеличивая файл.

Ну и наконец, обратите внимание, что в качестве файла мы указали только имя и расширение, следовательно, он будет создаваться в той же папке, откуда запущена программа. Вы можете использовать примеры из прошлых лекций и изменить имя файла в функции AssignFile(), указав там и адрес программы.

Сохраните пример и скомпилируйте его. Впишите пару записей и выйдите из программы. Посмотрите в директорию – там должен появиться файл – справочник.

Наша программа уже умеет сохранять данные в файл, теперь научим ее загружать их из файла. Создаем для формы обработчик onCreate, и вписываем туда код:

{При включении программы загружаем список}
procedure TfMain.FormCreate(Sender: TObject);
var
  f : File of myTFSprav;
begin
try
  AssignFile(f, 'mySprav.dat');
  Reset(f);
  //считываем все данные в архив:
  while not Eof(f) do begin
    //добавляем новый элемент массива
    SetLength(sprav, Length(sprav)+1);
    Read(f, sprav[High(sprav)]);
  end;  //while
finally
  CloseFile(f);
end; // try
  //обновим ComboBox с телефонами:
  ChangeCombo;
end;

Обратите внимание, что мы не знаем заранее, сколько там записей, поэтому использовать цикл for не можем. Зато мы можем использовать while. Функция Eof(f) вернет истину, когда будет достигнут конец файла f. И каждый раз, для новой записи, мы добавляем один элемент к массиву. Мы должны сделать это раньше, чем будем считывать запись, потому что, если для записи не выделена память, то некуда будет считывать новую запись и программа выдаст ошибку.

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

Однако еще программе не хватает "изюминки" - надо бы, чтобы данные этой записи отображались на форме, когда пользователь выберет тот или иной телефон в ComboBox. Выделяем этот компонент и пишем для него обработчик событий onChange:

{Выбрали другой объект в combobox1}
procedure TfMain.ComboBox1Change(Sender: TObject);
begin
  MaskEdit1.Text := sprav[ComboBox1.ItemIndex].TelNum;
  if sprav[ComboBox1.ItemIndex].Mobil then
     ComboBox2.ItemIndex := 0
  else ComboBox2.ItemIndex := 1;
  Edit1.Text := sprav[ComboBox1.ItemIndex].Imya;
  Edit2.Text := sprav[ComboBox1.ItemIndex].Otchestvo;
  Edit3.Text := sprav[ComboBox1.ItemIndex].Familiya;
  Edit4.Text := sprav[ComboBox1.ItemIndex].Adres;
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?
С уважением...

 

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

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

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

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

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