Delphi、HighCharts 和 UniGui setData 不适用于重新创建的框架

问题描述

大家好,提前致谢。

我使用 delphi xe2 和 unigui 创建了一个 Web 应用程序。在我的应用程序中,我使用 Highcharts for delphi(THTMLCharts) 和 UniGui 显示图表。在显示图表时,这是原始过程:

  1. 整理要显示的字段和值。
  2. 提供字段和值的 highchart(THTMLCharts) 对象。
  3. 重新创建图表。重新创建系列和向下钻取值。
  4. 重新绘制图表。

该进程每 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 (将#修改为@)