当前位置:首页 > Windows程序 > 正文

Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示

2023-05-23 Windows程序

Delphi 读取 c# webservice XML的base64编码图片字符串转化图片并显示 在 开发中遇到应用c#及asp.net的在的webservice 保存图片并以xml文件形式现实出来 并用delphi调用 的方法: 1.c#的webservice现实见 http:// 之前的文章。 2.在客户端用delphi显示 发现asp.net xml形式输出的图片是base64字符串形式。用delphi解析很困难 所以这里我先用c#解析读取图片并显示 然后在用delphi显示主要看看显示的xml图片是否可以显示。 c#的代码是: private void button1_Click(object sender, System.EventArgs e) { long len; byte[] byt = new byte[] { 0x00 }; //string base64String=Convert.ToBase64String(this.textBox1.Text); byt=Convert.FromBase64String(this.textBox1.Text); string str = System.Text.Encoding.Default.GetString( byt ); System.IO.MemoryStream ms=new System.IO.MemoryStream(); ms.Write(byt, 0, byt.Length) ; ms.Seek(0, System.IO.SeekOrigin.Begin) ; len=ms.Length; pictureBox1.Image = Image.FromStream(ms) ; } 图片显示没有问题!这就证明啦asp.net webservice 以XML字符串显示图片没有问题 ,只要delphi的 算法正确就可以。 3.下面用delphi实现说实话我研究啦很长时间终于研究出来啦 结果见: 先引用 EncdDecd单元 EncdDecd单元是delphi自带的 uses EncdDecd var ss:TStringStream; ms:TMemoryStream; JpgFile:TjpegImage ; begin ss:=TStringStream.Create(Memo1.Text); ms:=TMemoryStream.Create; DecodeStream(ss,ms); ms.Position:=0; JpgFile:=TjpegImage.Create ; JpgFile.LoadFromStream(ms); ss.Free; ms.Free; Image1.Picture.Bitmap.Assign(JpgFile); end; 就这样就可以读出c#的webservice 的图片文件

 

delphi读取asp.net webservice 中dataset数据集数据的的方法,并且与dbgrid的绑定

 

delphi读取asp.net webservice 中dataset数据集数据的的方法并且与dbgrid的绑定 delphi 访问c#中webservice 的函数如果不带dataset数据表那么不是很复杂! 如果访问返回表的函数相对就复杂啦些! 下面我讲下如何用delphi访问c#些的webservice函数 1.web端函数为: [WebMethod] public string gettable(int pageIndex , int pageSize , out int recordCount, out int pageCount ,string keyword) { recordCount=0; pageCount=0; DataTable tb=null; DataSet ds=new DataSet(); if (Validate()) { try { a App=new Pa() ; tb=App.gettable( pageIndex , pageSize , out recordCount, out pageCount , keyword ); } catch { } ds.Tables.Add(tb); } //这里不要return ds; 因为delphi识别C#的webservice函数XMl文档很费劲 所以采用下面的方法 System.Text.StringBuilder strbuilder=new System.Text.StringBuilder(); StringWriter writer=new StringWriter(strbuilder); ds.WriteXml(writer,System.Data.XmlWriteMode.IgnoreSchema); return strbuilder.ToString(); } 2.客户端 SOAP定义端 procedure Sev_gettable(const pageIndex: Integer; const pageSize: Integer; const keyword: WideString; out gettableResult: WideString; out recordCount: Integer; out pageCount: Integer); stdcall; //注意这是个过程不是函数 它的返回值是通过OUT输出参数做到的。 soap定义可以通过DELPHI建立 FILE-new-other-webservice -wsdl impoerts建立这个类把这个类文件加载到你的工程里就OK啦 function Sev_gettable(const pageIndex: Integer; const pageSize: Integer; const keyword: WideString,out recordCount: Integer; out pageCount: Integer): WideString; var HTTPRio : THTTPRIO ; Ahttprio: ClientServiceSoap; val: WideString; begin HTTPRio:= THTTPRIO.Create(Application); Try HTTPRio.WSDLLocation:=‘‘http://?wsdl‘‘; Ahttprio := (HTTPRio as Cli entServiceSoap); Ahttprio.gettable( pageIndex, pageSize,keyword,val, recordCount, pageCount) ; Ahttprio:=nil; Pointer(Ahttprio) := nil; soapHeader.Free; finally End; Result:=val; End; 那么通过上面的函数我们可以获得xml数据集文档 下面就对这个文档进行分析与数据的提取 我们建立一个FORM1在上面加入 Tstringlist控件 为什么用 Tstringlist控件不用Tdbgrid能 因为 Tstringlist可以自由的编写行和列 与tdbgrid绑定数据表效果一样 看实现函数 //读取xml数据集到stringlist中 //这个xmlstr参数 就是我们上面函数 Sev_gettable获得asp.ent webservice 返回的数据集 procedure iningrd(strdrg:TStringGrid;xmlstr:string); var fieldval: string; node: IXMLNode; XMLDoc:TXMLDocument; nodeList: IXMLNodeList; nodecount,i,j:integer; begin for i:=0 to strdrg.rowcount-1 do for j:=0 to strdrg.colcount-1 do strdrg.Cells[j,i]:= ‘‘; strdrg.Cells[0,0]:=编号; strdrg.Cells[1,0]:=类型; strdrg.Cells[2,0]:=状态; strdrg.Cells[3,0]:=工号; strdrg.Cells[4,0]:=姓名; strdrg.Cells[5,0]:=电话; strdrg.Cells[6,0]:=所收; strdrg.Cells[7,0]:=姓名; strdrg.Cells[8,0]:=电话; strdrg.Cells[9,0]:=姓名; strdrg.Cells[10,0]:=电话; strdrg.Cells[11,0]:=所属; strdrg.Cells[12,0]:=日期; strdrg.ColWidths[0]:=100; strdrg.ColWidths[1]:=56; strdrg.ColWidths[2]:=62; strdrg.ColWidths[3]:=70; strdrg.ColWidths[4]:=65; strdrg.ColWidths[5]:=100; strdrg.ColWidths[6]:=120; strdrg.ColWidths[7]:=120; strdrg.ColWidths[8]:=120; strdrg.ColWidths[9]:=80; strdrg.ColWidths[10]:=80; strdrg.ColWidths[11]:=120; strdrg.ColWidths[12]:=120; XMLDoc:=TXMLDocument.Create(Application); XMLDoc.XML.Text:=xmlstr; XMLDoc.Active:=true; nodecount:=XMLDoc.DocumentElement.ChildNodes.Count; for i:=0 to nodecount -1 do begin node := XMLDoc.DocumentElement.ChildNodes[i]; nodeList := node.ChildNodes; for j := 0 to nodeList.Count - 1 do begin //fieldval:= nodeList[j].NodeName; if nodeList[j].IsTextElement then begin fieldval := nodeList[j].NodeValue; strdrg.Cells[j,i+1]:=fieldval; end; end; end; end; 这个现实过程是我通过实践测试成功的 !基本方法全部给出只有你稍加改动就可以现实 !遇到错误不要放弃!

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71598.html

Jm-杰米博客Jamie
草根站长的技术交流乐园!IT不会不要紧快来好好学习吧!
  • 20786文章总数
  • 7470990访问次数
  • 建站天数
  • 友情链接