Розглянемо тепер особливості запису у файл та читання з файла текстової інформації. Для цього можна використовувати різні компоненти, як розглянуті раніше, так і інші, наприклад, компонент ListBox, котрий реалізує введення рядка тексту безпосередньо за допомогою клавіатури і спеціального редактора. Вікно цього редактора відкривається, якщо вибрати властивість Items і клацнути мишкою на кнопці з зображенням крапок у вікні Object Inspector.
Розглянемо програмне використання компонента ListBox.
Приклад 16.6. Необхідно ввести у вікно редактора ListBox деякий текст і записати цей текст у файл. Припустимо, що при читанні файла в тексті були виявлені помилки. Потрібно програмними засобами виправити ці помилки і знову текст записати у файл.
Оскільки компонент ListBox використовує клас об’єктів TStrings, то він успадковує всі властивості і методи цього класу, наприклад, такі методи, як:
- SaveToFile(іф) — запис тексту у файл з ім’ям «іф»;
- LoadFromFile(іф) — читання файла «іф» у вікно компонента ListBox.
Для розв’язання прикладу розмістимо на формі такі компоненти:
- Label1— для виведення підказки при редагуванні тексту;
- Edit1 — для редагування тексту;
- ListBox — для розміщення тексту;
- кнопку Button1 з назвою «Записать»;
- кнопку Button2 з назвою «Прочитать»;
- кнопку Button3 з назвою «Исправить»;
- кнопку BitBtn з назвою «Close».
Форми і програмний код мають вигляд:
// глобальные данные AnsiString s1, s2, s3; int k, mode=0; //----------------------------------------------------------------------------------------- //------------------------------------------- запись текста в файл void_ fastcall TForm1::Button1Click(TObject *Sender) { ListBox1->Items->SaveToFile("d:\\Users\\Dat_Base\\stich.txt"); ListBox1->Items->Clear(); } //---------------------------------------- чтение текста из файла void_ fastcall TForm1::Button2CIick(TObject *Sender) { ListBox1->Items->LoadFromFile("d:\\Users\\Dat_Base\\stich.txt"); } //--------------------------------------------- исправление текста void_ fastcall TForm1 ::Button3Click(TObject *Sender) { int i; for (і = 0; і < ListBox1 -> Items -> Count; i++) // занесение выделенной строки в переменную s1 if (ListBox1->Selected[i]) { s1=ListBox1->Items->String[i]; Label1->Visible=true; //визуализация компонентов Edit1 и Label1 Edit1->Visible=true; Label1->Caption="Bведите заменяемый текст"; k=i; Edit1->SetFocus(); } // передача фокуса компоненту Edit1 } void_fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key) { if (Key==13) // если нажата клавиша Enter? { mode++; if (mode==l) { //запись неправильного фрагмента в перемен.s2 s2=Edit1->Text; Edi1->Text=""; Label1->Caption = "Введите правильный текст"; } else if (mode==2) { // запись правильного фрагмента в перемен. s3 s3=Edit1->Text; Edit1->Text=""; Label 1 -> Caption=" Результат"; //формирование правильного текста int t=s1.Pos(s2); Edit1->Text=s1.SubString(1,t-1)+s3+s1.SubString(t+s2.Length(),20); } else if (mode==3) { ListBox1->Items->Strings[k]=Edit1->Text; mode=0; Editl->Text=" "; Label1->Visible=false; Edit1->Visible=false; } } }
Під час створення програмного коду оголошуються глобальні змінні s1, s2, s3 — типу AnsiString, а також k і mode = 0 типу int. Далі записані оброблювачі подій. Перший оброблювач складається з двох параметрів: оператора запису у файл — ListBox1->Items->SaveToFile(iф) і оператора очищення поля компонента ListBox для розміщення там прочитаного тексту з файла — ListBox->Items->Clear().
Другий оброблювач служить для читання тексту з файла у вікно ListBox.
Третій оброблювач разом з четвертим розв’язують задачу редагування тексту. Для цього спочатку мишкою треба виділити рядок тексту, що містить помилку, потім у циклі for визначається цей рядок і записується у змінну si. Далі візуалізуються компоненти Label1 і Edit1, що при проектуванні форми були сховані шляхом надання їх властивостям Visible значення «false». При цьому у властивості Caption компонента Label1 було записано текст: «Введите заменяемый текст», а вікно компонента Edit1 було очищено. У вікні компонента Edit1 треба ввести помилковий текст, тобто той фрагмент, який треба замінити.
Цей приклад першу помилку містить у першому рядку, де замість «в лесу» написано «в углу». Тому спочатку був виділений перший рядок, а у вікно Edit було введено помилкове слово «углу». Після введення цього фрагмента треба натиснути клавішу Enter, і далі почне працювати четвертий оброблювач, тобто оброблятися подія Edit1KeyPress. Тут змінна mode збільшується на 1, змінній s2 буде присвоєне значення введеного помилкового фрагмента, у полі компонента Label1 з’явиться текст «Введите правильний текст», а поле введення — Editl знову очиститься від раніше введеного тексту. Тепер треба ввести правильний фрагмент (у нашому випадку слово «лесу») і натиснути Enter. Знову активується оброблювач Edit1KeyPress(), mode одержить значення 2, у змінну s3 буде записаний правильний текст, далі поле Edit1 знову очиститься, a Label1 одержить текст «Результат». Після чого у поле Edit1 буде записано рядок, в якому помилковий текст буде замінено правильним. У цьому процесі використовувалися рядкові функції Pos() і SubString().
Якщо в даному рядку більше помилок немає, треба натиснути Enter і рядок з поля Edit1 буде переписано у вікно ListBox.
У випадку, коли необхідно редагувати пакет далі, треба виділити відповідний рядок і всі операції повторити.
На формі зображені всі етапи цієї роботи, а в програмному коді додатка — усі необхідні для цього оброблювача події.
Форма розглянутого прикладу має чотири кнопки, а запис тексту у файл і читання його з файла здійснюється однією командою.