Delphi (Lazarus). Компоненты для работы с символами, строками, текстом




Содержание:
  • Списки выбора.
  • Манипуляции со строками объектов ComboBox и ListBox.
  • Таблица строк StringGrid

  • Списки выбора.


    На закладке "standard" есть два компонента, это ListBox и ComboBox .
    Оба этих компонента позволяют создавать списки, содержащие строки Items. Компонент ListBox - список строк. Строки можно загружать из файла, сохранять в файле, программно добавлять или удалять отдельные строки. Компонент ComboBox, аналогичен компоненту ListBox, но список "вываливается" при щелчке на кнопку, а выделенная строка отображается в редакторе.
    Для изучения свойств этих компонентов, разработаем специальный текстовый редактор. Известно, что профессиональные WEB дизайнеры пишут HTML код в обычном блокноте. Облегчим жизнь дизайнерам и создадим блокнот, в котором будет список тэгов, которые можно будет по мере надобности вставлять в текст HTML страницы. Для изготовления программы установим компоненты так, как показано на рисунке.



    Компонент Panel1 (панель) должен иметь свойство Align = alRight.
    Компонент ComboBox1 будем использовать для изменения размера шрифта в редакторе. У компонента ComboBox1 в поле свойств text следует ввести 10. В поле Items следует нажать маленькую кнопку и в появившемся текстовом редакторе ввести строки:


    Для создания списка тэгов HTML следует в блокноте создать файл примерно такого содержания:



    Файл следует сохранить в папке с проектом, с именем, например tag.txt.
    Компоненту Memo1 следует присвоить значение Align = alClient.
    Создадим событие для формы onCreate и загрузим в ListBox1 файл со списком тегов:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Memo1.clear;
        ListBox1.Items.LoadFromFile('tag.txt');
    end;

    Если всё сделано правильно, то при запуске проекта мы увидим такую картинку:


    Для вставки тэгов в блокнот Memo1 создадим событие onDblClick для компонента ListBox1:
    procedure TForm1.ListBox1DblClick(Sender: TObject);
    begin
        Memo1.Lines.Add(ListBox1.Items[ListBox1.ItemIndex]);
    end;
    Здесь, запись Memo1.Lines.Add означает - добавить строку в блокнот Memo1.
    ListBox1.Items - строка из списка с номером [ListBox1.ItemIndex]. ItemIndex - номер выделенной строки в списке. Так как ListBox1.Items является массивом строк, то обращение к строке осуществляется как к элементу массива, по его номеру.
    Запустим проект на исполнение и попробуем написать HTML страничку, вставляя тэги двойным щелчком в ListBox1.



      Следующим компонентом для исследования будет ComboBox1. На закладке Events инспектора объектов следует создать (двойным щелчком) событие onChange (изменение содержимого редактора ComboBox1), и напишем следующие строки:
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
      n: integer;
    // число - размер шрифта пользователя.
    begin
      if ComboBox1.Text = '' then exit;
    // Если в редакторе нет данных то выход
      try // Включаем режим отслеживания ошибок преобразования строки в число
      n:= StrToInt(ComboBox1.Text); //Преобразуем строку в числовое значение
      except // Если возникла ошибка преобразования, то выдаём сообщение
      on Exception : EConvertError do
      ShowMessage(Exception.Message);
    end;
    memo1.Font.Size:= n;
    // Присваиваем шрифту Memo1 новое значение
    end;
    Запускаем программу и убеждаемся, что всё работает нормально.



    Как открывать или сохранять тексты в редакторе Memo1, мы изучили на прошлом уроке. Добавив соответствующие кнопки, получим полноценный HTML редактор.



    Манипуляции со строками объектов ComboBox и ListBox.

    Для доступа к содержимому списков существует несколько функций, которые можно использовать во время выполнения программы:
    ItemIndex - возвращает номер выделенной строки в списке (счёт строк начинается с 0);
    Count - возвращает число строк в списке;
    Items[n] - возвращает или записывает строку с номером n;
    Items.add(строка) - добавляет строку в конец списка;
    Items.delete(n) - удаляет строку с номером n из списка;
    Items.Insert(i, 'Новая cтрока') - вставляет новую строку перед строкой с номером i.
    Для проверки перечисленных действий добавим в нашу программу текстовый редактор Edit1 и четыре кнопки, которые будут добавлять, заменять, удалять и вставлять текст в список тэгов:


    Кнопка Добавить - button1;
    Кнопка Заменить - button2;
    Кнопка Удалить - button3;
    Кнопка Вставить - button4;


    procedure TForm1.Button1Click(Sender: TObject);
    begin
      if MessageDlg('Добавить запись?', mtInformation, [mbOk,mbCancel],0) = mrOK
      then
      begin
        ListBox1.Items.Add(edit1.text);
        ListBox1.Items.SaveToFile('tag.txt');
      end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);
    begin
      if MessageDlg('Заменить запись?', mtInformation, [mbOk,mbCancel],0) = mrOK
      then
      begin
        ListBox1.Items[ListBox1.ItemIndex]:= edit1.Text;
        ListBox1.Items.SaveToFile('tag.txt');
      end;
    end;

    procedure TForm1.Button3Click(Sender: TObject);
    begin
      if MessageDlg('Удалить запись?', mtInformation, [mbOk,mbCancel],0) = mrOK
      then
      begin
        ListBox1.Items.delete(ListBox1.ItemIndex);
        ListBox1.Items.SaveToFile('tag.txt');
      end;
    end;

    procedure TForm1.Button4Click(Sender: TObject);
    begin
      if MessageDlg('Вставить запись?', mtInformation, [mbOk,mbCancel],0) = mrOK
      then
      begin
        ListBox1.Items.Insert(ListBox1.ItemIndex, Edit1.text);
        ListBox1.Items.SaveToFile('tag.txt');
      end;
    end;


    Таблица строк

    На закладке Additional находится компонент StringGrid - таблица, в ячейках которой можно отображать строковые данные. Число строк и столбцов в таблице можно задавать свойствами RowCount и ColCount соответственно.
    FixedCols и FixedRows задают число фиксированных ячеек предназначенных для отображения заголовков колонок и строк. Доступ к содержимому ячеек осуществляется функцией Cells[ACol, ARow: Integer]: string, где ACol и ARow - номер колонки и номер строки соответственно.
    Для включения возможности изменения размеров ячеек в процессе работы программы свойства Options\goRowSizing и Options\goColSizing следует установить в true.
    Создадим таблицу 6x6 ячеек с заголовками, как это принято в Microsoft Excel.


    Метка Label1 будет показывать координаты ячейки выбранной пользователем.
    Создание заголовков ячеек поместим в событие создания формы OnCreate:
    procedure TForm1.FormCreate(Sender: TObject);
    var n: integer;
    begin
    for n:= 1 to 6 do StringGrid1.Cells[0,n]:= IntToStr(n);
    for n:= 1 to 6 do StringGrid1.Cells[n,0]:= chr(n+64);
    label1.Caption :='';
    end;


    Фиксированные ячейки имеют индекс [0,0].
    Ввод данных в ячейки можно осуществлять например, из строчного редактора Edit. Рассмотрим, как это можно осуществить. Поставим на форму редактор Edit1 и кнопку ввода (Button1).

    Создадим событие onClick для кнопки Button1:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       StringGrid1.Cells[StringGrid1.Col,StringGrid1.Row]:= edit1.Text;
    end;
    Для ввода данных следует выделить ячейку, ввести данные в Edit1 и нажать кнопку Ввод.



    В таблицах StringGrid удобно исследовать числовые матрицы. Для ввода числовых данных в строковые ячейки будем пользоваться функциями преобразования:
    FloatToStr(x: real) - преобразует число в строку.
    StrToFloat(s: string) - преобразует строку в число.
    Используя генератор случайных чисел, создадим матрицу, например 3 х 3 элемента и подсчитаем сумму главной диагонали матрицы. Результат поместим в правый нижний угол матрицы (ячейка 4,4).
    Матрицу будем загружать при нажатии кнопки "New" (Button2). Создадим событие onClick на кнопку Button2:
    procedure TForm1.Button2Click(Sender: TObject);
    var
      x,y: integer;
      z: real;
    begin
      randomize;
      for x:= 1 to 3 do
      begin
        for y:= 1 to 3 do
        begin
          StringGrid1.Cells[x,y]:= FloatToStr(random(200)*0.1);
        end;
        end;
      z:= 0;
      for x:= 1 to 3 do z:= z + StrToFloat(StringGrid1.Cells[x,x]);
      StringGrid1.Cells[4,4]:= 'Сумма = ' + FloatToStr(z);
    end;



    При каждом нажатии на кнопку New, матрица будет заполняться произвольными числами и сумма главной диагонали матрицы выводиться в ячейку 4,4.


       ©Гуков Константин Михайлович 2006 - 2011     Почта: [email protected]