Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизПрограмное нажатие на Button 1 при изменении буфера обмена Найти похожие ветки
← →
Andvitar © (2012-07-20 11:46) [0]При каждом новом копировании строки URL с текстом (CTR+C) в буфер обмена попадает новый текст.
Надо сделать чтобы при каждом новом копировании строки URL на Button1 передавалось сообщение об изменении буфера обмена и при этом нажималась Button1.
Читал что есть процедура ClipboardChanged , которая передаёт сообщение об изменении буфера обмена.
Не знаю какой правильный код для этой операции задействовать.
Что то вроде этого надо:
uses
Clipbrd
procedure TForm1.ClipboardChanged;
begin
if ClipboardChanged then Button1.Click;
end;
Подскажите пожалуста как это правильно реализовать.
← →
Andvitar © (2012-07-20 12:02) [1]procedure TForm1.WM_DrawClipboard(var Msg: TW DrawClipboard);
begin
if WM_DrawClipboard then Button1.Click;
end;
или что - то в этом роде.
Ищу правильное решение.
← →
KilkennyCat © (2012-07-21 10:57) [2]http://www.swissdelphicenter.ch/torry/showcode.php?id=1888
← →
Andvitar © (2012-07-22 02:20) [3]Спасибо за подсказку. Попробовал метод 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.
← →
Andvitar © (2012-07-22 02:34) [4]можно конечно скачать одну из утилит отсюда
http://www.obnovi-soft.ru/clipboard-tools
но хотелось бы всё таки разобраться в этих кодах.
← →
Юрий Зотов © (2012-07-22 11:51) [5]
> Andvitar © (22.07.12 02:34) [4]
> хотелось бы всё таки разобраться в этих кодах.
Дык... в чем же дело? Спрашивайте.
← →
Andvitar © (2012-07-22 13:45) [6]Почему останавливается программа (код приведён выше) в этом месте:
procedure OnDrawClipboard(var msg: TWNDrawClipboard); ?
← →
Юрий Зотов © (2012-07-22 14:01) [7]> Andvitar © (22.07.12 13:45) [6]
Программа не останавливается. Она еще только компилируется и еще не запустилась - а как можно остановить то, что еще не запустилось?
Останавливается компилятор, потому что он нашел ошибку. Нет такого сообщения TWNDrawClipboard, есть TWMDrawClipboard. И компилятор об этом сообщил в окошке внизу - а Вы это сообщение должны были прочитать и понять, что слово TWNDrawClipboard компилятору незнакомо.
← →
Andvitar © (2012-07-22 14:23) [8]Спасибо за разьяснение. Уже исправил несколько ошибок.
Осталось в конце. Компилятор останавливается на коде:
procedure TForm1.FormDestroy(Sender: TObject);
и пишет Undeclared indentifier: "FormDestroy"
то есть незадекларирован этот идентификатор (я так понял)
А как и где его задекларировать ?
← →
Andvitar © (2012-07-22 14:38) [9]Исправил. Программа запустилась с таким кодом:
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) [10]> Andvitar © (22.07.12 14:23) [8]
Обработчики событий объявляются в разделе published.
Селайте даблклик в Инспекторе Объектов на событии OnDestroy.
← →
Юрий Зотов © (2012-07-22 14:55) [11]Все копируется. Вы обработчики событий OnCreate и OnDestroy назначили?
← →
Юрий Зотов © (2012-07-22 15:02) [12]И еще - обработчики сообщений не возвращают результат хотя должны.
Исправьте:
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;
← →
Andvitar © (2012-07-22 15:04) [13]Даблклик сделал. в Events напротив OnDestroy появилось FormDestroy.
С первым пунктом не совсем понятно.
Где находится раздел published? Может это раздел:
public
{ Public declarations } ?
И если это тот раздел то какие обработчики событий в него ставить ?
Пробовал ставить в public
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Компилятор останавливается и выдаёт сразу 5 ошибок.
Подскажите пожалуста где этот раздел и какие обработчики событий туда ставить чтоб в Memo1 появился текст из буфера обмена ?
← →
Andvitar © (2012-07-22 15:06) [14]Да OnCreate назначил. копирование пошло.
← →
Юрий Зотов © (2012-07-22 15:10) [15]Хотя раздел published в формах явно не объявлен, находится он сразу под строкой TForm1 = class(TForm). В этом разделе должны быть объявлены 2 обработчика событий. В инспекторе объектов эти же обработчики надо назначить на сами события.
← →
Andvitar © (2012-07-22 15:14) [16]Спасибо большое. Исправил всё как вы писали [12]. Всё заработало. Ура!
← →
Andvitar © (2012-07-22 15:20) [17]ответ на [15]
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
Так правильно? Всё работает. Спасибо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.108 c