§ 7. Работа со стандартными диалогами

7.3. Диалоги для работы с файлами

Диалоги для открытия и сохранения файлов (пример 7.8) используются в различных приложениях. Основное свойство компонентов OpenDialog и SaveDialog, в котором имя файла возвращается в виде строки, — это свойство FileName. Если задать данное свойство на этапе конструирования в окне инспектора объектов, то при открытии диалога, оно будет появляться в строке Имя файла.

Пример 7.9. Создать проект «Числа». Сгенерировать случайные числа в заданном диапазоне и сохранить их в файл. Посчитать сколько в файле чисел, кратных заданному. Результат вывести на форме.

Этапы выполнения задания

  1. Поместить на форму компоненты: OpenDialog1, SaveDialog1, LabeledEdit1, LabeledEdit2, LabeledEdit3, LabeledEdit4, Button1, Button2, Label1.
  2. Изменить свойство Caption компонента LabeledEdit1 — «Количество чисел».
  3. Изменить свойство Caption компонента LabeledEdit2 — «Начало промежутка».
  4. Изменить свойство Caption компонента LabeledEdit3 — «Конец проежутка».
  5. Изменить свойство Caption компонента LabeledEdit4 — «Число».
  6. Очистить свойство Caption компонента Label1.
  7. Изменить свойство Caption компонента Button1 — «Записать числа в файл».
  8. Изменить свойство Caption компонента Button2 — «Искать кратные в файле».
  9. Написать обработчик события OnClick для компонента Button1.
  10. Написать обработчик события OnClick для компонента Button2.
  11. Подключить библиотеки:
    #include <fstream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
  12. Дописать строку:

using namespace std;

Имя файла, которое принимает диалог, является строкой. В системе программирования CBuilder поддерживается свой собственный тип строк: String. Для совместимости этого типа строк с типом string, необходимо преобразование, которое можно выполнить, используя команду c_str().

Далее работа с текстовыми файлами происходит так же, как и в среде CodeBlocks.

Рассмотрим некоторые свойства диалогов для работы с файлами.

Типы искомых файлов, появляющиеся в строке Тип файла, задаются свойством Filter. Данное свойство можно задать на этапе проектирования, нажав кнопку  около свойства Filter в окне инспектора объектов (пример 7.10). Редактор фильтров позволяет устанавливать маски шаблонов файлов. В поле Filter Name задается тот текст, который пользователь увидит в строке Тип файла окна диалога. В столбце Filter задается шаблон (символ «*» обозначает любой набор символов, символ «?» заменяет один любой символ).

Свойство DefaultExt определяет значение расширения файла, задаваемое по умолчанию. Если значение этого свойства не задано, пользователь должен указать в диалоге полное имя файла с расширением. Если значение задано, то имя файла можно указывать без расширения (пример 7.11).

Свойство FilterIndex определяет номер фильтра, который увидит пользователь при открытии окна диалога.

Свойство InitialDir компонентов OpenDialog и SaveDialog позволяет настроить папку (пример 7.12), содержимое которой будет открываться при первом вызове диалогового окна. Если значение не установлено, то в первый раз будет открываться папка Мои документы, в дальнейшем — последняя использовавшаяся папка.

Свойство Title позволяет задать заголовок диалогового окна..

Пример 7.8. Стандартные диалоги для открытия и сохранения файла:

Пример 7.9. Форма на этапе конструирования:

Обработчик события OnClick для компонента Button1

void __fastcall TForm1::Button1Click(
TObject *Sender)

{

  srand(time(NULL));

  int n = StrToInt(LabeledEdit1 -> Text);

  int a = StrToInt(LabeledEdit2 -> Text);

  int b = StrToInt(LabeledEdit3 -> Text);

  if (SaveDialog1 -> Execute()) {

  String s = SaveDialog1 -> FileName;

  ofstream fout(s.c_str());

  fout << n << endl;

  for (int i = 0; i < n; i++){

    int x = rand() % (b - a + 1) + a;

    fout << x << endl;

  }

  fout.close();

  }

}

Обработчик события OnClick для компонента Button2

void __fastcall TForm1::Button2Click
                TObject *Sender)

{

  int z = StrToInt(LabeledEdit4 -> Text);

  if (OpenDialog1 -> Execute()) {

    String s = OpenDialog1 -> FileName;

    ifstream fin(s.c_str());

    int n, k = 0;

    fin >> n;

    for (int i = 0; i < n; i++){

      int x;

      fin >> x;

      if (x % z == 0)

        k++;

    }

    Label1 -> Caption ="Найдено " +

    IntToStr(k) + чисел";

  }

}

Работающее приложение:

Содержимое текстового файла:

Пример 7.10. Свойство Filter:

Пример 7.11. Окно Сохранение

В инспекторе объектов установлены фильтры, которые описаны в примере 7.10. Значения свойств DefaultExt и FilterIndex:

Пример 7.12. Если необходимо, чтобы при сохранении или загрузке файла открывалась текущая папка (папка, в которой находится скомпилированный файл проекта), то в событии FormCreate необходимо прописать команды:

OpenDialog1 -> InitialDir = ExtractFilePath(ParamStr(0));
SaveDialog1 -> InitialDir =
OpenDialog1 -> InitialDir;