Delphi 7 プロジェクトを XE4 に変換することにしましたが、コード行の 1 つで魔女の問題が発生し、修正しようとしましたが、希望がありませんでした。
問題は次のとおりです。
サーバーとクライアント アプリ (ホテル ルーム管理システム) の間で使用される共有ユニットでは、次のレコード タイプがあります。
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 、マシュー の 場合はマット
これは、サーバーが Delphi7 プロジェクトのようにクライアントの完全な名前を受け取っていないことを意味します。
Both Projects にユニット「 System.AnsiStrings; 」が追加されていますが。
どうすればこの問題を解決できますか?
そして本当にありがとう。
サイモン