unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, StdCtrls, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    Panel1: TPanel;
    Label1: TLabel;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Label2: TLabel;
    Label3: TLabel;
    ComboBox1: TComboBox;
    Label4: TLabel;
    Label5: TLabel;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    RadioGroup1: TRadioGroup;
    GroupBox1: TGroupBox;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    CheckBox1: TCheckBox;
    Edit2: TEdit;
    BitBtn3: TBitBtn;
    RichEdit1: TRichEdit;
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BitBtn2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  ComboBox1.ItemIndex:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Edit1.Text:='';
 Edit2.Text:='';
 ComboBox1.ItemIndex:=0;
 ListBox1.Items.Clear;
 ListBox2.Items.Clear;
 RichEdit1.Clear;
 CheckBox1.Checked:=false;
 RadioGroup1.ItemIndex:=0;
 BitBtn2.Enabled:=false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  with ListBox1 do
  Case ComboBox1.ItemIndex of
   0 : begin  // в начало списка
        Items.Insert(0,Edit1.Text);
        end;
   1 : begin  // в конец списка
        Items.Add(Edit1.Text);
       end;
   2 : begin // перед текущей	 строкой
        if ItemIndex<0 then ItemIndex:=0; // Если никакая строка не выделена
        Items.Insert(ItemIndex,Edit1.Text);
       end;
   3 : begin // после текущей строки
        if ItemIndex<0 then ItemIndex:=0; // Если никакая строка не выделена
        Items.Insert(ItemIndex+1,Edit1.Text);
       end;
   end;

end;

procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
 if ListBox1.Items.Count=0 then begin // Список 1 пуст
  ShowMessage('Список 1 пуст!');
  exit;
 end;
 if ListBox1.ItemIndex<0 then begin  // В Списке 1 нет выбранной строки
  ShowMessage('Выберите строку в Списке 1');
  exit;
 end;
// Добавление строки из Списка 1 в конец Списка 2
 ListBox2.Items.Add(ListBox1.Items[ListBox1.itemIndex]);
 ListBox2.ItemIndex:=ListBox2.items.Count-1; // Текущей становится вставленная строка

 // Запоминаем и изменяем позицию текущей строки в Списке 1, т.к. скопированная строка
// будет удалена
 i:=ListBox1.ItemIndex;
 if i=(ListBox1.Items.Count-1) then  // Если скопирована последняя строка
   ListBox1.ItemIndex:=i-1
  else  ListBox1.ItemIndex:=i+1;
 ListBox1.Items.Delete(i); // Удаление скопированной строки из Списка 1

end;

procedure TForm1.Button5Click(Sender: TObject);
   var i:integer;
begin
 if ListBox2.Items.Count=0 then begin // Список 2 пуст
  ShowMessage('Список 2 пуст!');
  exit;
 end;
 if ListBox2.ItemIndex<0 then begin  // В Списке 2 нет выбранной строки
  ShowMessage('Выберите строку в Списке 2');
  exit;
 end;
// Добавление строки из Списка 2 в конец Списка 1
 ListBox1.Items.Add(ListBox2.Items[ListBox2.itemIndex]);
 ListBox1.ItemIndex:=ListBox1.items.Count-1; // Текущей становится вставленная строка

 // Запоминаем и изменяем позицию текущей строки в Списке 1, т.к. скопированная строка
// будет удалена
 i:=ListBox2.ItemIndex;
 if i=(ListBox2.Items.Count-1) then  // Если скопирована последняя строка
   ListBox2.ItemIndex:=i-1
  else  ListBox2.ItemIndex:=i+1;
 ListBox2.Items.Delete(i); // Удаление скопированной строки из Списка 1

end;

procedure TForm1.Button4Click(Sender: TObject);
var i:integer;
begin
  for i:=1 to ListBox1.Items.Count do begin
    if ListBox1.Items.Count=0 then begin // Список 1 пуст
    ShowMessage('Список 1 пуст!');
    exit;
 end;
  ListBox2.Items.Add(ListBox1.Items[0]);
  ListBox2.ItemIndex:=ListBox2.items.Count-1;
  if ListBox1.Items.Count=1 then
    ListBox1.Itemindex:=-1
  else ListBox1.Itemindex:=1;
  ListBox1.Items.Delete(0);
  end;
end;

procedure TForm1.Button6Click(Sender: TObject);
  var i:integer;
begin
  for i:=1 to ListBox2.Items.Count do begin
    if ListBox2.Items.Count=0 then begin // Список 2 пуст
    ShowMessage('Список 2 пуст!');
    exit;
 end;
  ListBox1.Items.Add(ListBox2.Items[0]);
  ListBox1.ItemIndex:=ListBox1.items.Count-1;
  if ListBox2.Items.Count=1 then
    ListBox2.Itemindex:=-1
  else ListBox2.Itemindex:=1;
  ListBox2.Items.Delete(0);
  end;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
  case RadioGroup1.ItemIndex of
   0 : RichEdit1.Text:=AnsiLowerCase(RichEdit1.Text);
   1 : RichEdit1.Text:=AnsiUpperCase(RichEdit1.Text);
  end;

end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var startpos,toend,foundat:integer;
begin
  with RichEdit1 do
  begin
    { Поиск начинается с текущей позиции курсора в тексте.
      Если курсора нет , то с перовй позиции }
    if SelLength > 0 then begin   // Длина выделенного фрагмента текста
      StartPos := SelStart;
      ToEnd := SelLength;
    end
    else begin
      StartPos := 0;
      ToEnd := Length(Text);
    end;
    { SelStart - начало выделенного фрагмента в тексте
      StartPos - позиция, с которой начинается поиск
      ToEnd - количество символов, которые необходимо просмотреть}


    if CheckBox1.Checked then  // с учетом регистра символов
     FoundAt := FindText(Edit2.Text, StartPos, ToEnd, [stMatchCase])  // метод поиска строки
    else
     FoundAt := FindText(Edit2.Text, StartPos, ToEnd, []);
     // FoundAt - позиция начала найденной строки в тексте
    if FoundAt <> -1 then
    begin
      // Выделение в тексте найденного фрагмента
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(Edit2.Text);
      // Активизация/деактивизация кнопок поиска
      BitBtn1.Enabled:=false;
      BitBtn2.Enabled:=true;
    end
    else begin
      ShowMessage('Строка не найдена. Задайте начальную позицию и повторите поиск.');
      // Активизация/деактивизация кнопок поиска
      BitBtn1.Enabled:=true;
      BitBtn2.Enabled:=false;
      SelLength := 0;
    end;
  end;

end;

procedure TForm1.Edit2Change(Sender: TObject);
begin
  BitBtn1.Enabled:=true;
  BitBtn2.Enabled:=false;
end;

procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  BitBtn1.Enabled:=true;
  BitBtn2.Enabled:=false;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var startpos,toend,foundat:integer;
begin
  with RichEdit1 do
  begin
    { Поиск начинается с текущей позиции курсора в тексте.
      Если курсора нет , то с перовй позиции }
      StartPos := SelStart+SelLength;
      ToEnd := Length(Text)-StartPos;
    { SelStart - начало выделенного фрагмента в тексте
      StartPos - позиция, с которой начинается поиск
      ToEnd - количество символов, которые необходимо просмотреть}


    if CheckBox1.Checked then  // с учетом регистра символов
     FoundAt := FindText(Edit2.Text, StartPos, ToEnd, [stMatchCase])  // метод поиска строки
    else
     FoundAt := FindText(Edit2.Text, StartPos, ToEnd, []);
    if FoundAt <> -1 then
    begin
      SetFocus;
      SelStart := FoundAt;
      SelLength := Length(Edit2.Text);
      BitBtn1.Enabled:=false;
      BitBtn2.Enabled:=true;
    end
    else begin
      ShowMessage('Строка не найдена. Задайте начальную позицию и повторите поиск.');
      BitBtn1.Enabled:=true;
      BitBtn2.Enabled:=false;
      SelLength := 0;
    end;
  end;
end;
end.
