![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Програмное нажатие на Button 1 при изменении буфера обмена
Andvitar © (2012-07-20 11:46:00)При каждом новом копировании строки URL с текстом (CTR+C) в буфер обмена попадает новый текст.
Надо сделать чтобы при каждом новом копировании строки URL на Button1 передавалось сообщение об изменении буфера обмена и при этом нажималась Button1.
Читал что есть процедура ClipboardChanged , которая передаёт сообщение об изменении буфера обмена.
Не знаю какой правильный код для этой операции задействовать.
Что то вроде этого надо:
uses
Clipbrd
procedure TForm1.ClipboardChanged;
begin
if ClipboardChanged then Button1.Click;
end;
Подскажите пожалуста как это правильно реализовать.
Andvitar (2012-07-22 15:20:00) [1]ответ на [15]
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Так правильно? Всё работает. Спасибо.
Andvitar (2012-07-22 15:14:00) [2]Спасибо большое. Исправил всё как вы писали [12]. Всё заработало. Ура!
Юрий Зотов (2012-07-22 15:10:00) [3]Хотя раздел published в формах явно не объявлен, находится он сразу под строкой TForm1 = class(TForm). В этом разделе должны быть объявлены 2 обработчика событий. В инспекторе объектов эти же обработчики надо назначить на сами события.
Andvitar (2012-07-22 15:06:00) [4]Да OnCreate назначил. копирование пошло.
Andvitar (2012-07-22 15:04:00) [5]Даблклик сделал. в Events напротив OnDestroy появилось FormDestroy.
С первым пунктом не совсем понятно.
Где находится раздел published? Может это раздел:
public
{ Public declarations } ?
И если это тот раздел то какие обработчики событий в него ставить ?
Пробовал ставить в public
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Компилятор останавливается и выдаёт сразу 5 ошибок.
Подскажите пожалуста где этот раздел и какие обработчики событий туда ставить чтоб в Memo1 появился текст из буфера обмена ?
Юрий Зотов (2012-07-22 15:02:00) [6]И еще - обработчики сообщений не возвращают результат хотя должны.
Исправьте:
procedure TForm1.OnDrawClipboard(var msg: TWMDrawClipboard);
begin
if Clipboard.HasFormat(CF_TEXT) then
Memo1.Lines.Add(Clipboard.AsText);
inherited
end;
procedure TForm1.OnChangeCBChain(var msg: TWMChangeCBChain);
begin
if msg.Remove = HandleNext then
HandleNext := msg.Next;
inherited
end;
Юрий Зотов (2012-07-22 14:55:00) [7]Все копируется. Вы обработчики событий OnCreate и OnDestroy назначили?
Andvitar (2012-07-22 14:38:00) [8]Исправил. Программа запустилась с таким кодом:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Clipbrd;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
HandleNext: HWND;
procedure OnDrawClipboard(var msg: TWMDrawClipboard);
message WM_DRAWCLIPBOARD;
procedure OnChangeCBChain(var msg: TWMChangeCBChain);
message WM_CHANGECBCHAIN;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
HandleNext:= SetClipboardViewer(Handle);
end;
procedure TForm1.OnDrawClipboard(var msg: TWMDrawClipboard);
begin
if Clipboard.HasFormat(CF_TEXT) then
Memo1.Lines.Add(Clipboard.AsText);
SendMessage(HandleNext, WM_DRAWCLIPBOARD, 0, 0);
end;
procedure TForm1.OnChangeCBChain(var msg: TWMChangeCBChain);
begin
if msg.Remove = HandleNext then
HandleNext :=msg.Next
else
SendMessage(HandleNext, WM_CHANGECBCHAIN, msg.Remove, msg.Next);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain (Handle, HandleNext);
end;
end.
Но почему то не копируется ничего в Memo1
В чём тут может быть проблема ?
Юрий Зотов (2012-07-22 14:38:00) [9]> Andvitar © (22.07.12 14:23) [8]
Обработчики событий объявляются в разделе published.
Селайте даблклик в Инспекторе Объектов на событии OnDestroy.
Andvitar (2012-07-22 14:23:00) [10]Спасибо за разьяснение. Уже исправил несколько ошибок.
Осталось в конце. Компилятор останавливается на коде:
procedure TForm1.FormDestroy(Sender: TObject);
и пишет Undeclared indentifier: 'FormDestroy'
то есть незадекларирован этот идентификатор (я так понял)
А как и где его задекларировать ?
Юрий Зотов (2012-07-22 14:01:00) [11]> Andvitar © (22.07.12 13:45) [6]
Программа не останавливается. Она еще только компилируется и еще не запустилась - а как можно остановить то, что еще не запустилось?
Останавливается компилятор, потому что он нашел ошибку. Нет такого сообщения TW NDrawClipboard, есть TW MDrawClipboard. И компилятор об этом сообщил в окошке внизу - а Вы это сообщение должны были прочитать и понять, что слово TWNDrawClipboard компилятору незнакомо.
Andvitar (2012-07-22 13:45:00) [12]Почему останавливается программа (код приведён выше) в этом месте:
procedure OnDrawClipboard(var msg: TWNDrawClipboard); ?
Юрий Зотов (2012-07-22 11:51:00) [13]
> Andvitar © (22.07.12 02:34) [4]
> хотелось бы всё таки разобраться в этих кодах.
Дык... в чем же дело? Спрашивайте.
Andvitar (2012-07-22 02:34:00) [14]можно конечно скачать одну из утилит отсюда
http://www.obnovi-soft.ru/clipboard-tools
но хотелось бы всё таки разобраться в этих кодах.
Andvitar (2012-07-22 02:20:00) [15]Спасибо за подсказку. Попробовал метод http://www.swissdelphicenter.ch/torry/showcode.php?id=1888
Код вроде работает (нажимаю на Вutton 1 и 2 и ни чего видимого не происходит), но там нет окна Memo1 куда бы выводился текст с буфера обмена.
Поэтому отсюда http://www.softengines.ru/showthread.php?t=6840
использовал код приведённый ниже. Там есть уже Memo1.
Но при запуске кода выделяется красным строка
procedure OnDrawClipboard(var msg: TWNDrawClipboard)
и дальше не идёт программа. Кажется в коде чего то не хватает, или что то не так написано раз прога останавливается. А что именно - вот не знаю.
Может подскажите. Что в коде не так ?
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Clipbrd;
type
TForm1 = class(TForm)
Memo1: TMemo;
private
HandleNext: HWND;
procedure OnDrawClipboard(var msg: TWNDrawClipboard);
message WM_DRAWCLIPBOARD;
procedure OnChangeCBChain(var msg: TWNChangeCBChain);
message WM_CHANGECBCHAIN;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FofmCreate (Sender: TObject);
begin
HandleNext:= SetClipboardvViewer(Handle);
end;
procedure TForm1.OnDrawClipboard(var msg: TWMDrawClipboard);
begin
if Clipboard.HasFormat(CF_TEXT) then
Memo1.Lines.Add(Clipboard.AsText);
SendMessage(HandleNext, WM_DRAWCLIPBOARD, 0, 0);
end;
procedure TForm1.OnChangeCBChain(var msg: TWMChangeCBChain);
begin
if msg.Remove = HandleNext then
HandleNext :=msg.Next
else
SendMessage(HandleNext, WM_CHANGECBCHAIN, msg.Remove, msg.Next);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
ChangeClipboardChain (Handle, HandleNext);
end;
end.
KilkennyCat (2012-07-21 10:57:00) [16]http://www.swissdelphicenter.ch/torry/showcode.php?id=1888
Andvitar (2012-07-20 12:02:00) [17]procedure TForm1.WM_DrawClipboard(var Msg: TW DrawClipboard);
begin
if WM_DrawClipboard then Button1.Click;
end;
или что - то в этом роде.
Ищу правильное решение.