这是我第一次为Lockbox安装库。我从sourceforge下载了3.4.3版本并使用了Delphi 7.第一步是让这个sucker在Delphi 7下编译并且它是地狱。我希望安装后组件更容易使用。
确定。我有一个看起来像这样的单位。
unit uTPLb_StrUtils;
interface
uses
SysUtils, uTPLb_D7Compatibility;
function AnsiBytesOf(const S: string): TBytes;
implementation
function AnsiBytesOf(const S: string): TBytes;
begin
//compiler chokes here
**Result := TEncoding.ANSI.GetBytes(S);**
end;
end.
BTW,兼容性单元将TBytes定义为TBytes =打包的字节数组;
Delphi 7在TEncoding上窒息,因为它只存在于D2009 +中。我该怎么用?
替换这个功能答案 0 :(得分:4)
String
是Delphi 7中的8位AnsiString
。只需将TBytes
分配给字符串的Length()
,将Move()
字符串内容分配到其中:
function AnsiBytesOf(const S: AnsiString): TBytes;
begin
SetLength(Result, Length(S) * SizeOf(AnsiChar));
Move(PChar(S)^, PByte(Result)^, Length(Result));
end;
如果您希望在政治上正确并与TEncoding.GetBytes()
匹配,则必须将String
转换为WideString
,然后使用Win32 API WideCharToMultiBytes()
函数将其转换为字节:
function AnsiBytesOf(const S: WideString): TBytes;
var
Len: Integer;
begin
Result := nil;
if S = '' then Exit;
Len := WideCharToMultiByte(0, 0, PWideChar(S), Length(S), nil, 0, nil, nil);
if Len = 0 then RaiseLastOSError;
SetLength(Result, Len+1);
WideCharToMultiByte(0, 0, PWideChar(S), Length(S), PAnsiChar(PByte(Result)), Len, nil, nil);
Result[Len] = $0;
end;
答案 1 :(得分:0)
function Quux(const S: AnsiString): TBytes;
var
Count: Integer;
begin
Count := Length(S) * SizeOf(AnsiChar);
{$IFOPT R+}
if Count = 0 then Exit; // nothing to do
{$ENDIF}
SetLength(Result, Count);
Move(S[1], Result[Low(Result)], Count);
end;
答案 2 :(得分:0)