Советы по Delphi. Версия 1.0.6

Озеров Валентин

Операционная система

 

 

Буфер обмена

 

Просмотр буфера обмена

Пример на основе простого модуля-класса, осуществляющего просмотр буфера обмена.

unit ClipboardViewer;

interface

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type TForm1 = class(tform)

 procedure FormCreate(Sender: TObject);

 procedure FormDestroy(Sender: TObject);

private

 FNextViewerHandle : THandle;

 procedure WMDrawClipboard(var message: TMessage); message WM_DRAWCLIPBOARD;

 procedure WMChangeCBCHain(var message: TMessage); message WM_CHANGECBCHAIN;

public

end;

var Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);

begin

 // Проверяем работоспособность функции.

 // При невозможности просмотра буфера обмена

 // функция возвратит значение Nil.

 FNextViewerHandle:= SetClipboardViewer(Handle);

end;

procedure TForm1.FormDestroy(Sender: TObject);

begin

 // Восстанавливаем цепочки.

 ChangeClipboardChain(Handle, FNextViewerHandle);

end;

procedure TForm1.WMDrawClipboard(var message: TMessage);

begin

 // Вызывается при любом изменении содержимого буфера обмена

 message.Result := SendMessage(WM_DRAWCLIPBOARD, FNextViewerHandle, 0, 0);

end;

procedure TForm1.WMChangeCBCHain(var message: TMessage);

begin

 // Вызывается при любом изменении цепочек буфера обмена.

 if message.wParam = FNextViewerHandle then begin

  // Удаляем следующую цепочку просмотра. Корректируем внутреннюю переменную.

  FNextViewerHandle:= message.lParam;

  // Возвращаем 0 чтобы указать, что сообщение было обработано

  message.Result:= 0;

 end else begin

  // Передаем сообщение следующему окну в цепочке.

  message.Result:= SendMessage(FNextViewerHandle, WM_CHANGECBCHAIN, message.wParam, message.lParam);

 end;

end;

end.

 

Копирование в буфер обмена

Две вспомогательных процедуры:

procedure CopyButtonClick(Sender: TObject);

begin

 If ActiveControl is TMemo then TMemo(ActiveControl).CopyToClipboard;

 If ActiveControl is TDBMemo then TDBMemo(ActiveControl).CopyToClipboard;

 If ActiveControl is TEdit then TEdit(ActiveControl).CopyToClipboard;

 If ActiveControl is TDBedit then TDBedit(ActiveControl).CopyToClipboard;

end;

procedure PasteButtonClick(Sender: TObject);

begin

 If ActiveControl is TMemo then TMemo(ActiveControl).PasteFromClipboard;

 If ActiveControl is TDBMemo then TDBMemo(ActiveControl).PasteFromClipboard;

 If ActiveControl is TEdit then TEdit(ActiveControl).PasteFromClipboard;

 If ActiveControl is TDBedit then TDBedit(ActiveControl).PasteFromClipboard;

end;

 

Форма как графический объект

Каким образом можно скопировать форму в буфер обмена в виде графического изображения?

uses clipbrd;

procedure TShowVRML.Kopieren1Click(Sender: TObject);

var bitmap:tbitmap;

begin

 bitmap:=tbitmap.create;

 bitmap.width:=clientwidth;

 bitmap.height:=clientheight;

 try

  with bitmap.Canvas do CopyRect (clientrect,canvas,clientrect);

  clipboard.assign(bitmap);

 finally

  bitmap.free;

 end;

end;