请各位大侠帮 忙请这段java代码转成 delphi

时间:2021-04-14 19:10:53
  List<UnicardSwipeDetail> unicardSwipeDetails = new ArrayList<UnicardSwipeDetail>();
        UnicardSwipeDetail u = new UnicardSwipeDetail();   
        u.setBalance(1111);
        u.setCardNumber("1111");
        u.setId("1111");
        u.setSchoolId("130011");
        u.setStudentId("1111");
        u.setSwipeAmount(1111);
        u.setSwipeTime(new Date());
        u.setSwipeType(1);
        unicardSwipeDetails.add(u);
        service.unicardSwipeDetailSyncService(unicardSwipeDetails.toArray(new UnicardSwipeDetail[0]), key);


UnicardSwipeDetail:为一个类

15 个解决方案

#1



其实很简单
就是一个tlist和一个类的操作,完全帮你敲了,恐怕你什么也学不到,给你两个链接,稍微看下就懂了
tlist的操作
http://anony3721.blog.163.com/blog/static/511974201082443238978/
类的操作
http://www.cnblogs.com/hi-ilovefeng/archive/2006/06/15/426180.html

另外补充下,delphi没有垃圾回收器,用完后记得要释放

#2


感觉转起来不伦不类的

JAVA服务 起码你要改成DELPHI  其次D也不支持简单对象

DELPHI版本是多少?如果是XE的话还有可能 通过JSON来实现。





#3


引用 2 楼 jiap1723 的回复:
感觉转起来不伦不类的
JAVA服务 起码你要改成DELPHI  其次D也不支持简单对象
DELPHI版本是多少?如果是XE的话还有可能 通过JSON来实现。

刚才还真没注意,最后还有这么一句................那好吧,我路过的说.......
service.unicardSwipeDetailSyncService(unicardSwipeDetails.toArray(new UnicardSwipeDetail[0]), key);

#4


这是调用别个的一个JAVA 写的WEBserver ,这是JAVA的写法, 现在DELPHI中调用参数传不上去 为空:附代码:

procedure TForm1.Button2Click(Sender: TObject);
var
  Iservice: XxtDataSyncServiceImpl;
  B, c, TempLocal: WideString;
  XMLDoc: IXMLDocument;

  UPDateinfo: UnicardSwipeDetail;
  LL: TLIST;
begin

  Iservice := HTTPRIO1 as XxtDataSyncServiceImpl  

  updateinfo := UnicardSwipeDetail.Create
  updateinfo.id := '1'; //充值记录ID
  updateinfo.schoolId := '000001'; //学校ID
  updateinfo.studentId := '1'; //学生ID
  updateinfo.cardNumber := '000001'; //卡号
  updateinfo.swipeType := 1; //刷卡类型
   // updateinfo[I].swipeTime := strtodatetime(formatdatetime('yyyy-mm-dd hh:mm:ss', now));
  updateinfo.swipeAmount := 5; //刷卡金额   全部整形?
  updateinfo.balance := 10; //余额


  ll := tlist.Create();
  ll.Add(updateinfo);

 //向SERVER提交数据
 Iservice.unicardSwipeDetailSyncService(ll[0], '8117f0657e022053f46895aff1b998e2');
  LL.Destroy;


问题是现在数据传到服务端是空。谢谢!

#5


list也不行吧 是个对象 对象传的是内存地址 肯定是错误的

你可以改一下服务端方法 JAVA解析

D端传递时将对象序列化

#6


比如D端 将对象 按找JAVA数组序列化的格式进行转换

或者转换成JSON格式

实在不行自己订一套 简单的

#7


请各位多支支招啊,服务端那边很牛,不改,没办法,郁闷 
这是接口中类的定义:

 UnicardSwipeDetail = class(TRemotable)
  private
    Fbalance: Integer;
    FcardNumber: WideString;
    Fid: WideString;
    FschoolId: WideString;
    FstudentId: WideString;
    FswipeAmount: Integer;
    FswipeTime: TXSDateTime;
    FswipeType: Integer;
  public
    destructor Destroy; override;
  published
    property balance: Integer read Fbalance write Fbalance;
    property cardNumber: WideString read FcardNumber write FcardNumber;
    property id: WideString read Fid write Fid;
    property schoolId: WideString read FschoolId write FschoolId;
    property studentId: WideString read FstudentId write FstudentId;
    property swipeAmount: Integer read FswipeAmount write FswipeAmount;
    property swipeTime: TXSDateTime read FswipeTime write FswipeTime;
    property swipeType: Integer read FswipeType write FswipeType;
  end;
    ArrayOf_tns2_UnicardSwipeDetail = array of UnicardSwipeDetail;

#8


上传调用的方法定义:

  function unicardSwipeDetailSyncService(const unicardSwipeDetails: ArrayOf_tns2_UnicardSwipeDetail; const key: WideString): ArrayOf_soapenc_string; stdcall;

#9


你试试这样子吧 我不是很确定

procedure TForm1.Button2Click(Sender: TObject);
var
  Iservice: XxtDataSyncServiceImpl;
  B, c, TempLocal: WideString;
  XMLDoc: IXMLDocument;

  UPDateinfo: UnicardSwipeDetail;
  LL: ArrayOf_tns2_UnicardSwipeDetail;
begin
  SetLength(LL,1);
  Iservice := HTTPRIO1 as XxtDataSyncServiceImpl   

  updateinfo := UnicardSwipeDetail.Create
  updateinfo.id := '1'; //充值记录ID
  updateinfo.schoolId := '000001'; //学校ID
  updateinfo.studentId := '1'; //学生ID
  updateinfo.cardNumber := '000001'; //卡号
  updateinfo.swipeType := 1; //刷卡类型
  // updateinfo[I].swipeTime := strtodatetime(formatdatetime('yyyy-mm-dd hh:mm:ss', now));
  updateinfo.swipeAmount := 5; //刷卡金额 全部整形?
  updateinfo.balance := 10; //余额


  LL[0] := updateinfo;

 //向SERVER提交数据
  Iservice.unicardSwipeDetailSyncService(LL, '8117f0657e022053f46895aff1b998e2');
end;

#10


谢谢,楼上的兄弟,我先试试!

#11


非常谢谢 jiap1723 兄的建议,这样写数据就可以传上去了。
但还有小问题,如果多笔:怎么ll 中的10笔数据都  变成最后一次的数据了 ,
  SetLength(ll, 10);
  for i := 0 to 9 do
  begin
    updateinfo := UnicardSwipeDetail.Create;
    updateinfo.id := inttostr(I); //充值记录ID
    updateinfo.schoolId := '000001'; //学校ID
    updateinfo.studentId := '1'; //学生ID
    updateinfo.cardNumber := '000001'; //卡号
      ll[i] := updateinfo;
    updateinfo.Destroy;
  end;

 

#12


你可以让服务端看看 解析后的XML的内容 是否正确  仔细比较ID

你这代码没问题  

#13


是这边写法问题,我调试时可以看的到,当 向updateinfo 中的成员时赋值时,
LL中的前面存放的数据的此字段值也变成此时的赋值

#14


 SetLength(ll, 10);
  for i := 0 to 9 do
  begin
    updateinfo := UnicardSwipeDetail.Create;
    updateinfo.id := inttostr(I); //充值记录ID
    updateinfo.schoolId := '000001'; //学校ID
    updateinfo.studentId := '1'; //学生ID
    updateinfo.cardNumber := '000001'; //卡号
    ll[i] := updateinfo;
  end;

把对象释放去掉看看,应该是这的问题 你的对象添加到数组里 结果又释放掉了。而重新创建的新对象可能启用了内存里的碎片,就是之前的对象地址,所以引起数组里的元素全都只想同一地址。

#15


非常感谢:jiap1723
搞定了。结帐 了!

#1



其实很简单
就是一个tlist和一个类的操作,完全帮你敲了,恐怕你什么也学不到,给你两个链接,稍微看下就懂了
tlist的操作
http://anony3721.blog.163.com/blog/static/511974201082443238978/
类的操作
http://www.cnblogs.com/hi-ilovefeng/archive/2006/06/15/426180.html

另外补充下,delphi没有垃圾回收器,用完后记得要释放

#2


感觉转起来不伦不类的

JAVA服务 起码你要改成DELPHI  其次D也不支持简单对象

DELPHI版本是多少?如果是XE的话还有可能 通过JSON来实现。





#3


引用 2 楼 jiap1723 的回复:
感觉转起来不伦不类的
JAVA服务 起码你要改成DELPHI  其次D也不支持简单对象
DELPHI版本是多少?如果是XE的话还有可能 通过JSON来实现。

刚才还真没注意,最后还有这么一句................那好吧,我路过的说.......
service.unicardSwipeDetailSyncService(unicardSwipeDetails.toArray(new UnicardSwipeDetail[0]), key);

#4


这是调用别个的一个JAVA 写的WEBserver ,这是JAVA的写法, 现在DELPHI中调用参数传不上去 为空:附代码:

procedure TForm1.Button2Click(Sender: TObject);
var
  Iservice: XxtDataSyncServiceImpl;
  B, c, TempLocal: WideString;
  XMLDoc: IXMLDocument;

  UPDateinfo: UnicardSwipeDetail;
  LL: TLIST;
begin

  Iservice := HTTPRIO1 as XxtDataSyncServiceImpl  

  updateinfo := UnicardSwipeDetail.Create
  updateinfo.id := '1'; //充值记录ID
  updateinfo.schoolId := '000001'; //学校ID
  updateinfo.studentId := '1'; //学生ID
  updateinfo.cardNumber := '000001'; //卡号
  updateinfo.swipeType := 1; //刷卡类型
   // updateinfo[I].swipeTime := strtodatetime(formatdatetime('yyyy-mm-dd hh:mm:ss', now));
  updateinfo.swipeAmount := 5; //刷卡金额   全部整形?
  updateinfo.balance := 10; //余额


  ll := tlist.Create();
  ll.Add(updateinfo);

 //向SERVER提交数据
 Iservice.unicardSwipeDetailSyncService(ll[0], '8117f0657e022053f46895aff1b998e2');
  LL.Destroy;


问题是现在数据传到服务端是空。谢谢!

#5


list也不行吧 是个对象 对象传的是内存地址 肯定是错误的

你可以改一下服务端方法 JAVA解析

D端传递时将对象序列化

#6


比如D端 将对象 按找JAVA数组序列化的格式进行转换

或者转换成JSON格式

实在不行自己订一套 简单的

#7


请各位多支支招啊,服务端那边很牛,不改,没办法,郁闷 
这是接口中类的定义:

 UnicardSwipeDetail = class(TRemotable)
  private
    Fbalance: Integer;
    FcardNumber: WideString;
    Fid: WideString;
    FschoolId: WideString;
    FstudentId: WideString;
    FswipeAmount: Integer;
    FswipeTime: TXSDateTime;
    FswipeType: Integer;
  public
    destructor Destroy; override;
  published
    property balance: Integer read Fbalance write Fbalance;
    property cardNumber: WideString read FcardNumber write FcardNumber;
    property id: WideString read Fid write Fid;
    property schoolId: WideString read FschoolId write FschoolId;
    property studentId: WideString read FstudentId write FstudentId;
    property swipeAmount: Integer read FswipeAmount write FswipeAmount;
    property swipeTime: TXSDateTime read FswipeTime write FswipeTime;
    property swipeType: Integer read FswipeType write FswipeType;
  end;
    ArrayOf_tns2_UnicardSwipeDetail = array of UnicardSwipeDetail;

#8


上传调用的方法定义:

  function unicardSwipeDetailSyncService(const unicardSwipeDetails: ArrayOf_tns2_UnicardSwipeDetail; const key: WideString): ArrayOf_soapenc_string; stdcall;

#9


你试试这样子吧 我不是很确定

procedure TForm1.Button2Click(Sender: TObject);
var
  Iservice: XxtDataSyncServiceImpl;
  B, c, TempLocal: WideString;
  XMLDoc: IXMLDocument;

  UPDateinfo: UnicardSwipeDetail;
  LL: ArrayOf_tns2_UnicardSwipeDetail;
begin
  SetLength(LL,1);
  Iservice := HTTPRIO1 as XxtDataSyncServiceImpl   

  updateinfo := UnicardSwipeDetail.Create
  updateinfo.id := '1'; //充值记录ID
  updateinfo.schoolId := '000001'; //学校ID
  updateinfo.studentId := '1'; //学生ID
  updateinfo.cardNumber := '000001'; //卡号
  updateinfo.swipeType := 1; //刷卡类型
  // updateinfo[I].swipeTime := strtodatetime(formatdatetime('yyyy-mm-dd hh:mm:ss', now));
  updateinfo.swipeAmount := 5; //刷卡金额 全部整形?
  updateinfo.balance := 10; //余额


  LL[0] := updateinfo;

 //向SERVER提交数据
  Iservice.unicardSwipeDetailSyncService(LL, '8117f0657e022053f46895aff1b998e2');
end;

#10


谢谢,楼上的兄弟,我先试试!

#11


非常谢谢 jiap1723 兄的建议,这样写数据就可以传上去了。
但还有小问题,如果多笔:怎么ll 中的10笔数据都  变成最后一次的数据了 ,
  SetLength(ll, 10);
  for i := 0 to 9 do
  begin
    updateinfo := UnicardSwipeDetail.Create;
    updateinfo.id := inttostr(I); //充值记录ID
    updateinfo.schoolId := '000001'; //学校ID
    updateinfo.studentId := '1'; //学生ID
    updateinfo.cardNumber := '000001'; //卡号
      ll[i] := updateinfo;
    updateinfo.Destroy;
  end;

 

#12


你可以让服务端看看 解析后的XML的内容 是否正确  仔细比较ID

你这代码没问题  

#13


是这边写法问题,我调试时可以看的到,当 向updateinfo 中的成员时赋值时,
LL中的前面存放的数据的此字段值也变成此时的赋值

#14


 SetLength(ll, 10);
  for i := 0 to 9 do
  begin
    updateinfo := UnicardSwipeDetail.Create;
    updateinfo.id := inttostr(I); //充值记录ID
    updateinfo.schoolId := '000001'; //学校ID
    updateinfo.studentId := '1'; //学生ID
    updateinfo.cardNumber := '000001'; //卡号
    ll[i] := updateinfo;
  end;

把对象释放去掉看看,应该是这的问题 你的对象添加到数组里 结果又释放掉了。而重新创建的新对象可能启用了内存里的碎片,就是之前的对象地址,所以引起数组里的元素全都只想同一地址。

#15


非常感谢:jiap1723
搞定了。结帐 了!