1. 程式人生 > >Delphi 專案遷移到 Tiburon(Delphi2009,Delphi2010) 中的注意事項

Delphi 專案遷移到 Tiburon(Delphi2009,Delphi2010) 中的注意事項

呼叫 Read/ReadBuffer 方法的範例:
var
  S: string;
  L: Integer;
  Stream: TStream;
  Temp: AnsiString;
begin
  // 現有程式碼- 當 string = UnicodeString 時它是不正確的
  Stream.Read(L, SizeOf(Integer));
  SetLength(S, L);
  Stream.Read(Pointer(S)^, L);
  
  // 正確的 Unicode 寫法如下
  Stream.Read(L, SizeOf(Integer));
  SetLength(S, L);
  Stream.Read(Pointer(S)^, L * SizeOf(Char));  // <<-- Specify buffer size in bytes
  
  //正確的 Ansi 寫法如下
  Stream.Read(L, SizeOf(Integer));
  SetLength(Temp, L);              // <<-- 使用臨時的變數 AnsiString
  Stream.Read(Pointer(Temp)^, L * SizeOf(AnsiChar));  // <<-- Specify buffer size in bytes
  S := Temp;                       // <<-- 放寬 string 到 Unicode
end;
上面的解決方案依賴於您儲存在 Stream 中的字串的編碼格式,更好的讀取和轉換他們建議使用 TEncoding 類。

呼叫 Write/WriteBuffer 的範例:

var
  S: string;
  Stream: TStream;
  Temp: AnsiString;
begin
  // 現有程式碼 - 當 string = UnicodeString 時它是錯的
  Stream.Write(Pointer(S)^, Length(S));
  
  // 正確的讀取 Unicode 的程式碼
  Stream.Write(Pointer(S)^, Length(S) * SizeOf(Char)); // <<-- Specify buffer size in bytes
  
  // 正確的讀取 Ansi 的程式碼
  Temp := S;          // <<-- Use temporary AnsiString
  Stream.Write(Pointer(Temp)^, Length(Temp) * SizeOf(AnsiChar));// <<-- Specify buffer size in bytes
end;
上面的解決方案依賴於您要儲存進 Stream 中的字串的編碼格式,建議使用 TEncoding 類來更好的對格式進行處理。