Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
ВнизСоздание компонента просмотра буфера обмена Найти похожие ветки
← →
Davinchi © (2004-09-08 21:01) [0]Компонент работает только при явном уразании Handle окна. Если Handle передать через переменную, то компонент не работает - В ЧЕМ ПРИЧИНА???
Вот реальный отрывок моего кода. Для проверки необходимо кинуть на форму TMemo. При копировании из мемо появляется сообщение содержащее скопированный текст - при явном описании Handle, если закоментарить эту строку и открыть строку выше - то не работает - ???
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Clipbrd,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TVcotClip = class(TCustomControl)
private
{ Private declarations }
FViewerHandle: HWnd;
FNextViewerHandle: HWnd;
protected
{ Protected declarations }
procedure SetViewerHandle(Value: HWnd);
public
{ Public declarations }
destructor Destroy; override;
procedure WMDrawClipboard(var message : TMessage); message WM_DRAWCLIPBOARD;
procedure WMChangeCBCHain(var message : TMessage); message WM_CHANGECBCHAIN;
property ViewerHandle: HWnd read FViewerHandle write SetViewerHandle;
end;
var
Form1: TForm1;
VcotClip: TVcotClip;
implementation
{$R *.dfm}
destructor TVcotClip.Destroy;
begin
inherited Destroy;
ChangeClipboardChain(FViewerHandle, FNextViewerHandle);
end;
procedure TVcotClip.SetViewerHandle(Value: HWnd);
begin
FViewerHandle := Value;
FNextViewerHandle := SetClipboardViewer(FViewerHandle); // ??? так не работает :-(
// FNextViewerHandle := SetClipboardViewer(Handle); // так работает :-)
end;
procedure TVcotClip.WMDrawClipboard(var message : TMessage);
begin
message.Result:=SendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0);
if Clipboard.AsText<>"" then
begin
ShowMessage("Буфер обмена изменился на:"+#$D#$A+Clipboard.AsText);
end;
end;
procedure TVcotClip.WMChangeCBCHain(var message : TMessage);
begin
if message.wParam = FNextViewerHandle then
begin
FNextViewerHandle := message.lParam;
message.Result := 0;
end
else
message.Result := SendMessage(FNextViewerHandle, WM_CHANGECBCHAIN, message.wParam, message.lParam);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
VcotClip := TVcotClip.Create(Form1);
VcotClip.Parent := Form1;
VcotClip.Visible:=True;
VcotClip.SetViewerHandle(Handle);
// забиваем мемо любым текстом, что было над чем эксперементировать с копированием
Memo1.Lines.LoadFromFile("C:\Windows\System.ini");
end;
end.
← →
Slym (2004-09-09 05:45) [1]FViewerHandle:=AllocateHwnd
← →
Davinchi © (2004-09-11 17:17) [2]AllocateHwnd - это вариант, но этот компонент находится в ДЛЛ, которую загружает приложение изменяющее буфер обмена.
AllocateHwnd необходимо передать WndProc, а его я немогу (или не знаю как) получить от того приложения, которое загружает ДЛЛ.
← →
Slym (2004-09-17 09:08) [3]library Project2;
uses
SysUtils,Windows, Messages,Classes;
type
TChangeNotifier=procedure;stdcall;
TVcotClip = class
private
FViewerHandle: HWnd;
FNextViewerHandle: HWnd;
FChangeNotifier:TChangeNotifier;
protected
procedure MsgHandler(var Message: TMessage);
public
constructor Create(ChangeNotifier:TChangeNotifier);
destructor Destroy; override;
end;
{ TVcotClip }
constructor TVcotClip.Create(ChangeNotifier: TChangeNotifier);
begin
FViewerHandle:=AllocateHwnd(MsgHandler);
FNextViewerHandle:=SetClipboardViewer(FViewerHandle);
if FNextViewerHandle=0 then
RaiseLastOSError;
end;
destructor TVcotClip.Destroy;
begin
ChangeClipboardChain(FViewerHandle, FNextViewerHandle);
DeallocateHWnd(FViewerHandle);
inherited;
end;
procedure TVcotClip.MsgHandler(var Message: TMessage);
begin
if Message.Msg=WM_DRAWCLIPBOARD then
begin
SendMessage(Message.Msg, FNextViewerHandle,Message.WParam,Message.LParam);
if assigned(FChangeNotifier) then
FChangeNotifier;
end;
if Message.Msg=WM_CHANGECBCHAIN then
begin
if Message.WParam = FNextViewerHandle then
FNextViewerHandle := Message.LParam
else
SendMessage(FNextViewerHandle, Message.Msg, Message.WParam, Message.LParam);
end;
end;
function SetClipboardHandler(ChangeNotifier: TChangeNotifier):THandle;stdcall;
begin
result:=THandle(TVcotClip.Create(ChangeNotifier));
end;
function RemoveClipboardHandler(ClipboardHandler: THandle):LongBool;stdcall;
begin
result:=false;
if ClipboardHandler<>0 then
begin
TObject(ClipboardHandler).Free;
result:=true;
end;
end;
exports SetClipboardHandler,RemoveClipboardHandler;
begin
end.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.03;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.054 c