Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.08 c
2-1343940747
MidnightSun
2012-08-03 00:52
2013.03.22
Нуждаюсь в помощи


2-1334343958
vegarulez
2012-04-13 23:05
2013.03.22
[Free CreateOLEObject] Как?


15-1342858667
Inovet
2012-07-21 12:17
2013.03.22
Странная информация о количестве участников


6-1263641367
RokWeb
2010-01-16 14:29
2013.03.22
Отправка пакета по сети(Winsock2).


15-1352799802
Handler
2012-11-13 13:43
2013.03.22
названия пунктов меню





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский