2014-09-25 49 views
-2

如何打開/加載數據從xml文件到delphi的tcxgrid?如何打開/加載數據從xml文件到delphi的tcxgrid?

+0

Delphi附帶一個XML Mapper工具,您可以使用它將XML轉換爲TClientDataSet可以使用的格式。然後,使用TXmlTransformProvider作爲CDS的輸入,CDS通過DataSource將數據提供給cxGrid。 OLH詳細解釋了這一點。 – MartynA 2014-09-25 15:46:25

+1

StackOverflow是一個困難的社區。爲什麼人們如此迅速地投降(特別是初學者),而不是幫助改善問題? – Ampere 2014-09-25 20:50:51

+0

@達格 - 改善你的問題,否則他們會關閉它。顯示您擁有的代碼並顯示問題。 – Ampere 2014-09-25 20:52:59

回答

1

那麼我們走吧。首先你沒有提供任何XML數據所以我用這個:

<?xml version="1.0"?> 
<Tests> 
    <Test TestId="0001" TestType="CMD"> 
    <Name>Convert number to string</Name> 
    <CommandLine>Examp1.EXE</CommandLine> 
    <Input>1</Input> 
    <Output>One</Output> 
    </Test> 
    <Test TestId="0002" TestType="CMD"> 
    <Name>Find succeeding characters</Name> 
    <CommandLine>Examp2.EXE</CommandLine> 
    <Input>abc</Input> 
    <Output>def</Output> 
    </Test> 
    <Test TestId="0003" TestType="GUI"> 
    <Name>Convert multiple numbers to strings</Name> 
    <CommandLine>Examp2.EXE /Verbose</CommandLine> 
    <Input>123</Input> 
    <Output>One Two Three</Output> 
    </Test> 
    <Test TestId="0004" TestType="GUI"> 
    <Name>Find correlated key</Name> 
    <CommandLine>Examp3.EXE</CommandLine> 
    <Input>a1</Input> 
    <Output>b1</Output> 
    </Test> 
    <Test TestId="0005" TestType="GUI"> 
    <Name>Count characters</Name> 
    <CommandLine>FinalExamp.EXE</CommandLine> 
    <Input>This is a test</Input> 
    <Output>14</Output> 
    </Test> 
    <Test TestId="0006" TestType="GUI"> 
    <Name>Another Test</Name> 
    <CommandLine>Examp2.EXE</CommandLine> 
    <Input>Test Input</Input> 
    <Output>10</Output> 
    </Test> 
</Tests> 

臨屋的數據名稱的test.xml

我用一個屬性來獲取下與EXEFILE一起保存名稱:

property XMLFileName: String read GetXMLFileName; 

和實現:

function TForm8.GetXMLFileName: String; 
begin 
    Result := ExtractFilePath(Application.ExeName) + 'test.xml'; 
end; 

然後我的東西到XML文件轉換爲數據集:

procedure TForm8.DomToDataset(XMLNode: IXMLNode; Dataset: TDataset); 
var 
    AttrNode: IXMLNode; 

    procedure CreateFields; 
    var 
    StringField: TStringField; 
    i: Integer; 
    ChildNode: IXMLNode; 
    begin 
    for i := 0 to AttrNode.ChildNodes.Count - 1 do 
    begin 
     ChildNode := AttrNode.ChildNodes.Get(i); 
     StringField := TStringField.Create(Dataset); 
     StringField.Size := 50; 
     StringField.FieldName := ChildNode.NodeName; 
     StringField.DisplayLabel := ChildNode.NodeName; 
     StringField.Dataset := Dataset; 
     StringField.Name := 'StringField' + IntToStr(Dataset.Fields.Count + 1); 
    end; 
    end; 

var 
    i, J: Integer; 
begin 
    Dataset.Close; 
    Dataset.Fields.Clear; 

    for i := 0 to XMLNode.ChildNodes.Count - 1 do 
    begin 
    AttrNode := XMLNode.ChildNodes.Get(i); 

    if Dataset.Fields.Count = 0 then 
     CreateFields; 

    Dataset.Open; 

    Dataset.Append; 
    try 
     for J := 0 to AttrNode.ChildNodes.Count - 1 do 
     Dataset.Fields[J].Value := AttrNode.ChildNodes.Get(J).NodeValue; 

     Dataset.Post; 
    except 
     Dataset.Cancel; 
    end; 
    end; 
end; 

這是遠遠不能perfrect,但它給你的照片。最後我們需要將它們結合在一起:

procedure TForm8.FillGrid; 
var 
    XMLDocument: TXMLDocument; 
    i: Integer; 
begin 
    XMLDocument := TXMLDocument.Create(nil); 
    XMLDocument.LoadFromFile(XMLFileName); 
    XMLDocument.Active := True; 

    DomToDataset(XMLDocument.DocumentElement, dxMemData1); 
    FreeAndNil(XMLDocument); 
    dxMemData1.Active := True; 

    cxGrid1DBTableView1.DataController.CreateAllItems; 
    for i := 0 to cxGrid1DBTableView1.ColumnCount - 1 do 
    cxGrid1DBTableView1.Columns[i].ApplyBestFit(); 
end; 

這是一個好的開始。由於我沒有你的信息,我無法接近。希望你接受我的回答。

+0

非常感謝您的回答,幫助了很多人。非常感激。 – Sharpie 2014-10-03 13:09:07