-
如何用delphi正确释放JSON对象
2026-01-16 22:16:53 2014德国世界杯
我用的是德尔菲里约。
我需要创建一个JSON。我的代码创建了JSON,但是当我释放JSON对象时,我会得到一个AV。
在我的代码中,我注意到AV发生在js.Free中,当我添加以下行时:
代码语言:javascript复制 jaespecs:=GetEspecsFromMedico(fieldbyname('nr').AsInteger);
jstemp.AddPair('especs',jaespecs);我的JSON有以下格式:
代码语言:javascript复制{data:[
{
data_agenda:'23/02/67',
medicos:[
{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]},
{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]}
]
},
{
data_agenda:'23/02/68',
medicos:[
{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]},
{nome:'pedro',espec:'orto',horai:'',horaf:'',especs:[]}
]
}
]
}我的函数可以很好地创建json,除了用("js.Free")释放JSON时的AV。以下是代码:
代码语言:javascript复制function GetJSONPeriodo(datai,dataf: TDatetime;const med:Integer=-1;const espec:Integer=-1): string;
var i:integer;
dia:string;
js,jso,jstemp:TJSonObject;
ja,jatemp,jaespecs:TjsonArray;
vdata:TDatetime;
function GetEspecsFromMedico(med:Integer):TjsonArray;
var qry:TFDQuery;
je:TJsonObject;
begin
je:=TJsonObject.Create;
result:=TjsonArray.Create;
qry:=controller.DM.CreateQuery();
try
with qry do begin
close;
Sql.Clear;
SQl.Add('select A.nr,B.nome,A.nesp from ESP_QUE_MEDICO_TEM A');
if prepared then disconnect;
Open;
First;
while not eof do begin
je.AddPair('nome',TJsonString.create(fieldbyname('nome').AsString));
je.AddPair('nesp',TJsonString.create(fieldbyname('nesp').AsString));
result.AddElement(je);
next;
end;
end;
finally
qry.Free;
end;
end;
begin
vdata:=datai;
js:=TJSonObject.Create;
ja:=TjsonArray.Create;
try
while vdata<=dataf do begin
i:=DayOfWeek(vdata);
dia:= uppercase(formatsettings.ShortDayNames[i]);
with DM.FDQQuery do begin
Close;
SQL.Clear;
SQL.Add('Select B.nr,B.nome,A.hini,A.hfim from HORARIO_ATEND_MEDICO A');
if not prepared then prepare;
parambyname('dia').Value:=dia;
Open;
jso:=TJsonObject.Create;
jso.AddPair('data_agenda',TJSONString.Create(formatdatetime('dd/mm/yyyy',vdata)));
jatemp:=TjsonArray.Create;
while not eof do begin
jstemp:=TJsonObject.Create;
jstemp.AddPair('text',TJSONString.Create(fieldbyname('nome').AsString));
// if I get rid off the next two lines, no AV occur
jaespecs:=GetEspecsFromMedico(fieldbyname('nr').AsInteger);
jstemp.AddPair('especs',jaespecs);
jatemp.AddElement(jstemp);
next;
end;
jso.AddPair('medicos',jatemp);
ja.AddElement(jso);
end;
vdata:=vdata+1;
end;
js.AddPair('data',ja);
result:=js.ToJSON;
finally
js.Free; //I get an AV here
end;
end;
- 最新发表
-
- 后宫剧情介绍
- [原创]其实,一直想说的一个秘密:EDIUS8软件是可以装到其他盘的。
- 中医妙用盐:炒热敷缓解多种不适
- 如何查看无线驱动?,揭秘无线驱动查看方法,轻松掌握驱动状态!,揭秘无线驱动查看技巧,轻松掌握驱动状态,快速查看无线驱动!
- 轻松上手PyCharm:项目导入全攻略,告别繁琐步骤,高效开始编程之旅
- 如何判断一个女孩子是否喜欢你
- ppt截图快捷键ctrl加什么?作者:wanrong发布时间:2021年02月24日 17:53
- 泰隆银行小鱼bank贷款板块建设有特色 但部分业务有地域限制
- win7-64位系统如何调cf烟雾头 win7-64位玩cf烟雾头设置方法
- 如何在Excel中仅对筛选后的可见单元格进行分类汇总?
- 友情链接