作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在使用 C++Builder 创建一个将文本复制到用户剪贴板的应用程序。我已经放置了一个 TMemo
控件,我想将其包含在 const char *
中变量如下面的代码所示:
const char* output = TMemo1->Text;
no viable conversion from 'Vcl::Controls::TCaption' (aka 'System::UnicodeString') to 'const char *'
const char* output = TMemo1->Text; // Error here
const size_t len = strlen(output) + 1;
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
memcpy(GlobalLock(hMem), output, len);
GlobalUnlock(hMem);
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
最佳答案
Text
属性返回 UnicodeString
对象,而不是 const char*
指针。并且没有来自 UnicodeString
的隐式转换至 const char*
(你也不想要)。因此,您必须手动转换数据,例如使用 WideCharToMultiByte()
(或等价物),例如:
UnicodeString text = TMemo1->Text;
const size_t len = WideCharToMultiByte(CP_ACP, 0, text.c_str(), -1, NULL, 0, NULL, NULL);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
if (hMem)
{
char *output = (char*) GlobalLock(hMem);
WideCharToMultiByte(CP_ACP, 0, text.c_str(), -1, output, len, NULL, NULL);
GlobalUnlock(hMem);
if (OpenClipboard(0))
{
EmptyClipboard();
if (SetClipboardData(CF_TEXT, hMem))
hMem = NULL;
CloseClipboard();
}
if (hMem)
GlobalFree(hMem);
}
TMemo
的文本到
AnsiString
并让 RTL 为您处理转换,例如:
AnsiString output = TMemo1->Text; // <-- automatic conversion from UTF-16 to ANSI
const size_t len = (output.Length() + 1) * sizeof(System::AnsiChar);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
if (hMem)
{
memcpy(GlobalLock(hMem), output.c_str(), len);
GlobalUnlock(hMem);
if (OpenClipboard(0))
{
EmptyClipboard();
if (SetClipboardData(CF_TEXT, hMem))
hMem = NULL;
CloseClipboard();
}
if (hMem)
GlobalFree(hMem);
}
CF_UNICODETEXT
格式而不是
CF_TEXT
.这样,您就不需要转换
UnicodeString
数据,您可以按原样存储(如果有人随后从剪贴板请求
CF_TEXT
,
the clipboard itself will convert the text for you ),例如:
#include <System.SysUtils.hpp> // for ByteLength()
UnicodeString output = TMemo1->Text;
const size_t len = ByteLength(output) + sizeof(System::WideChar);
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, len);
if (hMem)
{
memcpy(GlobalLock(hMem), output.c_str(), len);
GlobalUnlock(hMem);
if (OpenClipboard(0))
{
EmptyClipboard();
if (SetClipboardData(CF_UNICODETEXT, hMem))
hMem = NULL;
CloseClipboard();
}
if (hMem)
GlobalFree(hMem);
}
TClipboard
为您处理所有这些细节的类,例如:
#include <Vcl.Clipbrd.hpp>
Clipboard()->AsText = TMemo1->Text;
关于c++ - 将 Vcl::Controls::TCaption aka (System::UnicodeString) 转换为 const char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62294007/
我可以添加一个单元来为 TCaption 提供 StringHelper 吗? 使用 Edit1.Text.Trim、Edit1.Text.ToInteger 等比 Trim(Edit1.Text)
我目前正在使用 C++Builder 创建一个将文本复制到用户剪贴板的应用程序。我已经放置了一个 TMemo控件,我想将其包含在 const char * 中变量如下面的代码所示: const cha
我是一名优秀的程序员,十分优秀!