![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый, день!!! Ребят подскажите как загрузить XML -файл в StringGrig (но при этом: имя атрибута -заголовок столбца, а знгачение атрибута - запись в поле )??????
|
#2
|
|||
|
|||
![]() Цитата:
Руками, пользуясь TXMLDocument. Пример из реального проекта, для доступа к атрибутам надо пользоваться соотв. свойствами: Код:
procedure TUpdateInfo.Parse(ADoc: IXMLDocument); var I : Integer; ANode : IXMLNode; begin For I := 0 To ADoc.DocumentElement.ChildNodes.Count-1 Do Begin ANode := ADoc.DocumentElement.ChildNodes[i]; If ANode.NodeName = 'VersionNumber' Then Begin VersionNumber.Major := StrToIntDef(ANode.ChildNodes.FindNode('Major').Text,0); VersionNumber.Minor := StrToIntDef(ANode.ChildNodes.FindNode('Minor').Text,0); VersionNumber.Release := StrToIntDef(ANode.ChildNodes.FindNode('Release').Text,0); VersionNumber.Build := StrToIntDef(ANode.ChildNodes.FindNode('Build').Text,0); End; If ANode.NodeName = 'ProgramName' Then Begin FProgramName := ANode.Text; End; If ANode.NodeName = 'ReleaseNotes' Then Begin FReleaseNotes.Text := ANode.Text; End; If ANode.NodeName = 'ModuleFileName' Then Begin FModuleFileName := ANode.Text; End; End; end; procedure TUpdateInfo.LoadFromStrings(AStrings: TStringList); var ADoc : IXMLDocument; begin ADoc := TXMLDocument.Create(Nil); ADoc.XML.Assign(AStrings); ADoc.Active := True; Try Parse(ADoc); Finally ADoc := Nil; End; end; |
#3
|
|||
|
|||
![]() Код:
procedure TForm1.BitBtn1Click(Sender: TObject); var t_StrList:TStringList; i,t_pos:integer; t_Str:String; begin { <COL1 name="COL1">qqq1</COL1> <COL2 name="COL2">qqq2</COL2> <COL3 name="COL3">qqq3</COL3> <COL4 name="COL4">qqq4</COL4> } Self.OpenDialog1.Execute; if Self.OpenDialog1.FileName='' then exit; t_StrList:=TStringList.Create; try t_StrList.LoadFromFile(Self.OpenDialog1.FileName); Self.StringGrid1.ColCount:=t_StrList.Count; Self.StringGrid1.RowCount:=2; For i:=0 to t_StrList.Count-1 do Begin t_Pos:=0; t_Pos:=POS('"',t_StrList[i]); if t_Pos<>0 then Begin t_Str:=copy(t_StrList[i],t_pos+1,length(t_StrList[i])-t_Pos); t_Pos:=POS('"',t_Str); Self.StringGrid1.Cells[i,0]:=copy(t_Str,1,t_pos-1); t_Str:=Copy(t_Str,t_pos+2,length(t_Str)-t_Pos-1); t_Pos:=POS('<',t_Str); Self.StringGrid1.Cells[i,1]:=copy(t_Str,1,t_pos-1); end; End; Finally t_StrList.Free; End; end; Вот работающий примечик. Только не стал заморачиваться с заголовками XML. |
#4
|
|||
|
|||
![]() Imikle здорово! А я даже и не знал этого. Спасибо. А то все ручками,ручками. :-)
|
#5
|
|||
|
|||
![]() Да пожалуйста.
Только обрати внимание - там есть одна хитрость. Переменая для документа объявляется как интерфейс (IXMLDocument), а создается через дельфевую обертку (TXMLDocument). Это задокументироваый обход проблемы автопомирания внутренего объекта. Вычитал на сайте CodeGear. |
#6
|
|||
|
|||
![]() Спасибо, реально помогло
|
#7
|
|||
|
|||
![]() Цитата:
Сегодня тоже пришелся кстати. Спс. |
#8
|
||||
|
||||
![]() Цитата:
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#9
|
|||
|
|||
![]() Да есть такой эффект. Если TXMLDocuemnt создается динамически, а не "бросается" на форму, то тот COM-объект, для которого компонент является оберткой, иногда "умирает" до момента обращения к нему. Наступил на эти грабли сам.
|
#10
|
||||
|
||||
![]() Понятно, у меня такого не наблюдалось, но если помрет буду иметь ввиду. Спасибо.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |