当前位置: 首页 > 知识库问答 >
问题:

Android上的Delphi FireMonkey TListBox

房子昂
2023-03-14

在Delphi 10.0 Seattle中,我在向FireMonkeyTListBox添加Tobject值时遇到问题。

integer变量强制转换为tobject指针时会引发exeception。

下面是我的代码:

var
  jValue:TJSONValue;
  i,total,id: integer;
  date: string;
begin
  while (i < total) do
  begin
    date := converteDate(jValue.GetValue('date' + IntToStr(i), ''));
    id := StrToInt(jValue.GetValue('id' + IntToStr(i), ''));
    ListBox1.Items.AddObject(date, TObject(id));
    i := i + 1;
  end;
end;

共有1个答案

柯梓
2023-03-14

问题是,在iOS和Android(以及不久的Linux)上,tobject使用自动引用计数进行生存期管理,因此,您不能像在不使用ARC的Windows和OSX上那样将整数值类型转换为tobject指针。在ARC系统上,tobject指针必须指向真实对象,因为编译器要对它们执行引用计数语义。这就是为什么你会得到一个例外。

为了完成您正在尝试的操作,您必须在ARC系统中将整数值包装在真实对象中,例如:

{$IFDEF AUTOREFCOUNT}
type
  TIntegerWrapper = class
  public
    Value: Integer;
    constructor Create(AValue: Integer);
  end;

constructor TIntegerWrapper.Create(AValue: Integer);
begin
  inherited Create;
  Value := AValue;
end;
{$ENDIF}

...

ListBox1.Items.AddObject(date, {$IFDEF AUTOREFCOUNT}TIntegerWrapper.Create(id){$ELSE}TObject(id){$ENDIF});

...

{$IFDEF AUTOREFCOUNT}
id := TIntegerWrapper(ListBox1.Items.Objects[index]).Value;
{$ELSE}
id := Integer(ListBox1.Items.Objects[index]);
{$ENDIF}

否则,将整数存储在单独的列表中,然后在需要时使用TListBox项的索引作为该列表的索引,例如:

uses
  .., System.Generics.Collections;

private
  IDs: TList<Integer>;

...

var
  ...
  Index: Integer;
begin    
  ...
  Index := IDs.Add(id);
  try
    ListBox1.Items.Add(date);
  except
    IDs.Delete(Index);
    raise;
  end;
  ...
end;

...

Index := ListBox1.Items.IndexOf('some string');
id := IDs[Index];

这可以移植到所有平台,而不必使用ifdefs或担心ARC。

 类似资料:
  • 问题内容: 根据: Android 2.0应该支持HTML5视频元素。我无法使用MotorolaDroid使它正常工作,也无法在其中的任何HTML5视频示例页面上成功查看视频。由于目前不支持QuickTime或Flash,这是我想到的将mp4视频嵌入网页中的唯一其他方法。有人有运气吗? 问题答案: 我已经对此进行了一些试验,从我可以告诉你的需要三件事: 调用视频时,不得使用 type 属性。 您必

  • 问题内容: 这听起来像是一个愚蠢的问题,但Google并没有帮助我。 是否有适用于Android的JRE?如果是,是哪个版本?是否缺少任何主要功能? 如果不是,那是否意味着需要重新编译所有Java应用程序才能使Dalvik在Android上运行? 更新; Android是否会提供JRE? 问题答案: 不,那里没有。Google确实为Android创建了完全不同的运行时,其中基类完全不同(尽管 兼容

  • 我在 当我调用时。我看到另一个帖子,答案是重写一些方法,即。 异常在处引发,与库版本有关。 最后,这是我的建筑。gradle(应用程序)

  • 我的应用程序上有WebView,我在android 7.0上从用户那里得到了许多相同的错误,同时膨胀了WebView片段。 错误日志: Android看法充气异常:二进制XML文件行#8:二进制XML文件行#8:错误充气类android。网络工具包。网络视图导致:android。看法充气异常:二进制XML文件行#8:充气类android时出错。网络工具包。网络视图 网络视图片段布局: 我从这些设备

  • 因此,我使用createQuery连接到我的symfony数据库,其原则如下 在url:http://localhost/symfony/web/app_dev.php/json,现在我要在Android(eclipse Android)上导出结果(jsonreponse),并在那里显示响应!我怎么能那么做? 我在google上找到了这段关于在Android上显示json代码的代码,但我不知道如何

  • 问题内容: 有没有人曾经在Android上使用过Multimaps? 问题答案: 番石榴在Android上可以直接使用。你有什么问题?使用发布的JAR,而不是Guava来源。与往常一样,您应该在构建过程中使用ProGuard来缩减最终二进制文件的大小。

  • 我现在在android ndk中很天真。我尝试了此url中给出的步骤:https://www3.ntu.edu.sg/home/ehchua/programming/android/Android_NDK.html根据此,我从androidndkr_10导入我的eclipse中的HELLO_JNI示例,当我运行它时,会在logcat中出现以下错误 08-17 18:12:01.472:E/Andr

  • mapsforge-core-0.5.1.jar mapsforge-map-0.5.1.jar mapsforge-map-android-0.5.1.jar mapsforge-map-reader-0.5.1.jar