суббота, 28 апреля 2012 г.

Сохранение нескольких текстов в буфер обмена одновременно.

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

Нам нужны такие компоненты:
TListBox,
TTrayIcon,
TTimer.
Свойство формы FormStyle я поставил fsStayOnTop. Это на ваш вкус.
Приложение у меня получилось таким:





Переходим к файлу проекта и пишем там:
Application.Initialize;    //Инициализируем приложение
  Application.CreateForm(TForm3, Form3);  ..Создаем форму
 Application.CreateHandle;   ..
 ShowWindow(Application.Handle, SW_HIDE);  //Скроем окно
   Application.ShowMainForm := FALSE;   //Не показывать главную форму на панели задач
    Application.Run;   //Запустим приложение 
Итак, мы создали и скрыли наше приложение при старте. Если запустим приложение, не увидим формы. Сейчас осуществим возможность открытия окна приложения при клике на иконку в трее. 
У компонента TTrayIcon в событии OnClick:
Application.ShowMainForm := true;   // Показать главное окно
ShowWindow(Handle, SW_SHow);  
visible:=true;
bringtofront;   //Вынести на передний план
Теперь, если мы будем сворачивать приложение, окно свернется в панель задач. По-моему, он будет мешать. Пусть сворачивается и не оставляет значок в панели задач. 
Добавим такую функцию: 
procedure TForm3.WMSysCommand(var Msg: TWMSysCommand);
begin
if Msg.CmdType = SC_MINIMIZE   //Если окно сворачивается
  then
    begin
Application.ShowMainForm := FALSE;
ShowWindow(Application.Handle, SW_HIDE);
visible:=false;
    end
      else
        inherited;
end;  
Теперь окно свободно сворачивается, не оставляя значка в панели задач. Я хочу, чтобы приложение напоминало небольшую тулзу, которая будет появляться в уголке экрана, не мешая остальным окнам. Для этого на событие формы OnShow напишем следующий код:
left:=screen.Width-width;   
top:=screen.WorkAreaHeight-height;   //Высота равна рабочей области окна (без панели задач)
А теперь осталось реализовать сам функционал программы. Пусть таймер считывает состояние     буфера каждые 2 секунды, добавляет значение буфера в глобальную переменную, сравнивает ее с предыдущим значением, добавляет в TListBox. Не будем издеваться над памятью, пусть в ListBox будет не много значений буфера. Добавим Глобальную переменную last типа string. Свойство Interval у таймера ставим 2000, событие OnTimer пишем такое: 
procedure TForm3.Timer1Timer(Sender: TObject);
begin
if Clipboard.HasFormat(CF_text) then    //если в буфере текст
begin
if last=Clipboard.AsTexT then  //если предыдущее значение равно настоящему, то
exit;   // Выйдем
if listbox1.Items.count>5 then  //Если в ListBox значений больше пяти (шесть)? nj
listbox1.Items.Delete(0);   //Удаляем первый элемент, отсчет items начинается с нуля
last:=Clipboard.AsTexT;    //Переменной добавляем значение буфера
listbox1.Items.Add(last);   //Добавляем в ListBox значение 
end;
end;
Вот и все. По-моему, очень удобная программа. Свои предложения/ дополнения/ замечания высказывайте в комментариях. 


Комментариев нет:

Отправить комментарий