Die beiden würd' ich vertauschen:
Statt
Delphi-Quellcode:
RichEdit1.PasteFromClipboard;
RichEdit1.SetFocus;
lieber
Delphi-Quellcode:
RichEdit1.SetFocus;
RichEdit1.PasteFromClipboard;
Beim Einfügen aus der Zwischenablage beept es gerne, wenn die Stelle, die den Inhalt der Zwischenablage bekommen soll, keinen Focus hat.
Ist in RichEdit1 vor dem PasteFromClipboard etwas enthalten?
Ist es leer? Dann füge den Inhalt der Zwischenablage in einer Schleife ein, bis etwas vorhanden ist, sinngemäß sowas:
Delphi-Quellcode:
iError := 0;
RichEdit.SetFocus;
repeat
Sleep(iError * 100); // Eine Pause machen, die bei jedem Versuch etwas größer wird.
iError := iError + 1;
RichEdit1.PasteFromClipboard;
until (RichEdit1.Text <> '') or (iError > 5);
if iError > 5 then begin
// Fehlermeldung machen
end else
if RichEdit1.Text = '' then begin
// andere Fehlermeldung machen
end;
Ein Beep tritt aber auch dann auf, wenn das Format in der Zwischenablage nicht vom RichEdit unterstützt wird. Eventuell vorher das Format prüfen, so in der (ungetesteten) Art:
Delphi-Quellcode:
function RichEditCanPaste: Boolean;
var
RtfFormat: Word;
begin
// Prüfe Plain Text
if Clipboard.HasFormat(CF_TEXT)
or Clipboard.HasFormat(CF_UNICODETEXT)
then
Exit(True);
// Prüfe RTF
RtfFormat := RegisterClipboardFormat('
Rich Text Format');
Result := Clipboard.HasFormat(RtfFormat);
end;
function ClipboardFormatToString(CF: Word):
string;
begin
case CF
of
1: Result := '
CF_TEXT';
2: Result := '
CF_BITMAP';
3: Result := '
CF_METAFILEPICT';
4: Result := '
CF_SYLK';
5: Result := '
CF_DIF';
6: Result := '
CF_TIFF';
7: Result := '
CF_OEMTEXT';
8: Result := '
CF_DIB';
9: Result := '
CF_PALETTE';
10: Result := '
CF_PENDATA';
11: Result := '
CF_RIFF';
12: Result := '
CF_WAVE';
13: Result := '
CF_UNICODETEXT';
14: Result := '
CF_ENHMETAFILE';
15: Result := '
CF_HDROP';
16: Result := '
CF_LOCALE';
// ... ggf. erweitern
else
begin
// Falls kein Standardformat: Versuche, den Namen über API zu holen
SetLength(Result, 255);
if GetClipboardFormatName(CF, PChar(Result), 255) > 0
then
SetLength(Result, StrLen(PChar(Result)))
else
Result := '
Unbekanntes Format (' + IntToStr(CF) + '
)';
end;
end;
end;
var
i : Integer;
cf : Word;
sl : TStringList;
begin
sl := TStringList.Create;
try
try
if RichEditCanPaste
then
RichEdit1.PasteFromClipboard
else begin
sl.Add('
In der Zwischenablage enthaltene Formate:');
sl.Add('
');
for i := 0
to Clipbrd.Clipboard.FormatCount - 1
do begin
cf := Clipbrd.Clipboard.Formats[i];
sl.Add(Format('
%.5d - %s',[cf, ClipboardFormatToString(cf)]));
end;
ShowMessage(sl.Text);
end;
except
on E:
Exception do
begin
OnError(Self, '
PasteFromClipboard', 0, E.
Message);
ShowMessage('
Fehler: '+E.
Message+sLineBreak+'
OS Error: '+IntToStr(GetLastError));
end;
end;
finally
sl.free;
end;
end;