Delphi 6 программирование


использования TStringList



Рисунок 18.10. Пример использования TStringList


  • Поместите на панель еще одну кнопку TBitBtn и установите в ее свойство Kind значение bkClose.
  • Поместите на панель компонент OpenDialog из страницы компонентов Dialogs. Этот компонент создает и обсуживает стандартное для Windows окно открытия файла. С его помощью при прогоне программы вы сможете выбрать текстовый файл (например, файл с текстом программы), чтобы программа показала в таблице все слова из этого файла.
  • На форму (а не на панель panel1) положите компонент TStringGrid.
  • Поместите в его свойства ColCount и RowCount значения 2 (количество колонок и рядов таблицы должно быть больше, чем количество фиксированных колонок FixedCois и количество фиксированных рядов FixedRows). Установите в свойство Align компонента значение alClient, чтобы он занял все свободное место формы.

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

Создайте такой обработчик события OnClick для кнопки BitBtn1:

procedure TfmStGrid.BitBtnIClick(Sender: TObject) ;

Function GetWord(var S: String): String;

{ Вспомогательная функция для выделения очередного слова из

строки }



const // Множество символов слова:

Letters: set of Char = ['a'..'z', 'A'..'Z', 'A'..'я'];

begin

Result := '' ;

{ Уничтожаем в начале строки все символы, не относящиеся к слову }

while (S о '') and not (S[1] in Letters) do

Delete (S, 1, 1);

// Формируем очередное слово

while (S<> '') and (S[1] in Letters) do

begin

Result := Result + S[1];

Delete (S, 1, 1)

end;

end; //Get Word

var

F: TextFile; // Файл с текстом S,

Word: String; // Вспомогательные строки

NCol, NRow: Integer;// Номер текущей колонки и текущего ряда Words: TStringList; // Список отсортированных слов из файла

begin

// С помощью стандартного диалога получаем имя файла

if not OpenDialogI.Execute then

Exit; // Пользователь отказался выбрать файл

// Пытаемся открыть файл

AssignFile(F, OpenDialogI.FileName) ;

try

Reset(F) ;

except

// Файл нельзя открыть:

ShowMessage('Невозможно открыть файл ' +OpenDialogI.FileName) ;

Exit;

end;

// Готовим список Words:

Words := TStringList.Create;

Words.Sorted := True; // Сортируем строки Words.Duplicates := duplgnore; // Отвергаем дубликаты

// Изменяем курсор перед длительной работой

Screen.Cursor := crHourGlass;

// Читаем файл по строкам

while not EOF(F) do

begin

ReadLn(F, S); // Читаем очередную строку

// Выделяем из строки слова и заносим их в список Words

while S о '' do

begin

Word := GetWord(S) ;

if Word о '' then

Words.Add(Word) // He вставляем пустые строки

end

end;

Screen.Cursor := crDefault; // Восстанавливаем курсор

CloseFile(F); // Закрываем файл

if Words.Count=0 then

Exit; // Пустой файл - выходим

with sgWords do

begin

NCol := 1; // Номер первого столбца слов

// Цикл формирования таблицы

while Words.Count > 0 do

begin

{Формируем заголовок столбца и начальное значение номера ряда}

Cells [NCol, 0] := Words[0][1];

NRow := О

// Цикл заполнения очередного столбца

while (Words.Count > 0) and

(Words[0][1] = Cells[NCol, 0]) do

begin

inc(NRow); // Номер текущего ряда

if NRow = RowCount then

begin // Расширяем длину таблицы

RowCount := RowCount + 1;

{Для свойства RowCount нельзя, использовать функцию инкремента inc!} Cells [0, NRow] := IntToStr(NRow);

end;

Cells[NCol, NRow] :=Words[0];

Words.Delete(0) ;

end;

// Переходим к следующему столбцу

if Words.Count=0 then

Break; // Кончаем работу, если слов больше нет

inc(NCol); // Переходим к следующей колонке

ColCount := ColCount+1 // Расширяем таблицу справа

//на 1 колонку

end;

end;

end;



Содержание раздела