2012-05-11 15 views
-2

XMLファイルをDelphi ListView1に読み込み、[カテゴリ]セクションのxmlファイルで定義された[タグとタグ]ですべての[items and subitems]Delphi - xml - listviewとグループ

私は自分のプログラムに「タグ」システムを持たせようとしているので、似たようなソフトウェアが共通のタグでグループ化されています。リストビューでは不可能な場合は提案を受け取り、他のコンポーネントをVirtualStringTree 、easylistview..etc、私の個人的な使用のためのこのプログラムは、私はこれを達成するための他の例を見ていないので、私は学習の観点から興味があります。その下にリストされているXMLが

ListView1 
TAG1 [Each tag name in the category, this would be a group] 
- New Item 1 <- Category name 
    -Copy of File <- subitem software name 
- bin [This is another category but it has TAG1 so group it with TAG1 items] 
TAG4 [Each tag name in the category, this would be a group] 
- New Item 1 <-this is the same as TAG1, add it to the TAG4 group since its in tags] 
    -Copy of File <- subitem software of category 

ようになっているはずのためのよう

は、ここに私のxmlファイルのサンプルです。

file.xml 
<Category> 
<Category name="New Item 1" Tags="TAG1 TAG4"/> 
<Software name="Copy of File" Tags=""> 
    <PathCache>data\cache\945.ico</PathCache> 
    <PathExe>$Drive\Development\file.exe</PathExe> 
</Software> 
<Category name="bin" Tags="TAG1"> 
<Software name="Copy of File" Tags=""> 
    <PathCache>data\cache\947.ico</PathCache> 
<PathExe>$Drive\Development\file.exe</PathExe> 
</Software> 
<Software name="softwaretitle" Tags=""> 
    <PathCache>data\cache\946.ico</PathCache> 
    <PathExe>$Drive\Development\test.exe</PathExe> 
</Software> 
</Category> 
</Category> 

は、私はあなたがより良いあなたのXMLファイルを整理する必要があり

<Category name="New Item 1"/> 
    <Tags>Tag1 Tag4</tag> 
+1

あなたは何が必要ですか? –

+0

私はdelphi xe2の新機能ですが、必要に応じてxmlファイルを書き直すことができますが、基本的にすべてのCategoryタグ(空白で区切られたもの)をリストビューグループにしてアイテムを追加しようとしていますグループは任意のタグである可能性があるので、動的に追加されなければならず、一致する既存のものを更新する必要があるからである。 – user1389093

+0

私はあなたがここで何を求めているのか分かりません。あなたの質問の最初の部分は、あなたが投稿したXMLとは関係ありません。達成しようとしていることがより明確になるように質問を編集してください。それは、あなたの目標がAFAICTであるかもしれないということの本当の兆候はありません。ありがとう。 :) –

答えて

0

まずに必要に応じて、私は、それを書き換えることができ、タグ=「」XMLファイルのカテゴリーセクションにセクションを追加し、少なくともこの(私はあなたがあなたのXMLをインデントする++メモ帳を使用することをお勧め):

<Categories> 
    <Category name="New Item 1" Tags="TAG1 TAG4"> 
    <Software name="Copy of File" Tags=""> 
     <PathCache>data\cache\945.ico</PathCache> 
     <PathExe>$Drive\Development\file.exe</PathExe> 
    </Software> 
    <Software name="Copy of File" Tags=""> 
     <PathCache>data\cache\945.ico</PathCache> 
     <PathExe>$Drive\Development\file.exe</PathExe> 
    </Software> 
    </Category> 
    <Category name="bin" Tags="TAG1"> 
    <Software name="Copy of File" Tags=""> 
     <PathCache>data\cache\947.ico</PathCache> 
     <PathExe>$Drive\Development\file.exe</PathExe> 
    </Software> 
    <Software name="softwaretitle" Tags=""> 
     <PathCache>data\cache\946.ico</PathCache> 
     <PathExe>$Drive\Development\test.exe</PathExe> 
    </Software> 
    </Category> 
</Categories> 

あなたが正規化されたXMLを取得したら、あなたはあなたの選択、XMLDataBinding(ファイル/新規/その他/ XML/XMLDataBinding)を使用して、Delphiのクラスに変換することができますr Categories.xmlファイル。

XMLをDelphiクラスにマップすると、XMLデータを簡単に歩くことができます。

例(デルファイXE):

type 
    TForm1 = class(TForm) 
    btnPopulate: TButton; 
    lvCategories: TListView; 
    procedure btnPopulateClick(Sender: TObject); 
    private 
    Categories: IXMLCategoriesType; 
    procedure LoadCategories(const FileName: string); 
    procedure PopulateCategoriesList; 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.LoadCategories(const FileName: string); 
var 
    XMLDoc1: TXMLDocument; 
begin 
    if Assigned(Categories) then 
    Exit; 

    XMLDoc1 := TXMLDocument.Create(Self); 
    XMLDoc1.FileName := FileName; 
    XMLDoc1.Active := True; 
    Categories := GetCategories(XMLDoc1); 
end; 

procedure TForm1.PopulateCategoriesList; 
    i, j: Integer; 
    Column: TListColumn; 
    Group: TListGroup; 
    Item: TListItem; 
begin 
    lvCategories.ViewStyle := vsReport; 
    lvCategories.GroupView := True; 
    Column := lvCategories.Columns.Add; 
    Column.Caption := 'Software name'; 
    Column.AutoSize := True; 

    Column := lvCategories.Columns.Add; 
    Column.Caption := 'Exe path'; 
    Column.AutoSize := True; 

    for i := 0 to Categories.Count - 1do 
    begin 
    Group := lvCategories.Groups.Add; 
    Group.Header := Copy(Categories.Category[i].Tags, 1, Pos(' ', Categories.Category[i].Tags) - 1); 
    for j := 0 to Categories.Category[i].Count - 1 do 
    begin 
     Item := lvCategories.Items.Add; 
     Item.Caption := Categories.Category[i].Software[j].Name; 
     Item.GroupID := Group.GroupID; 
     Item.SubItems.Add(Categories.Category[i].Software[j].PathExe) 
    end; 
    end; 
end; 

procedure TForm1.btnPopulateClick(Sender: TObject); 
begin 
    LoadCategories(ExtractFilePath(Application.ExeName) + '..\..\Categories.xml'); 
    PopulateCategoriesList; 
end; 

希望これはあなたを助けます!

+0

私はStackOverflowを初めて使用しているので、誰がどのように、なぜ私の答えに否定的な票を付けたのかを知る方法を教えてくれますか?投票に関連したログがありますか? – jfoliveira

+2

いいえ、誰があなたを落胆させたのか、その理由を知る方法はありません。ダウンボトムを選ぶときに人々が自分自身を説明しないときは、非常に迷惑です。 –

+0

助けてくれてありがとう、私はそれと一緒に働くことができると思う、私はまたstackoverflowに新しく、すでに投票システムがどのように働いているのかわからない。投票で何らかの情報を提供すればいいだろうと私は同意するが、 – user1389093

関連する問題