我现在决定将我的 Delphi 7 项目转换为 XE4 ,但是在我的代码行之一中,我遇到了一个女巫问题,我试图修复它但没有希望,所以我希望有人可以帮助我修复它。
这是问题:
在服务器和客户端应用程序(酒店客房管理系统)之间使用的共享单元中,我有这个记录类型:
Type
THotelClientDetails = packed record
LSize: Integer;
ClientName: array[0..25] of char;
ClientRoomN: Integer;
RWithInternet: Boolean;
RoomStatus :Integer;
//... etc
end;
PHotelClientDetails = ^THotelClientDetails;
在客户端应用程序中,我使用以下程序:
procedure TCForm.SendClientDetailsClick(Sender: TObject);
var
pClientDetails: PHotelClientDetails;
iSize: Integer;
begin
iSize:= SizeOf(THotelClientDetails)+Length(ClientNameEd.Text)+1;
GetMem(pClientDetails,iSize);
ZeroMemory(pClientDetails,iSize);
pClientDetails.LSize := iSize;
StrCopy(pClientDetails.ClientName,PChar(ClientNameEd.Text));
pClientDetails.ClientRoomN :=StrToInt(ClientNEd.text);
pClientDetails.RWithInternet:=ClientWInternet.Checked;
pClientDetails.RoomStatus :=ClientRoomStatus.ItemIndex;
StrCopy(Pointer(Cardinal(pClientDetails)+SizeOf(THotelClientDetails)),
PChar(ClientNameEd.Text));
SendClientsBuffer(pClientDetails,iSize);// to the Server for Check
FreeMem(pClientDetails);
end;
在服务器应用程序中,我使用以下程序:
Procedure TSForm.GetClientDetails(pClientDetails:PHotelClientDetails; Cntx: Pointer);
var
ClientName: string;
begin
ClientName:=PChar(Cardinal(pClientDetails)+SizeOf(THotelClientDetails));
//*** just a test to get the ClientName
ShowMessage(ClientName);
//***
end;
所以我的问题是在使用 Delphi 7 时,我得到了客户端应用程序发送的全名:例如,如果我想将客户端“simon”或“matthew”发送到服务器
我得到了正确的名字:
ShowMessage(ClientName);//simon or matthew
但是当在 XE4 中使用相同的程序时,我总是得到
sim 为simon 和 matt为matthew
这意味着服务器没有像 Delphi7 项目那样接收完整的客户端名称。
虽然在 Both Projects 中添加了单元“System.AnsiStrings;”。
那么请问我该如何解决这个问题?
非常感谢。
西蒙