簡體   English   中英

TStringList.AddObject 不適用於 Android (Delphi)

[英]TStringList.AddObject not working on Android (Delphi)

我正在使用 RAD Studio XE-5 創建 Android 應用程序,但最近偶然發現了一個令人費解的錯誤。 TStringList.AddObject 引發以下異常:

Project Project3.apk raised exception class Segmentation fault (11).

我的代碼是這樣的

procedure TMainForm.FormCreate(Sender: TObject);
var
    list: TStrings;
begin
   list := TStringList.Create;
   list.AddObject('Joe', TObject(1)); // This is where exception is raised
   list.AddObject('Hans', TObject(2));
end;

這段代碼在 32 位 Windows 目標上運行得非常好,但是在我的 Nexus 7 上運行(在調試模式下)時會引發上述異常(當我不使用 TStringList.AddObject 時運行良好)。 如果我在沒有調試的情況下運行該應用程序,它只會在我的 Nexus 上關閉。

這是 Delphi Android 的已知問題/限制嗎? 是否有解決方法或推薦的方法來實現相同的結果(不僅適用於這個玩具示例,還適用於一般使用 AddObject)?

在 Delphi 7 時代,整個編程風格就是做事的方式。但從那時起,很多事情都發生了變化。 最特別的是,移動編譯器使用 ARC,它們將嘗試銷毀字符串列表中的對象。 這解釋了您看到的錯誤。

另一個變化是 D2009 中添加的對泛型的支持。 您現在應該為此任務使用類型安全的通用容器,而不是字符串列表。 周圍有很多,但讓我們展示一個來自Generics.Collections的內置類的例子。

您需要創建一個列表元素類型。 它包含一個字符串和一個整數。

type
  TMyItem = record
  public
    Name: string;
    Age: Integer;
  end;

讓我們用一種簡單的方法來制作新的:

function NewMyItem(const Name: string; const Age: Integer): TMyItem;
begin
  Result.Name := Name;
  Result.Age := Age;
end;

然后讓我們列出它們:

var
  List: TList<TMyItem>;
....
List := TList<TMyItem>.Create;

現在添加一些項目:

List.Add(NewMyItem('Joe', 1));
List.Add(NewMyItem('Hans', 2));

我不知道,為什么 Stefan Glienke 沒有寫他們的評論作為答案,但這是一個非常好的另一個答案:

請參閱這篇博客文章(它討論了 iOS,但同樣適用於 Android): http : //blogs.riversoftavg.com/index.php/2013/08/01/using-primitive-types-with-tstrings-in-ios /

建議是創建一個新的包裝類來將整數包裝到 TObject 中,為它們制作類操作符 Implicit 和 Explicit 以方便轉換,並使用對此類的強制轉換,而不是將 Integers 強制轉換為 TObject 並返回到 Integer。 它最大限度地減少了所需的代碼更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM