当前位置:主页>仓库管理软件> 列表

那天看到有人说大富翁界面不好看,这里给些直接获取和处理XM 找会计电算化软件下载

销售管理软件版1楼: 因为没什么时间,那天看到了,但没时间回复,我这里提供一个代码片断,是直接获取大
富翁论坛的html页面中的XML数据岛的。大富翁论坛的脚本实际上也是利用这个数据岛再
格式化为现在大家看到的效果的。

我们知道,如果获得了标准的XML数据,那么我们可以使用XSL来将它格式化为任意华丽的
显示布局。我下面的代码直接利用TWebBrowser控件+HTMLDocument,这不是个好方法,但
作为演示应该也可以了。

1)在 WebBrowser 的 OnDocumentComplet 中写:
procedure TForm1.WebBrowserDocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
if Pos(''delphibbs.com'',lowercase(URL))>0 then
GetXML_DataIsland(Sender);
end;
2)写 GetXML_DataIsland 方法:
procedure TForm1.GetXML_DataIsland (Sender: TObject);
var
WB : TWebBrowser;
HTMLDocument2:IHTMLDocument2;
HTMLDocument3:IHTMLDocument3;
XMLElement:IHTMLElement;
sL:TStringList;
begin
WB := TWebBrowser( Sender );
if WB.Document.QueryInterface(IHTMLDocument2,HTMLDocument2)=S_OK then


begin
if (Pos(''delphibbs.com'',lowercase(HTMLDocument2.url))>0)and(lowercase(HTMLDocument2.mimeType)=''html document'') then
begin
if HTMLDocument2.QueryInterface(IHTMLDocument3,HTMLDocument3)=S_OK then
begin
XMLElement:=HTMLDocument3.getElementById(''mainxml'');
if XMLElement<>nil then
begin
sL:=TStringList.Create;
sL.Add(XMLElement.innerHTML);
// 如果你已经有了一个漂亮的XSL,在这里插入到XML数据岛去:<?xml-stylesheet type="text/xsl" href="dfwXsl.xsl"?>
// 如果你没有自己设计出漂亮的XSL,那只能看到XML数据了
// ......
sL.SaveToFile(ExtractFilePath(Application.ExeName)+''dfwXml.xml'');
WB.Navigate(ExtractFilePath(Application.ExeName)+''dfwXml.xml'');
sL.Free;
end;
end;
end;
end;
end;

这里用到的TWebBrowser在控件板Internet页,IHTMLDocument接口,需要自己利用IDE导入
C:\WINDOWS\system32\MSHTML.TLB类型库。这样的做法有二个缺点,一是必须在Browser加

载完成后才能提取,二是没有减少大富翁服务器的实际流量,所以只是一个演示,供参考。

2楼: 支持。不错的东西。
大家以后可以用可执行程序来浏览大富翁了。
哈哈 不用 IE 如会计电算化软件下载

3楼: 收藏
老富翁要记得这里的小兄弟们,多回来看看啊

4楼: 好东西,
当然要收藏了

5楼: 看看,小雨哥还真是涉足广泛。

6楼: 好象是我说的大富翁界面难看.....

销售管理软件版7楼: 呵呵,不管是谁说的都无关紧要,关键是大富翁论坛的源代码和规范提供了一种超前的形式,
我也只是说明对于其他任何类型的论坛来说,这种形式为“真实”地显示数据提供的便利。
所以,不需要抱怨,只要理解了大富翁论坛回送的数据中,已经为日益不能满足的要求提供
了超前的数据服务就可以了。

下面我再贴一些代码,方便大家直接在内存中把XML合成为HTML,从而不必利用IE来合成:

uses
msxml, // 需要的 XML 接口
ComObj; // 用于创建对象实例的声明
// 创建 COM 对象实例
function CreateCoClassObject(ClsID:TGUID;IID:TGUID;out Obj):Boolean;
var
Unknown:IUnknown;
begin
Unknown := CreateCOMObject(ClsID);
if Unknown.QueryInterface(IID,Obj)=S_OK then
Result:=True
else
Result:=False;
end;

function OnParseErrorMessage(ErrorObj:IXMLDOMParseError):string;
begin
Result:=''文件:''+ErrorObj.url+#$13#$10+
''错误:''+ErrorObj.Reason+#$13#$10+
''代码:''+ErrorObj.srcText;
end;

// 从输入的 XML 文本获得 IXMLDOMDocument
function LoadToXMLDocument(S:WideString;Verify:Boolean;var Msg:string):IXMLDOMDocument;
var
DOMErrorObj:IXMLDOMParseError;
begin
if CreateCoClassObject(CLASS_DOMDocument,IXMLDOMDocument,Result) then
begin
Result.loadXML(S);
if Verify then
begin
Result.ValidateOnParse:=True;
DOMErrorObj:=Result.ParseError;
if DOMErrorObj.Reason<>'''' then
begin
Msg:=OnParseErrorMessage(DOMErrorObj);
Result:=nil;
end;
end;
end;
end;

function GetDOMNodeFromDOMDocumen(DOMDocumen:IXMLDOMDocument):IXMLDOMNode;


begin
assert(DOMDocumen<>nil,''Invalid IXMLDOMDocument'');
Result:=DOMDocumen as IXMLDOMNode;
end;

// 翻译成标准的 HTML 格式
procedure TransformXMLToHTMLUsesXSL(XML,XSL:string;var HTML:string);
var
XMLDOMDocument:IXMLDOMDocument;
XSLDOMDocument:IXMLDOMDocument;

XMLError:string;
XSLError:string;
begin
try
XMLDOMDocument:=LoadToXMLDocument(XML,True,XMLError);
if XMLDOMDocument=nil then ShowMessage(XMLError); // 这里应该改变为你的消息输出

XSLDOMDocument:=LoadToXMLDocument(XSL,True,XSLError);
if XSLDOMDocument=nil then ShowMessage(XSLError); // 这里应该改变为你的消息输出

if (XMLDOMDocument<>nil)and(XSLDOMDocument<>nil)then
HTML:=GetDOMNodeFromDOMDocumen(XMLDOMDocument).TransformNode
(GetDOMNodeFromDOMDocumen(XSLDOMDocument));
finally
XMLDOMDocument:=nil;
XSLDOMDocument:=nil;
end;
end;

这个片断直接使用了XML接口,这个接口已经在Delphi7中存在,文件名是msXML.pas,大家
应该经很熟悉了。我在代码里直接使用了这些接口,Delphi中则定义了一个TXMLDocument对
象来实现。为完成HTML格式化,我们需要创建2个IXMLDOMDocument接口实例,分别装入XML
文本和XSL文本,然后我们就可以利用IXMLDOMNode的TransformNode方法来完成HTML的格式
化输出。当然,如果你不想把它翻译成HTML,只要改变XSL的内容,也可以翻译成其他任何
形式。都是片断代码,如果有错误,请各位多多批评。

8楼: 上面所显示的代码已经获得了IHTMLDocument2接口,并且也已经可以在内存合成HTML格式了
,那么我们进一步可以直接在内存中把这个HTML格式写入TWebBrowser,而不需要任何临时
文件。以下代码显示了获得 IHTMLDocument2 接口后,直接写入TWebBrowser的基本操作:

// 创建并填充 SafeArray
function TextConversionToSafeArray(var Text:WideString): PSafeArray;
var
P:Pointer;
begin
Result:=SafeArrayCreateVector(VT_VARIANT, 0, 1);
if SafeArrayAccessData(Result,P)=S_OK then // 获得 SafeArray.pvData 指针
begin
PVariantArg(P)^.vt:=VT_BSTR;
PVariantArg(P)^.bstrVal:=PWideChar(Text);
if SafeArrayUnaccessData(Result)<>S_OK then
SafeArrayDestroy(Result);
end else SafeArrayDestroy(Result);
end;

// 把内存中的 HTML 直接写入 WebBrowser 的 IHTMLDocument2 实例
procedure HTMLWriteToDocument(Document:IHTMLDocument2;Str:WideString);
var
HtmlStr:WideString;
pArrStr:PSafeArray;
begin
assert(Document<>nil,''Invalid IHTMLDocument2'');
HtmlStr:=Copy(Str,1,Length(Str))+#0;
pArrStr:=TextConversionToSafeArray(HtmlStr);
if pArrStr<>nil then
try Document.Write(pArrStr);
SafeArrayDestroy(pArrStr);
except
end;
end;

9楼: 另外还有一个部分是直接对运行中的其他浏览器实例的IHTMLDocument2进行写入,以后有机
会再说吧。谢谢大家的关注,特别是谢谢提出“大富翁界面不好看”的 benhacker 朋友,
否则也没有这一篇了。呵呵。