![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как скопировать PWideChar в буфер обмена? [D7, WinXP]
Караваев Дмитрий © (2005-01-29 19:48:00)Есть строка двухбайтовых символов типа PWideChar, требуется скопировать её в буфер обмена. Совсем не знаю, как это реализовать!
Кстати, вариант преобразования её в обычную однобайтовую строку и последущее копирование через Clipboard не подходит...
vertal (2005-01-30 17:58:00) [1]> default c (29.01.05 22:54) [2]
> кошмар!!!
> procedure TForm1.Button1Click(Sender: TObject);
> var
> S: WideString;
> begin
> S := '123';
> Clipboard.AsText := S
> end;
> default c (29.01.05 22:57) [3]
> или так не нравится?
Человек сказал, что вариант с предварительным преобразованием в строку с однобайтовыми символами не подходит (может быть, есть символы, непредставимые в текущей кодовой странице в win). А при присвоении Clipboard.AsText := S именно такое преобразование и происходит. И с помощью объекта Clipboard добиться сабжа вообще невозможно, так как там процедура SetBuffer находится в protected - части деклараций методов.
default (2005-01-29 23:06:00) [2]ну пусть запихивает
ShimON (2005-01-29 23:04:00) [3]Ему нужно ведь PWideString запихнуть...
default (2005-01-29 22:57:00) [4]или так не нравится?
default (2005-01-29 22:54:00) [5]кошмар!!!
uses Clipbrd;
...
procedure TForm1.Button1Click(Sender: TObject);
var
S: WideString;
begin
S := '123';
Clipboard.AsText := S
end;
vertal (2005-01-29 22:33:00) [6]
uses windows;
{$B-}
function CopyDataToClipboard(const lpDataPtr: Pointer; const dwDataSize: Cardinal;
const dwDataFormat: Cardinal): Boolean;
var
hGMem: hGlobal;
pGMem: Pointer;
begin
Result := False;
hGMem := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, dwDataSize);
if hGMem <> 0 then
begin
pGMem := GlobalLock(hGMem);
if pGMem <> nil then
begin
Move(lpDataPtr^, pGMem^, dwDataSize);
GlobalUnlock(hGMem);
if OpenClipboard(0) then
begin
Result := EmptyClipboard and (SetClipboardData(dwDataFormat, hGMem) <> 0);
CloseClipboard;
end;
end;
if not Result then
GlobalFree(hGMem);
end;
end;
CopyDataToClipboard(YourWideCharStr, Length(YourWideCharStr) * 2 + 2, CF_UNICODETEXT)
Правда в справке сказано, что стандартный формат CF_UNICODETEXT поддерживается только в NT.