程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 現有Delphi項目遷移到Tiburon中的注意事項(8)

現有Delphi項目遷移到Tiburon中的注意事項(8)

編輯:Delphi

當您需要用 TMemoryStream 寫入一個文本文件的時候,最好在寫入任何字符數據進去之前先寫入一個 Byte Order Mark (BOM):

var

Bom: TBytes;

begin

...

Bom := TEncoding.UTF8.GetPreamble;

Write(Bom[0], Length(Bom));

而任何寫入的字符需要被轉換成 UTF-8 編碼:

var

Temp: Utf8String;

begin

...

Temp := Utf8Encode(Str); // Str 是要寫入文件的字符

Write(Pointer(Temp)^, Length(Temp));

//Write(Pointer(Str)^, Length(Str)); 原來寫入字符串的代碼

接上文

MultiByteToWideChar 函數

調用 Windows API MultiByteToWideChar 函數可以簡單的用一個任務替代,下面是一個是用 MultiByteToWideChar 的例子:

procedure TWideCharStrList.AddString(const S: string);
var
 Size, D: Integer;
begin
 Size := SizeOf(S);
 D := (Size + 1) * SizeOf(WideChar);
 FList[FUsed] := AllocMem(D);
 MultiByteToWideChar(0, 0, PChar(S), Size, FList[FUsed], D);
 Inc(FUsed);
end;

轉換到 Unicode 下可以寫作這樣(同時支持 Unicode 和 ANSI 字符):

procedure TWideCharStrList.AddString(const S: string);
{$IFNDEF UNICODE}
var
 L, D: Integer;
{$ENDIF}
begin
{$IFDEF UNICODE}
 FList[FUsed] := StrNew(PWideChar(S));
{$ELSE}
 L := Length(S);
 D := (L + 1) * SizeOf(WideChar);
 FList[FUsed] := AllocMem(D);
 MultiByteToWideChar(0, 0, PAnsiChar(S), L, FList[FUsed], D);
{$ENDIF}
 Inc(FUsed);
end;

SysUtils.AppendStr 函數

AppendStr 函數已經廢棄了,因為它與 AnsiString 硬編碼在一起,而且沒有 Unicode 的版本可以替換,所以下面的代碼

AppendStr(String1, String2);

應該換成:

String1 := String1 + String2;

您也可以使用新的 TStringBuilder 類來替換。

使用 Named Threads

現有 Delphi 代碼中使用了 Named Threads 的代碼必須修改了。在早先的版本中,當你需要在分類(gallery)中用一個新的 Thread Object 去創建一個 Thread 的時候,需要在新的 Thread 單元中建立下面的類型:

type
TThreadNameInfo = record
 FType: LongWord; // must be 0x1000
 FName: PChar; // pointer to name (in user address space)
 FThreadID: LongWord; // thread ID (-1 indicates caller thread)
 FFlags: LongWord; // reserved for future use, must be zero
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved