Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android Kitkat Delphi XE8中从列表框中提取原始JString值_Android_Delphi_Listbox_Android 4.4 Kitkat_Delphi Xe8 - Fatal编程技术网

如何在Android Kitkat Delphi XE8中从列表框中提取原始JString值

如何在Android Kitkat Delphi XE8中从列表框中提取原始JString值,android,delphi,listbox,android-4.4-kitkat,delphi-xe8,Android,Delphi,Listbox,Android 4.4 Kitkat,Delphi Xe8,我正在用delphixe8测试android多设备应用程序。我将对象附加到列表框中的项目,如下所示: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, Androidapi.JNI.JavaTy

我正在用delphixe8测试android多设备应用程序。我将对象附加到列表框中的项目,如下所示:

 unit Unit1;

 interface

 uses
  System.SysUtils, System.Types, System.UITypes, System.Classes,  
   System.Variants,

  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics,    
  Androidapi.JNI.JavaTypes, FMX.Dialogs,
 FMX.Controls.Presentation, FMX.StdCtrls, FMX.Layouts, FMX.ListBox,    
 Androidapi.Helpers;

 type
   TForm1 = class(TForm)
   ListBox1: TListBox;
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   private
   { Private declarations }
   public
   { Public declarations }
   end;

     var
    Form1: TForm1;

    implementation
    {$R *.fmx}

    //this where I am Attaching objects to items
    procedure TForm1.Button1Click(Sender: TObject);
    var
    str:string;
    jstr1:JString;
    begin
    str:='apple';
    jstr1:=StringToJString(str);
    ListBox1.Items.AddObject('fruit', TObject(jstr1));
    end;


    //this where I am extracting the jstring objects
    procedure TForm1.Button2Click(Sender: TObject);
     var
    jstr2:JString;
    str2:string;
    begin
    jstr2:=JString(ListBox1.Items.Objects[i]);
    str2:=JStringToString(jstr2);
    showmessage('the fruit of the day is '+str2);
    end;

   end.
上面的代码运行正常,jstring对象被附加到项目,但是,当我想要提取已附加到项目的jstring对象时,我会执行以下操作:

 jstr2:=JString(ListBox1.Items.Objects[i]);
 //Above give me an AV: I get incompatible types TObject and JString

 str2:=JStringToString(jstr2);
由于TObject和JString类型不兼容,上述代码无法编译。但是,如果我附加了一个字符串作为对象(而不是jstring),并且想要取回那些字符串对象,我可以做:

str2:=String(ListBox1.Items.Objects[i]);

这将适用于常规字符串。如何解决这个问题,附加和提取jstring?

这只是一个建议,我无法检查(此处未安装任何内容),但您可以编写一个简单的对象类型并存储它(我将其放在自己的单元中,然后在表单单元中使用):

您可以在表单单元的实现部分使用它,如:

implementation

uses ..., StringObjs;

...

  ListBox1.Items.AddObject('fruit', TStringObj.Create(jstr1));
反过来说:

  MyString := string(ListBox1.Items[0] as TStringObj);

请注意,表单只是一个类,但是IDE知道并可以使用表单设计器进行编辑。要声明其他类,请执行与上面类似的操作。阅读以了解更多信息。

FWIW,AV是一种访问冲突,意味着您正在运行时访问不属于该程序的内存。我猜您的意思是编译过程中出现了编译器错误?您的错误消息意味着JString不是ToObject的后代。你也许可以存储JString的地址,但我不太清楚JString到底是什么,所以我不愿意肯定。我把类型放在它自己的单元中,并编辑了我的答案。您应该真正了解类以及如何声明和使用它们。请参阅我答案中的链接。“创建”的声明与以前的声明不同。我相信这是因为“const”缺少from第一个声明(接口部分中的声明)。我也向其中添加了const以测试它是否有效,但这导致了我前面提到的错误“Undeclared FPayload”。Edited:在Create的声明中添加了一个const。你可以试着理解代码,然后自己解决。非常感谢鲁迪·维尔修斯。我也按照你的建议阅读了《德尔福语言指南》。我从来没想过在这里被人用勺子喂,但我很高兴能找到一个解决办法。我将尝试编辑/更新帖子,为其他的noob提供完整的问题和解决方案。
  MyString := string(ListBox1.Items[0] as TStringObj);