Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi clipboard mit Strg +C (https://www.delphipraxis.net/124542-clipboard-mit-strg-c.html)

wol 20. Nov 2008 22:55


clipboard mit Strg +C
 
Das Prg sollte folgende Funktionallität haben:
Mit STRG+Fn (Z Bsp. in Notepad) wird ein markierter text gespeichert.
Mit Shift+Fn (Z Bsp. in Notepad) wird ein gespeicherter text Kopiert.

Leider gibt es ein Fehler, wenn direkt nach Sh+FN Strg+Fn ausgeführt werden soll. Deshab das Try im Code.
Meldung in IDE:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse Exception aufgetreten. Meldung: 'Zwischenablage kann nicht geöffnet werden'. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
[delphi]
unit Unit1;

interface

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

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure VC(a:char);
procedure Ablage(x:byte);
private
{ Private-Deklarationen }
procedure WmHotkey(var Msg: TMessage); message WM_HOTKEY;

public
{ Public-Deklarationen }
end;
const cl='Clipboard';
var
Form1: TForm1;
s:array[1..12] of string;
implementation
uses clipbrd;
{$R *.dfm}

procedure tform1.VC(a:char); //a=C, Ctrl+C copieren
begin //a=V, Ctrl+V einfügen
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord(a), MapVirtualKey(Ord(a), 0), 0, 0);
keybd_event(Ord(a), MapVirtualKey(Ord(a), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
end;
procedure tform1.Ablage(x:byte);
begin
if x<13 then
begin
VC('C');form1.Caption:=cl;
try
if Clipboard.HasFormat(CF_TEXT) then s[x]:=clipboard.AsText;
except form1.Caption:='Fehler';
end;
end
else
begin
clipboard.AsText:=s[x-12];
VC('V');form1.Caption:=cl;
end;
end;
procedure TForm1.WmHotkey(var Msg: TMessage);
begin
ablage(Msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
var m:byte;
begin
for m:=1 to 12 do
begin
RegisterHotKey(Handle, m, MOD_CONTROL,111+m);
RegisterHotKey(Handle, m+12, MOD_Shift,111+m);
s[m]:='leer';
end;form1.Caption:=cl;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var m:byte;
begin
for m:=1 to 24 do UnregisterHotKey(Handle, m);
end;
end.
[b] wer kann mir helfen?

s.h.a.r.k 20. Nov 2008 23:43

Re: clipboard mit Strg +C
 
hier mal dein code richtig formatiert:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure VC(a:char);
    procedure Ablage(x:byte);
  private
    { Private-Deklarationen }
    procedure WmHotkey(var Msg: TMessage); message WM_HOTKEY;

  public
    { Public-Deklarationen }
  end;
const cl='Clipboard';
var
  Form1: TForm1;
  s:array[1..12] of string;
implementation
uses clipbrd;
{$R *.dfm}

procedure tform1.VC(a:char);     //a=C, Ctrl+C copieren
begin                            //a=V, Ctrl+V einfügen
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
  keybd_event(Ord(a), MapVirtualKey(Ord(a), 0), 0, 0);
  keybd_event(Ord(a), MapVirtualKey(Ord(a), 0), KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
end;
procedure tform1.Ablage(x:byte);
begin
   if x<13 then
   begin
      VC('C');form1.Caption:=cl;
      try
         if Clipboard.HasFormat(CF_TEXT) then s[x]:=clipboard.AsText;
      except form1.Caption:='Fehler';
      end;
   end
   else
   begin
      clipboard.AsText:=s[x-12];
      VC('V');form1.Caption:=cl;
   end;
end;
procedure TForm1.WmHotkey(var Msg: TMessage);
begin
   ablage(Msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
var m:byte;
begin
  for m:=1 to 12 do
  begin
    RegisterHotKey(Handle, m, MOD_CONTROL,111+m);
    RegisterHotKey(Handle, m+12, MOD_Shift,111+m);
    s[m]:='leer';
  end;form1.Caption:=cl;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var m:byte;
begin
 for m:=1 to 24 do UnregisterHotKey(Handle, m);
end;
end.
du musst doch die unit Clipbrd einbinden, sodass zu zugriff auf das zwischenablage hast. dann könnte es wahrscheinlich gehen. evtl. kann es daran liegen, dass noch ein clipboard.open(); fehlt.

wol 21. Nov 2008 00:01

Re: clipboard mit Strg +C
 
Zitat:

Zitat von s.h.a.r.k
hier mal dein code richtig formatiert:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure VC(a:char);
    procedure Ablage(x:byte);
  private
    { Private-Deklarationen }
    procedure WmHotkey(var Msg: TMessage); message WM_HOTKEY;

  public
    { Public-Deklarationen }
  end;
const cl='Clipboard';
var
  Form1: TForm1;
  s:array[1..12] of string;
implementation
uses clipbrd;
{$R *.dfm}

procedure tform1.VC(a:char);     //a=C, Ctrl+C copieren
begin                            //a=V, Ctrl+V einfügen
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
  keybd_event(Ord(a), MapVirtualKey(Ord(a), 0), 0, 0);
  keybd_event(Ord(a), MapVirtualKey(Ord(a), 0), KEYEVENTF_KEYUP, 0);
  keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
end;
procedure tform1.Ablage(x:byte);
begin
   if x<13 then
   begin
      VC('C');form1.Caption:=cl;
      try
         if Clipboard.HasFormat(CF_TEXT) then s[x]:=clipboard.AsText;
      except form1.Caption:='Fehler';
      end;
   end
   else
   begin
      clipboard.AsText:=s[x-12];
      VC('V');form1.Caption:=cl;
   end;
end;
procedure TForm1.WmHotkey(var Msg: TMessage);
begin
   ablage(Msg.WParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
var m:byte;
begin
  for m:=1 to 12 do
  begin
    RegisterHotKey(Handle, m, MOD_CONTROL,111+m);
    RegisterHotKey(Handle, m+12, MOD_Shift,111+m);
    s[m]:='leer';
  end;form1.Caption:=cl;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var m:byte;
begin
 for m:=1 to 24 do UnregisterHotKey(Handle, m);
end;
end.
du musst doch die unit Clipbrd einbinden, sodass zu zugriff auf das zwischenablage hast. dann könnte es wahrscheinlich gehen. evtl. kann es daran liegen, dass noch ein clipboard.open(); fehlt.

Danke für die Formatierung.
Clipbrd ist eingebunden, siehe nach
implementation
?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf