Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Програмное нажатие на 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.047 c
2-1340828000
Study.MySQL
2012-06-28 00:13
2013.03.22
Вопрос по DBX+MySql


15-1348061625
xayam
2012-09-19 17:33
2013.03.22
Демонстрационное оборудование


2-1343646644
Pcrepair
2012-07-30 15:10
2013.03.22
Программа начинает есть память


2-1335429750
Daryma
2012-04-26 12:42
2013.03.22
Access & Delphi 7


15-1346013002
Юрий
2012-08-27 00:30
2013.03.22
С днем рождения ! 27 августа 2012 понедельник