こんにちは。
細川です。
恐らく VCL.Clipbrd の Clipboard だと思いますので、VCL の Clipboard について説明します。
VCL.Clipbrd.TClipboard の SetAsText (SetBuffer) の実装は横着していて
EmptyClipboard を呼んでいません。
本来は MS のサイト(※)でもあるように SetClipboardData を呼ぶ前に EmptyClipboard を呼ぶ必要があります。
EmptyClipboard を呼ばなくても概ね上手く行くのですが、それは「偶然」です。
例えば、Clipboard 追跡プログラムが入っている場合は失敗する可能性があります。
TClipboard.Clear を呼ぶと成功する(たまに失敗する)というのは Clear で EmpltyClipboard が呼ばれているからです。
絶対に成功させるためには OpenClipboard / CloseClipboard に囲まれた中で EmptyClipboard
呼び、SetClipboardData を呼ぶコードを自作しなければいけません。
たとえば、↓のような形になります。
procedure TClipboardHelper.SetTextToClip(const AText: String);
begin
if OpenClipboard(FHandle) then // FHandle は HWND
begin
try
EmptyClipboard;
var Data := GlobalAlloc(GMEM_MOVEABLE, Length(AText) *
SizeOf(Char) + 1);
if Data <> 0 then
begin
try
var DataPtr := GlobalLock(Data);
try
Move(PChar(AText)^, DataPtr^, GlobalSize(Data));
SetClipboardData(CF_UNICODETEXT, Data);
finally
GlobalUnlock(Data);
end;
except
GlobalFree(Data);
end;
end;
finally
CloseClipboard;
end;
end;
end;
※
https://learn.microsoft.com/ja-jp/windows/win32/dataxchg/using-the-clipboard
2023年7月19日(水) 10:24 Eiichiro Kamiya <
eiichir...@gmail.com>:
> --
> このメールは Google グループのグループ「Japan RAD Studio User Group」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
radstudio-jp...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには
https://groups.google.com/d/msgid/radstudio-jp/CAA1D39Q%3DEfhix7L9Zb%3Dpy0t2wLFbSdMeD8rd%2BAO1yGPSuPvd3g%40mail.gmail.com にアクセスしてください。