Иногда бывает не удобно пользоваться простым буфером, так как иногда нам удобнее сначала скопировать сразу несколько фраз, но постоянно переключаться между окнами проблемно и не удобно. По этому я и решил создать программу, которая будет сохранять буфер обмена и давать нам доступ к предыдущим.
Нам нужны такие компоненты:
TListBox,
TTrayIcon,
TTimer.
Свойство формы FormStyle я поставил fsStayOnTop. Это на ваш вкус.
Приложение у меня получилось таким:
Нам нужны такие компоненты:
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;
Вот и все. По-моему, очень удобная программа. Свои предложения/ дополнения/ замечания высказывайте в комментариях.

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