Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Програмное нажатие на 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;

или что - то в этом роде.
Ищу правильное решение.


Наверх

Титульная страница Поиск, карта сайта Написать письмо