【发布时间】:2016-06-07 21:18:37
【问题描述】:
多年来,我一直在使用 Peter Above 的 APIClipboard 单元,但它不再适用于 Unicode Delphi。
ClipboardAsString 返回 gobbledegook:
Procedure DataFromClipboard( fmt: DWORD; S: TStream );
Var
hMem: THandle;
pMem: Pointer;
datasize: DWORD;
Begin { DataFromClipboard }
Assert( Assigned( S ));
hMem := GetClipboardData( fmt );
If hMem <> 0 Then Begin
datasize := GlobalSize( hMem );
If datasize > 0 Then Begin
pMem := GlobalLock( hMem );
If pMem = Nil Then
raise EclipboardError.Create( eLockFailed );
try
S.WriteBuffer( pMem^, datasize );
finally
GlobalUnlock( hMem );
end;
End;
End;
End;
Procedure CopyDataFromClipboard( fmt: DWORD; S: TStream );
Begin { CopyDataFromClipboard }
Assert( Assigned( S ));
If OpenClipboard( 0 ) Then
try
DataFromClipboard( fmt , S );
finally
CloseClipboard;
end
Else
raise EclipboardError.Create( eCannotOpenClipboard );
End;
Function ClipboardAsString: String;
Const
nullchar: Char = #0;
Var
ms: TMemoryStream;
Begin { ClipboardAsString }
If not IsClipboardFormatAvailable( CF_TEXT ) Then
Result := EmptyStr
Else Begin
ms:= TMemoryStream.Create;
try
CopyDataFromClipboard( CF_TEXT , ms );
ms.Seek( 0, soFromEnd );
ms.WriteBuffer( nullChar, Sizeof( nullchar ));
Result := Pchar( ms.Memory );
finally
ms.Free;
end;
End;
End;
而 StringToClipboard 只复制第一个字符:
Procedure DataToClipboard( fmt: DWORD; Const data; datasize: Integer );
Var
hMem: THandle;
pMem: Pointer;
Begin { DataToClipboard }
If datasize <= 0 Then Exit;
hMem := GlobalAlloc( GMEM_MOVEABLE or GMEM_SHARE or GMEM_ZEROINIT ,
datasize );
If hmem = 0 Then
raise EclipboardError.Create( eSystemOutOfMemory );
pMem := GlobalLock( hMem );
If pMem = Nil Then Begin
GlobalFree( hMem );
raise EclipboardError.Create( eLockFailed );
End;
Move( data, pMem^, datasize );
GlobalUnlock( hMem );
If SetClipboardData( fmt, hMem ) = 0 Then
raise EClipboarderror( eSetDataFailed );
End; { DataToClipboard }
Procedure CopyDataToClipboard( fmt: DWORD; Const data; datasize:
Integer;
emptyClipboardFirst: Boolean = true );
Begin { CopyDataToClipboard }
If OpenClipboard( 0 ) Then
try
If emptyClipboardFirst Then
EmptyClipboard;
DataToClipboard( fmt, data, datasize );
finally
CloseClipboard;
end
Else
raise EclipboardError.Create( eCannotOpenClipboard );
End;
Procedure StringToClipboard( Const S: String );
Begin
If Length(S) > 0 Then
CopyDataToClipboard( CF_TEXT, S[1], Length(S)+1);
End;
我已搜索但找不到此单元的更新版本。有没有对 Unicode 字符串有更多经验的人知道解决这个问题的最佳方法?
谢谢
【问题讨论】:
-
是否将所有
pchar/string实例替换为pansichar/ansistring不成功? -
你为什么不改用
Clipboard.AsText := S?