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

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

Дыялогі для адкрыцця і захавання файлаў (прыклад 7.8) выкарыстоўваюцца ў розных дадатках. Асноўная ўласцівасць кампанентаў OpenDialog і SaveDialog, у якой вяртаецца ў выглядзе радка імя файла,  гэта ўласцівасць FileName. Калі задаць дадзеную ўласцівасць на этапе канструявання ў акне інспектара аб'ектаў, то пры адкрыцці дыялогу яна будзе з'яўляцца ў радку Імя файла.

Прыклад 7.9. Стварыць праект «Числа». Згенерыраваць выпадковыя лікi ў зададзеным дыяпазоне і захаваць іх у файл. Палічыць колькі ў файле лікаў, кратных зададзеным. Вынік вывесці на форме.

Этапы выканання задання

  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;