js调用本地程序exe (2018-01-25 17:14:50)转载▼
分类: javascript/css
onPrintAction: function () {
        var me = this;
        this.ajaxPost(“PayMoney/printPayMoneyList.do”, {“moneyno”:(this.form.findField(“moneyno”)?this.form.findField(“moneyno”).getValue():this.form.findField(“payno”).getValue())},
            function (r) {
                me.printweb(r);
            }, function (e) {
                me.msgError(e);
            });
        return;
    }
printweb:function(r){
        var me = this;
        $.ajax({
            type:”get”,
            url:”http://127.0.0.1:"+window.printport+"?url="+r.url+"&modelfilename="+r.modelfilename+"&datafilename="+r.datafilename+
            “&FCanPreview=”+r.canpreview+”&FCanPrint=”+r.canprint+”&FCanExport=”+r.canexport+”&FReportName=”+encodeURI(r.reportname)+
            ‘&r=’+(new Date()),
            dataType:”jsonp”,
            jsonpCallback:”jsonpCallback”,
            success:function(r){
            },
            error:function(e){
                me.msgConfirm(“打印出现问题,可能原因如下:
“+
                    “1.没有安装打印组件。点击“确定”后下载打印组件并安装;如果已下载,直接安装
“+
                    “2.打印组件没有启动。
“+
                    “3.打印组件和服务器端口设置相同,并且没有被占用。
“,
                    function(c){
                        if (c == “yes”) {
                            window.open(“toyorReport/PrintServiceSetUp.zip”)
                        }
                    }) ;
            }
        });
    },
delphi部分:
procedure TfmPrintServiceTykj.actionPortExecute(Sender: TObject);
var
  fmport: TfmPort;
begin
  with fmport do
  try
    fmport := TfmPort.Create(Application);
    fmport.sedtPort.Text := IntToStr(Fport);
    with fmport do
      if ShowModal = mrOk then
      begin
        StartPrintService(StrToInt(sedtPort.Text));
        Fport := StrToInt(fmport.sedtPort.Text);
        lblPort.Caption := IntToStr(FPort);
      end;
  finally
    FreeAndNil(fmport);
  end;
end;
procedure TfmPrintServiceTykj.idhtpsrvr1CommandGet(AThread: TIdPeerThread; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  sRequestInfo: string;
  slParam: TStrings;
  url, modelfilename, datafilename: string;
begin
  sRequestInfo := ARequestInfo.Document;
  slParam := ARequestInfo.Params;
  if (slParam.Text = ‘’) then
  begin
    AResponseInfo.ContentText := ‘jsonpCallback(“打印参数不正确”)’;
    Exit;
  end;
  url := slParam.Values[‘url’];
  if (Trim(url) = ‘’) then
  begin
    AResponseInfo.ContentText := ‘jsonpCallback(“打印参数url不正确”)’;
    Exit;
  end;
  modelfilename := slParam.Values[‘modelfilename’];
  if (Trim(modelfilename) = ‘’) then
  begin
    AResponseInfo.ContentText := ‘jsonpCallback(“打印参数modelfilename不正确”)’;
    Exit;
  end;
  datafilename := slParam.Values[‘datafilename’];
  if (Trim(datafilename) = ‘’) then
  begin
    AResponseInfo.ContentText := ‘jsonpCallback(“打印参数datafilename不正确”)’;
    Exit;
  end;
  FReportName := Utf8ToAnsi(slParam.Values[‘FReportName’]);
  FCanExport := slParam.Values[‘FCanExport’];
  FCanPrint := slParam.Values[‘FCanPrint’];
  FCanPreview := slParam.Values[‘FCanPreview’];
  AResponseInfo.ContentType := ‘text/html;Charset=UTF-8’;
  AResponseInfo.ResponseNo := 200;
  AResponseInfo.ContentText := ‘jsonpCallback(“Ok:’ + FormatDateTime(‘yyyy-MM-dd HH:mm:ss’, Now) + ‘“)’;
  FBaseUrl := url;
  //测试时使用同一个文件,就不删除了
  if (modelfilename <> FModelFileName) and (FDataFileName <> datafilename) then
    DelServerReportTempFile;
  FModelFileName := modelfilename;
  FDataFileName := datafilename;
  {Application.Restore;
  SetWindowPos(handle,HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);//更改窗口zorder 使之最上  SetWindowPos(x,HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);//还原
  SetForegroundWindow(handle);
  }
  CoolTrayIcon1.ShowMainForm;
  timDownDelay.Enabled := true;
end;
procedure TfmPrintServiceTykj.ApplicationEvents1Exception(Sender: TObject; E: Exception);
var
  msg: string;
begin
  msg := LowerCase(E.Message);
  if (Pos(‘socket error’, msg) > 0) then
  begin
    Application.Messagebox(‘端口被占用!’, ‘提示’, MB_OK + MB_ICONWARNING);
    Exit;
  end;
  if (Pos(‘address and port are already in use’, msg) > 0) then
  begin
    Application.Messagebox(‘端口已经打开!’, ‘提示’, MB_OK + MB_ICONWARNING);
    Exit;
  end;
end;
procedure TfmPrintServiceTykj.ReadIniFile;
var
  MyINIFile: TIniFile;
  MyFileName: string;
begin
  MyFileName := ExtractFilePath(ParamStr(0)) + ChangeFileExt(ExtractFileName(Application.ExeName), ‘’) + ‘.ini’;
  MyINIFile := TIniFile.Create(MyFileName);
  try
    Fport := MyINIFile.ReadInteger(‘端口设置’, ‘port’, 8090);
    lblPort.Caption := intToStr(Fport);
  finally
    FreeAndNil(MyINIFile);
  end;
end;
procedure TfmPrintServiceTykj.FormCreate(Sender: TObject);
begin
  btnPreview.Enabled := False;
  btnPrint.Enabled := False;
  btnExport.Enabled := False;
  ReadIniFile;
  SetAutoRun(True);
  StartPrintService(FPort);
end;
procedure TfmPrintServiceTykj.StartPrintService(port: integer);
begin
{idhtpsrvr1.DefaultPort := StrToInt(edtPort.Text);
       idhtpsrvr1.Active:=True;}
  idhtpsrvr1.Active := False;
       //idhtpsrvr1.ReuseSocket := true;
  idhtpsrvr1.Bindings.Clear;
  idhtpsrvr1.Bindings.Add.Port := port;
       //Binding.IP := getLocalIp;
  idhtpsrvr1.Active := true;
end;
procedure TfmPrintServiceTykj.ShowWindow1Click(Sender: TObject);
begin
  CoolTrayIcon1.ShowMainForm;
end;
procedure TfmPrintServiceTykj.HideWindow1Click(Sender: TObject);
begin
  CoolTrayIcon1.HideMainForm;
end;
procedure TfmPrintServiceTykj.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  btnPreview.Enabled := False;
  btnPrint.Enabled := False;
  btnExport.Enabled := False;
  lblLoadModelInfo.Caption := ‘没有数据信息’;
  lblLoadDataInfo.Caption := ‘没有数据信息’;
  lblReportTitle.Caption := ‘未命名报表’;
  Refresh;
  CanClose := false;
  if not CanClose then
  begin
    CoolTrayIcon1.HideMainForm;
    CoolTrayIcon1.IconVisible := True;
  end;
  DelServerReportTempFile();
end;
procedure TfmPrintServiceTykj.actionCloseExecute(Sender: TObject);
begin
  Application.Terminate;
end;
procedure TfmPrintServiceTykj.N2Click(Sender: TObject);
begin
  Application.MessageBox(Pchar(‘报表打印组件客户端      ‘ + #10#13#10#13 + ‘最后更新:2018-01-20’), ‘关于’, MB_OK + MB_ICONINFORMATION);
end;
procedure TfmPrintServiceTykj.DelServerReportTempFile;
begin
  if (FDataFileName = ‘’) or (FModelFileName = ‘’) then
    Exit;
  try
    IdHTTP1.HandleRedirects := False; //允许头转向
    IdHTTP1.ReadTimeout := 5000; //请求超时设置
    IdHTTP1.HandleRedirects := True; //支持重定向
    IdHTTP1.Request.CacheControl := ‘no-cache’; //不缓存
    IdHTTP1.Request.AcceptEncoding := ‘’; // ‘gzip, deflatee’; 压缩格式,如果不需要,就置空
    IdHTTP1.HTTPOptions := IdHTTP1.HTTPOptions + [hoKeepOrigProtocol]; //设置协议
    IdHTTP1.ProtocolVersion := pv1_1;
    IdHTTP1.Request.Connection := ‘Keep-Alive’;
  //IdHTTP1.Request.ContentType := ‘application/json’; //设置内容类型为json
    IdHTTP1.Get(FBaseUrl + FBaseVDirName + ‘BaseList/delTempReportFile.do?datafilename=’ + FDataFileName + ‘&modelfilename=’ + FModelFileName); //用MEMO控件接收POST后的数据返回
  except
  end;
end;
procedure TfmPrintServiceTykj.SetAutoRun(isAutoStart: boolean);
var
  Reg: TRegistry;       //首先定义一个TRegistry类型的变量Reg
begin
  Reg := TRegistry.Create;
  try                           //创建一个新键
    try
      Reg.RootKey := HKEY_CURRENT_USER;     //将根键设置为HKEY_LOCAL_MACHINE
      Reg.OpenKey(‘Software\Microsoft\Windows\CurrentVersion\Run’, true); //打开一个键
      if isAutoStart then
      begin
        Reg.WriteString(‘printservicetykj’, ExpandFileName(ParamStr(0)));           //在Reg这个键中写入数据名称和数据数值
       // ShowMessage(‘注册成功!’);
      end
      else
      begin
        Reg.DeleteValue(‘printservicetykj’);
        //ShowMessage(‘删除成功!’)
      end;
      Reg.CloseKey;       //关闭键
    except
    end;
  finally
    Reg.Free;
  end;
end;
分享:
