Microsoft XML Core Services (MSXML) を使用して、Paradox 11.0.0.676 で XML ドキュメントを解析および作成しています。
oleAuto オブジェクトの特定のメソッドを呼び出すと、endMethod ステートメントに到達したときに Paradox がクラッシュします (コードはボタンの pushButton イベントにあります)。その結果、問題は oleAuto 変数の「解放」にある可能性があるという結論に達しました。だから私は変数宣言をフォームに入れました。コードをデバッグすると、GPF はボタンの endMethod に表示されなくなりますが、プログラムを終了するときに引き続き発生します。したがって、問題は変数を解放するところにあるというのは正しいかもしれません。OLE オブジェクトの明示的な close() 命令は、問題を解決しません。誰でもアイデアを得ましたか?私は本当にMSXMLが機能する必要があります.
ここにコードとxmlファイルがあります。コードは、xml-schema に対して xml-file のノードを検証します。(コードと xml ファイルは Microsoft msxml リファレンスからのもので、わずかに変更され、もちろん objectpal に適用されます):
ValidateNode.xml
<?xml version="1.0"?>
<x:books xmlns:x="urn:books">
<book id="bk001">
<author>Hightower, Kim</author>
<title>The First Book</title>
<genre>Fiction</genre>
<price>44.95</price>
<pub_date>2000-10-01</pub_date>
<review>An amazing story of nothing.</review>
</book>
<book id="bk003">
<author>Nagata, Suanne</author>
<title>Becoming Somebody</title>
<genre>Biography</genre>
<review>A masterpiece of the fine art of gossiping.</review>
</book>
</x:books>
ValidateNode.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="urn:books"
xmlns:bks="urn:books">
<xsd:element name="books" type="bks:BooksForm"/>
<xsd:complexType name="BooksForm">
<xsd:sequence>
<xsd:element name="book"
type="bks:BookForm"
minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="BookForm">
<xsd:sequence>
<xsd:element name="author" type="xsd:string"/>
<xsd:element name="title" type="xsd:string"/>
<xsd:element name="genre" type="xsd:string"/>
<xsd:element name="price" type="xsd:float" />
<xsd:element name="pub_date" type="xsd:date" />
<xsd:element name="review" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
ObjectPal-Code : ボタンが 1 つだけ付いた Paradox-Form。これは、pushButton イベントのコードです (クイック & ダーティー コード :-))。コードは正常に機能します。要素が有効でない理由の詳細を伝えるメッセージボックスに要素が表示されます。コードをデバッグすると、endMethod ステートメントに到達したときに Paradox がクラッシュします。OSはWindows 7 64 Bit、ParadoxはVersion 11.0.0.676です。
method pushButton(var eventInfo Event)
var
xd, xs, er, nlist, node oleAuto
err oleAuto
endVar
if NOT xd.open("Msxml2.DOMDocument.6.0") then
msgStop("Error", "Error")
return
endIf
if NOT xs.open("Msxml2.XMLSchemaCache.6.0") then
msgStop("Error", "Error")
return
endIf
xs.add("urn:books", "C:\\LZE\\MSXML\\validateNode.xsd")
try
xd^schemas = xs
xd^async = false
xd^validateOnParse = false
xd^load("C:\\LZE\\MSXML\\validateNode.xml")
err = xd^validate()
nList = xd^selectNodes("//book")
node = nList^item(1)
msgInfo("", node.xml)
err = xd^validateNode(node)
msgInfo("", err.reason)
onFail
msgStop("!!!", "!!!")
endTry
try
if xd.isAssigned() then
xd.close()
endIf
if xs.isAssigned() then
xs.close()
endIf
if nList.isAssigned() then
nList.close()
endIf
if err.isAssigned() then
err.close()
endIf
onFail
msgStop("!!!", "!!!")
endTry