Entwickler-Ecke

Sonstiges (Delphi) - Zwischenablage auslesen


Calyptus - Di 08.03.05 22:41
Titel: Zwischenablage auslesen
Hallo...

Erstmal: ich weiß das es kein guter Titel ist, aber mir ist nix besseres eingefallen.

Wenn in der Zwischenablage Text gespeichert ist, dann soll der in einem RichEdit ausgegeben werden. Aber nur einmal, bis er sich ändert. Aber es kommt bei jedem Timer Durchlauf. Kann mir jemand sagen was ich falsch mache?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Timer1Timer(Sender: TObject);
var oldText: String;
begin
 if Clipboard.HasFormat(CF_Text)  then
  begin
    if not (Clipboard.AsText = oldText) then
     RichEdit1.Lines.Add(Clipboard.AsText);
    oldText := Clipboard.AsText;
  end;
end;


Delete - Di 08.03.05 23:03

Du musst dich in die Clipboard-Kette einklinken:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
program ClipViewer;

{$R resource.res}

uses
  windows, messages;

const
  WM_RESETSELECTION = WM_USER + 1;

var
  hNextViewer: DWORD;

function DlgFunc(hWnd: hWnd; uMsg: dword; wParam: wparam; lParam: lParam):
  bool; stdcall;
var
  hClipbrdObj: THandle;
  pClipbrdObj: Pointer;
  rect: TRect;
begin
  result := true;
  case uMsg of
    WM_INITDIALOG:
    begin
      { Icon dem Fenster zuweisen }
      SendMessage(hWnd, WM_SETICON, ICON_BIG, Integer(LoadIcon(HInstance,
        MAKEINTRESOURCE(1))));
      { Programm in die Clipboardviewer-Kette einklinken }
      hNextViewer := SetClipBoardViewer(hWnd);
    end;
    WM_CHANGECBCHAIN:
    begin
      if wParam = hNextViewer then
        hNextViewer := lParam
      else if hNextViewer <> 0 then
        SendMessage(hNextViewer, uMSG, wParam, lParam);
    end;
    WM_SIZE:
    begin
      { Edit an Fenstergröße anpassen }
      if GetClientRect(hWnd, Rect) then
      SetWindowPos(GetDlgItem(hWnd, 101), 0, Rect.Left, Rect.Top,
        Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, SWP_NOZORDER);
    end;
    WM_DRAWCLIPBOARD:
    begin
      { Clipboard öffnen }
      OpenClipboard(hWnd);
      { Handle auf das Clipboardobjekt holen }
      hClipbrdObj := GetClipboardData(CF_TEXT);
      if hClipbrdObj <> 0 then
      begin
        { Zeiger auf den Speicherblock holen }
        pClipbrdObj := GlobalLock(hClipbrdObj);
        { Clipboardinhalt anzeigen }
        SendMessage(GetDlgItem(hWnd, 101), WM_SETTEXT, 0, Integer(pClipbrdObj));
        PostMessage(hWnd, WM_RESETSELECTION, 00);
      end;
      { und aufräumen }
      GlobalUnlock(DWORD(pClipbrdObj));
      GlobalFree(hClipbrdObj);
      CloseClipBoard;
    end;
    WM_RESETSELECTION: SendMessage(GetDlgItem(hWnd, 101),EM_SETSEL, 00);
    WM_CLOSE:
    begin
      { Programm wieder aus der Clipboardviewer-Kette raus nehmen }
      ChangeClipBoardChain(hWnd, hNextViewer);
      EndDialog(hWnd, 0)
    end;
  else result := false;
  end;
end;

begin
  DialogBoxParam(hInstance, MAKEINTRESOURCE(100), 0, @dlgfunc, 0);
end.

Mal ein kleines Demo Programm von mir.


matze.de - Di 08.03.05 23:04

du musst vorher RichEdit.Clear machen um den Edit zu Clearen.

mfg matze