我现在决定将我的Delphi 7项目转换为XE4,但在我的一行代码行中,我遇到了一个女巫问题,我试图修复它,但没有希望,所以我希望有人能帮助我解决它。将我的项目从D7转换为XE4的问题
这里的问题:
在共享单元的一个服务器和客户端应用(酒店客房管理系统)我有这样的记录类型之间使用:
Type
THotelClientDetails = packed record
LSize: Integer;
ClientName: array[0..25] of char;
ClientRoomN: Integer;
RWithInternet: Boolean;
RoomStatus :Integer;
//... etc
end;
PHotelClientDetails = ^THotelClientDetails;
在客户端应用程序,我使用follwing步骤:
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时,我的问题是我得到的客户端应用程序发送的全名: 例如,如果我想送客户“西门”或“马太福音”到服务器
我得到正确的名称:
ShowMessage(ClientName);//simon or matthew
但使用XE4相同的程序时,我总是得到
SIM为西蒙 和 亚光为马修
这意味着服务器没有收到完整的客户端的名称与Delphi7的项目。
尽管在两个项目中都添加了单位“System.AnsiStrings;”。
那么请我如何解决这个问题?
非常感谢。
西蒙
'CMDCMDLINE:数组[0..25] ANSIChar一致的;' – bummi
@bummi谢谢你,我用它,但我总是得到这个编译器错误: '代码 E2250没有可以通过这些参数调用'StrCopy'的重载版本' – user2736348