问题描述
大家好,提前致谢。
我使用 delphi xe2 和 unigui 创建了一个 Web 应用程序。在我的应用程序中,我使用 Highcharts for delphi(THTMLCharts) 和 UniGui 显示图表。在显示图表时,这是原始过程:
- 整理要显示的字段和值。
- 提供字段和值的 highchart(THTMLCharts) 对象。
- 重新创建图表。重新创建系列和向下钻取值。
- 重新绘制图表。
该进程每 10 秒在计时器中执行一次,以更新显示的图表。我们注意到,如果用户不断看到页面每 10 秒刷新一次以更新图表,这将是一个过程,并且对用户不友好。增加计时器的间隔并不是一件好事,因为用户至少应该立即看到最新的更新,而无需单击任何刷新按钮。 Web 应用程序就像某种仪表板,它始终处于打开状态,并且在更新图表时应保持在同一页面上。
所以我在网上搜索了如何更新 delphi 的 highchart 对象中的图表数据。请注意,用于 highchart 的 delphi 对象没有仅更新值的选项,而是需要重新绘制。我们在网上找到了“setData”javascript 函数的 highchart 站点,最初它正在运行。 javascript 通过 Unisession.AddJS 传递。
请注意,在 delphi unigui 中,术语“框架”是网页。
这里的问题是,它仅适用于图表的初始加载,但是,当重新加载框架时,假设我们将视图切换到不同的框架,然后返回到图表(然后将重新绘制图表) ,无论是通过源代码(delphi)还是在浏览器的控制台中,setData 函数都不再起作用。
有没有人知道为什么会发生这种情况?我们无法完全刷新页面,因为这只会将所有内容都放回到最开始的页面,即登录页面。
下面是我用来编写 setData 函数的代码以及它是如何传递给显示的
procedure TGraPHPageFrame.SetDataPass(chrt: THTMLFrameChart; nChartIndex : Integer; isDrillDown: Boolean; isNewData: Boolean = False);
var
oSeriesOtherInfos : TSeriesOtherInfos;
srsCount : integer;
srsVal : TSeriesValues;
drilldownVal : TItemSeriesValues;
extn_datas: TlkJSONlist;
extn_data: TlkJSONobject;
extn_names : TStringList;
y,z,ndx: Integer;
nTot : Double;
sJSCommand,sJSCommand_drilldown,sChartIndex,sChartDatas,sDrillDownName : string;
begin
sChartIndex := IntToStr(nChartIndex);
extn_datas := TlkJSONlist.Create;
extn_names := TStringList.Create;
extn_names.OwnsObjects := True;
try
try
srsVal := chrt.Series.Items[0].Values;
srsCount := srsVal.count;
for y := 0 to srsCount - 1 do
begin
ndx := extn_names.IndexOf(srsVal.Items[y].Title);
sDrillDownName := 'DrillDown_'+ srsval.Items[y].Title;
if ndx < 0 then
begin
extn_data := TlkJSONobject.Create;
extn_data.Add('name',srsVal.Items[y].Title);
oSeriesOtherInfos := TSeriesOtherInfos.Create;
oSeriesOtherInfos.nIndex := extn_names.Count;
extn_names.Addobject(srsVal.Items[y].Title,oSeriesOtherInfos);
end
else
begin
oSeriesOtherInfos := TSeriesOtherInfos(extn_names.Objects[ndx]);
extn_data := TlkJSONobject(extn_datas.Child[oSeriesOtherInfos.nIndex]);
end;
nTot := 0;
if isDrillDown then
begin
for z := 0 to srsVal.Items[y].drilldown.Items[0].Values.Count - 1 do
begin
drilldownVal := srsval.Items[y].drilldown.Items[0].Values.Items[z];
nTot := nTot + drilldownVal.Value;
end;
end
else
begin
nTot := srsVal.Items[y].Value;
end;
if ndx < 0 then
begin
extn_data.Add('y',nTot);
if isDrillDown then
extn_data.Add('drilldown',sDrillDownName);
extn_datas.Add(extn_data);
end
else
begin
extn_data.Field['y'].Value := nTot;
end;
end;
sChartDatas := TlkJSON.GenerateText(extn_datas);
sChartDatas := StringReplace(sChartDatas,'"name"','name',[rfReplaceAll]);
sChartDatas := StringReplace(sChartDatas,'"y"','y','"drilldown"','drilldown',[rfReplaceAll]);
sJSCommand := 'Highcharts.charts['+ sChartIndex +'].series[0].setData('+sChartDatas+',false,true,true);';
UniSession.AddJS(sJSCommand);
if isDrillDown then
begin
sleep(500);
UniSession.AddJS('Highcharts.charts['+ sChartIndex +'].options.drilldown.series.length = 0;');
Sleep(500);
srsCount := srsVal.count;
for y := 0 to srsCount - 1 do
begin
sDrillDownName := '"DrillDown_'+ srsval.Items[y].Title +'"';
sJSCommand_drilldown := 'Highcharts.charts['+ sChartIndex +'].options.drilldown.series.push('+
'{'+
'type: "bar",'+
'name: "'+ srsval.Items[y].Title +'",'+
'color: "#ef6986",'+
'id: ' + sDrillDownName + ',' +
'showInLegend: true,'+
'dataLabels:{enabled: true,format: "{point.y}"},'+
'tooltip:{animation: true,enabled: true,hideDelay: 500,pointFormat: "{point.y}"},'+
'data:[';
for z := 0 to srsVal.Items[y].drilldown.Items[0].Values.Count - 1 do
begin
drilldownVal := srsval.Items[y].drilldown.Items[0].Values.Items[z];
sJSCommand_drilldown := sJSCommand_drilldown +
'["'+ drilldownVal.Title +'",'+ FloatToStr(drilldownVal.Value) +'],';
end;
sJSCommand_drilldown := copy(sJSCommand_drilldown,1,Length(sJSCommand_drilldown) - 1);
sJSCommand_drilldown := sJSCommand_drilldown +
']' + '}' + ');';
UniSession.AddJS(sJSCommand_drilldown);
Sleep(100);
end;
end;
except
on E:Exception do
begin
ShowMessage('SetDataPass::Exception = ' + e.Message);
end;
end;
finally
FreeAndNil(extn_names);
FreeAndNil(extn_datas);
end;
end;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)