Материал: TStringList

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

TStringList *List = new TStringList;

List->Duplicates = dupIgnore;

List->Sorted = true;

for(int i = 0; i < Memo1->Lines->Count; i++)

{

List->Add(Memo1->Lines->Strings[i]);

}

Memo1->Clear();

List->SaveToFile("NEW.txt"); //сохранение значения поля Memo без дубликатов строк в файл "NEW.txt"

Memo1->Text = List->Text; //в Memo будет уже отредактированное значение без дубликатов

Работа с файлами с использованием функций компонент

Многим визуальные компоненты и некоторые классы имеют доступ к функциям:

LoadFromFile("Имя файла");

SaveToFile("Имя файла");

Эти функции особенно удобны для работы с текстовыми фыйлами.

Примеры загрузки и сохранения файлов:

//Визуальный компонент TMemo:

Memo1->Lines->Clear();

Memo1->Lines->LoadFromFile("a.txt");

......

Memo1->Lines->SaveToFile("a.txt");

......

//Класс TStringList:

TStringList * ptStrintList;

ptStrintList->Clear();

ptStrintList=new TStringList();

ptStrintList->LoadFromFile("a.txt");

......

ptStrintList->SaveToFile("a.txt");

......

ptStrintList->Free();

//Визуальный компонент TListBox1:

ListBox1->Items->Clear();

ListBox1->Items->LoadFromFile("a.txt");

......

ListBox1->Items->SaveToFile("a.txt");

//Визуальный компонент TListBox1:

ComboBox1->Items->Clear();

ComboBox1->Items->LoadFromFile("a.txt");

......

ComboBox1->Items->SaveToFile("a.txt");

//Визуальный компонент TRichEdit:

RichEdit1->Lines->Clear();

RichEdit1->Lines->LoadFromFile("a.txt");

.....

RichEdit1->Lines->SaveToFile("a.txt");

И.т.д.

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

RichEdit1->Lines->SaveToFile("a.rtf");

Работа с текстовыми файлами с использованием методов перечисленных классов и компонент аналогична. Все они имеют счетчик строк:

Memo1->Lines->Count;

RichEdit1->Lines->Count;

ptStrintList->Count;

ListBox1->Items->Count;

ComboBox1->Items->Count;

Все компоненты позволяют удалять, вставлять и добавлять строки (пример удаления второй строки вставки на ее место новой строки и добовления в конец списка новой строки):

AnsiString vasS="Yes";

if(Memo1->Lines->Count >= 2)

{

Memo1->Lines->Delete(1);

Memo1->Lines->Insert(1,vasS);

}

Memo1->Lines->Add(vasS);

if(RichEdit1->Lines->Count >= 2)

{

RichEdit1->Lines->Delete(1);

RichEdit1->Lines->Insert(1,vasS);

}

RichEdit1->Lines->Add(vasS);

if(ptStrintList->Count >= 2)

{

ptStrintList->Delete(1);

ptStrintList->Insert(1,vasS);

}

ptStrintList->Add(vasS);

if(ListBox1->Items->Count >= 2)

{

ListBox1->Items->Delete(1);

ListBox1->Items->Insert(1,vasS);

}

ListBox1->Items->Add(vasS);

if(ComboBox1->Items->Count >= 2)

{

ComboBox1->Items->Delete(1);

ComboBox1->Items->Insert(1,vasS);

}

ComboBox1->Items->Add(vasS);

Содержимое строк можно получит по номеру строки n:

AnsiString vasS;

vasS=Memo1->Lines->Strings[n];

vasS=RichEdit1->Lines->Strings[n];

vasS=ptStrintList->Strings[n];

vasS=ListBox1->Items->Strings[n];

vasS=ComboBox1->Items->Strings[n];

Возможно присвоить некоторой строке текст для дальнейшей манипуляции содержимым текста как единой строкой и далее перенести исправленный текст опять в компоненты:

AnsiString vasS;

vasS=Memo1->Lines->GetText();

... манипуляции с текстом как единой строкой

Memo1->Lines->SetText(vasS.c_str());

RichEdit1->Lines->LoadFromFile("a.txt");

vasS=RichEdit1->Lines->GetText();

... манипуляции с текстом как единой строкой

RichEdit1->Lines->SetText(vasS.c_str());

vasS=ptStrintList->GetText();

... манипуляции с текстом как единой строкой

ptStrintList->SetText(vasS.c_str());

vasS=ListBox1->Items->GetText();

... манипуляции с текстом как единой строкой

ListBox1->Items->SetText(vasS.c_str());

vasS=ComboBox1->Items->GetText();

... манипуляции с текстом как единой строкой

ComboBox1->Items->SetText(vasS.c_str());

Кроме того компоненты TComboBox и TListBox позволяют (лучше в обработчике своих событий OnChange) получить доступ к выбранным строкам:

Void __fastcall

TForm1::ComboBox1Change(TObject *Sender)

{

AnsiString vasS=ComboBox1->Items->Strings[ComboBox1->ItemIndex];

}

Void __fastcall

TForm1::ListBox1Click(TObject *Sender)

{

AnsiString vasS=ListBox1->Items->Strings[ListBox1->ItemIndex];

}

Компоненты TComboBox и TListBox кроме того позволяют определить номер строки по тексту в строке:

int n;

n=ComboBox1->Items->IndexOf("Yes");

n=ListBox1->Items->IndexOf("Yes");

Компоненты TComboBox и TListBox, класс TStringList кроме того позволяют выполнить сортировку загруженных строк:

ptStrintList->Sort();

ListBox1->Sorted=true;

ComboBox1->Sorted=true;

Перечисленные методы практически полностью перекрывают все потребности для работы с текстовыми файлами. Как правило в большинстве случаев достаточными являются TMemo TrichEdit и класс TStringList.

Однако многими возможностями при работе с текстом обладает класс TFileStream.

В начало

Работа с файлами с использованием класса tFileStream

Следующий пример работы с текстовым файлом с использованием класса TFileStream может показаться некоторым программным извращением (класс более подходит для работы с бинарными файлами), но посколько при работе с текстовыми ресурсами наиболее удобными являются потоки, то рассмотрим и эту возможность.

Ниже приведенный пример демонстрирует эту возможность:

Void __fastcall

TForm1::Button1Click(TObject *Sender)

{

//Создаем поток и загружаем в него содержимое файла

TFileStream * tfile=new TFileStream("b.txt",fmOpenReadWrite);

//При открытии указатель и так на нуле и следующая строка лишняя

tfile->Seek(0,0);

//Буфер для информации

char *vchrgBuf;

//Выделяем память для него

if ((vchrgBuf = (char *) malloc(tfile->Size)) == NULL)

{

//Здесь можно поместить сообщение об ошибке выделения памяти

return;

}

//Читаем информацию в буфер

tfile->Read(vchrgBuf,tfile->Size);

//Копируем информацию в AnsiString

AnsiString vasS=vchrgBuf;

//На всякий случай

vasS.SetLength(tfile->Size);

//Освобождаем память

free(vchrgBuf);

//Очищаем поток

tfile->Size=0;

//Заносим данные в компонент TMemo для того

//чтобы посмотреть, что там есть

//Memo1->Lines->Clear();

Memo1->Lines->Add(vasS);

//Изменим содержимое данных

if(Memo1->Lines->Count >= 2)

{

Memo1->Lines->Delete(1);

String vasS1="WWWW";

Memo1->Lines->Insert(1,vasS1);

}

//Забираем содержимое TMemo в AnsiString

vasS=Memo1->Lines->GetText();

//Выделяем память для буфера

if ((vchrgBuf = (char *) malloc(vasS.Length())) == NULL)

{

//Здесь можно поместить сообщение об ошибке выделения памяти

return;

}

//Переносим измененный текст в буфер

vchrgBuf=vasS.c_str();

tfile->Write(vchrgBuf,vasS.Length());

//Освобождают поток и переносим в память

tfile->Free();

//Освобождаем память

//free(vchrgBuf);

}

Выбор компонентов для групповых операций

Для эффективной разработки пользовательских интерфейсов приложений C++ Builder нередко возникает необходимость в манипулировании компонентами на формах.. Большинство операций для манипулирования компонентами находятся в меню Edit: К различным опциям этого меню следует обращаться после того, как на форме вы ран один или несколько компонентов, свойства которых требуется изменить.

Выбрать один компонент можно следующими способами:

  • Выбрав с помощью мыши компонент на форме

  • Выбрав имя компонента в селекторе объектов.

  • Переходом к компоненту на форме, нажимая клавишу Tab.

Выбрать несколько компонентов можно следующими способами:

  • Удерживая нажатой клавишу Shift, щелкнуть мышью на каждом компоненте

  • Нажать левую клавишу мыши и окружить нужные компоненты прямоугольным контуром

Установка разделяемых свойств компонентов

Большинство визуальных компонентов имеют общие свойства, (например, Visible, Width, Left). Для установки одинаковых значений общих свойств для нескольких компонентов необходимо выполнить следующие действия:

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

Рис. 1. Выбор нескольких компонентов для групповых операций

2. Установить значения свойств, общих для выделенных компонентов.

Рис.2 показывает результаты изменения свойства Font и Left . Все выбранные компоненты приобрели одинаковые значения этих свойств.

Рис. 2 Установка разделяемых свойств компонентов

Изменение размера компонентов

Изменение размера компонента можно проводить как при добавлении его на форму, так и после этого.

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

Рис. 3. Изменение размера компонента при его добавлении на форму.

Если перевести курсор мыши на один из появившихся вокруг компонента мале ьких черных квадратиков, курсор мыши изменяет форму. Перемещая этот курсор и вместе с ним границу компонента, можно изменять его размеры.

Для изменения размеров нескольких компонентов следует выбрать их одним из описанных выше способов. Далее нужно выбрать пункт меню Edit/Size. Появится диалоговое окно Size. Выберите опции размера. Для точной установки размера в пикселах можно ввести числа в поля Width и Height. Далее нужно нажать кнопку OK.

Рис. 4. Установка свойств компонентов c использованием меню EDIT/SIZE

Можно добавить несколько копий компонента одного типа, выбирая компонент из палитры при нажатой клавише Shift. В этом случае вокруг компонента появляется п ямоугольник, окружающий этот компонент. После этого каждый щелчок мышью на фо ме приводит к появлению на ней копии компонента. Закончив режим многократного копирования, следует щелкнуть мышью на инструменте выбора курсора (первая кнопка на палитре компонентов с изображением стрелки).

Выравнивание компонентов

Для выравнивания компонентов на форме можно использовать следующие комбинации клавиш:

Shift + стрелки

Изменяет размер компонента на один пиксел в направлении выбранной стрелки

Shift + Ctrl + стрелки

Перемещает компонент на одну единицу сетки в направлении выбранной стрелки

Ctrl + стрелки

Перемещает компонент на один пиксел в направлении выбранной стрелки

Можно также выровнять компоненты, используя пункт меню View/Alignment Palette. Для этого нужно:

  1. Выбрать компоненты для выравнивания.

  2. Выбрать пункт меню View/Alignment Palette.

  3. Выбрать нужную кнопку (см. рис. 5).

Рис.5 Выравнивание компонентов с помощью View/Alignment Palette

Можно выровнять компоненты, используя пункт меню Edit/Align. Для этого нужно:

  1. Выбрать компоненты для выравнивания.

  2. Выбрать пункт меню Edit/Align. Появится диалоговое окно Alignment.

  3. Выбрать нужную опцию и нажать на кнопку OK (рис 6).

Рис.6. Выравнивание компонентов с помощью меню Edit/Align

Можно изменить условия выравнивания компонент, используя пункт меню Options/Environment. Для этого нужно:

1. Выбрать пункт меню Options/Environment. Диалоговое окно Environment появится открытым на странице Preferences.

2. В группе Form designer можно выбрать следующие опции:

  • Display grid - сделать сетку из точек на форме видимой для выравниваемых компонентов

  • Snap to grid - заставить левые и верхние стороны компонентов расположиться а линиях сетки.

3. Для того, чтобы изменить расстояние между узлами сетки, нужно ввести новые значения вместо имеющихся. Значение по умолчанию -- 8 пикселей по оси X (по горизонтали) и по оси Y (по вертикали).

4. Нажать OK.

Рис. 7. Выравнивание компонентов с помощью страницы Preferences диалоговой панели Environment

Пример: Создание текстового редактора

Проектирование формы приложения

Попробуем использовать полученные знания для создания текстового редактора, с помощью которого можно было бы создавать новые файлы, открывать имеющиеся, ре актировать и сохранять их, а также использовать буфер обмена для работы с фрагментами текста. Для этого создадим новый проект, основанный на пустой форме, и сохраним ее под именем Edit1.cpp. Сам проект сохраним под именем Edit.mak.

На пустой форме разместим компонент TPanel - будущую инструментальную панель нашего редактора. Свойству Align полученного компонента Panel1 присвоим значение alTop, а свойству Caption - пустую строку.

Далее разместим на форме компонент TMemo и присвоим его свойству Align значение alClient, свойству ScrollBars - значение ssVertical, а свойству Lines - пустой массив строк (редактор свойств, являющихся строковыми массивами, как п авило, представляет собой обычный текстовый редактор).

Вспомним о том, что наш будущий текстовый редактор должен открывать и сохра ять файлы. Для этой цели воспользуемся стандартными диалогами Windows 95, содержащимися в библиотеке comdlg32.dll. Для этого поместим на форму два диалога со страницы Dialogs: TOpenDialog и TSaveDialog. Изменим свойство Filter созданного только что компонента OpenDialog1, внеся две строки в диалоговую панель Filter Editor и нажав кнопку OK (рис. 8).

Рис. 8. Установка свойства Filter компонента OpenDialog1.

Теперь можно взять в буфер обмена строку, образовавшуюся в колонке значений апротив свойства Filter, выбрать компонент SaveDialog1 и вставить содержимое буфера обмена в строку напротив свойства Filter. Этим самым мы установим такое же значение свойства Filter для второго диалога. При желании можно изменить заголовки диалоговых панелей (свойство Caption) и другие параметры (свойство Options).

Обратите внимание на то, что языковая версия библиотеки может быть в общем случае как русской, так и английской, так как это ресурс Windows, а не вашего приложения. Поэтому, если вашим пользователям нужно, чтобы стандартные диалоги Windows были русскоязычными, рекомендуйте им установить русскую версию Windows 95 или Windows NT Workstation, либо попробуйте заменить на компьютерах пользователей имеющуюся версию comdlg32.dll на русскоязычную. Впрочем, на странице System имеется достаточное количество компонент для создания "самодельных" диалогов для работы с файлами...