Totusi, am vazut programe care creaza un fel de "history" pe elementele copiate in clipboard si permit folosirea oricarui element dintr-o lista de maxim 5-10-20 de elemente. Cum se pot face asemenea programe ? E clar ca nu poti verifica o data la 200 ms si sa iti salvezi un nou element cu continutul clipboard-ului ... pentru ca, in majoritatea timpului, clipboard-ul va contine acelasi lucru ca si acum 5, 10 minute. OK... poti, verificand daca elementele sunt diferite intre ele ... dar exista o varianta mai buna.
Ce-ar fi sa ne anunte Windows-ul cand continutul clipboard-ului s-a modificat ? In felul asta nu trebuie decat sa folosim noul continut ... in orice fel dorim.
Programul de mai jos exemplifica modalitatea prin care clipboard-ul poate fi "spionat" si afiseaza continutul actual al clipboard-ului - numai daca este text sau imagine. Codul este relativ simplu si poate fi extins (destul de usor) pentru a ajunge la o functionalitate de multi-clipboard - dar nu acesta este scopul acestui post.
Un screenshot al programului - dupa ce am copiat o imagine si o bucatica de text:

Sursa completa si executabilul sunt in atasament.
Codul sursa este urmatorul:
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, ExtCtrls, StdCtrls, Clipbrd;
- type
- TForm1 = class(TForm)
- mmCB: TMemo;
- imgCB: TImage;
- procedure FormDestroy(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- private
- procedure WMDrawClipboard(var Msg: TMessage); message WM_DRAWCLIPBOARD;
- procedure WMChangeCBChain(var Msg: TMessage); message WM_CHANGECBCHAIN;
- public
- function GetClipboardFormat: Integer;
- end;
- var
- Form1: TForm1;
- NextCB: THandle;
- implementation
- {$R *.dfm}
- function IsValidHandle(aHandle: THandle): Boolean;
- begin
- Result := (aHandle <> 0) and (aHandle <> INVALID_HANDLE_VALUE);
- end;
- function TForm1.GetClipboardFormat: Integer;
- begin
- Result := CF_TEXT;
- if Clipboard.HasFormat(CF_BITMAP) then
- Result := CF_BITMAP;
- end;
- procedure TForm1.WMDrawClipboard(var Msg:TMessage);
- begin
- case GetClipboardFormat of
- CF_TEXT:
- begin
- mmCB.Lines.Text := Clipboard.AsText
- end;
- CF_BITMAP:
- begin
- imgCB.Picture.Assign(Clipboard);
- end;
- end;
- if IsValidHandle(NextCB)
- then SendMessage(NextCB, WM_DrawClipboard, 0, 0);
- end;
- procedure TForm1.WMChangeCBChain(var Msg: TMessage);
- var
- CBDelete, CBNext: THandle;
- begin
- CBDelete := Msg.WParam;
- CBNext := Msg.LParam;
- if NextCB = CBDelete
- then NextCB := CBNext
- else
- if IsValidHandle(NextCB)
- then SendMessage(NextCB, WM_ChangeCBChain, CBDelete, CBNext)
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- NextCB := SetClipboardViewer(Self.Handle);
- end;
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- ChangeClipboardChain(Self.Handle, NextCB);
- end;
- end.
Bafta si spor la programat
Welcome to BitCell. Click here to register !