Загрузка ini-файла в TTreeView

Материал из DRKB

Загрузка ini-файла в TTreeView[править | править код]

procedure LoadIniToTree(const FName: string; Tree: TTreeView);
var
  LS, LV: TStrings;
  i, j: integer;
  root: TTreeNode;
  n: string;
  p: PString;
begin
  Tree.Items.Clear;  // очищаем дерево
  with TIniFile.Create(FName) do  // пытаемся открыть файл FName
  try
    LS := TStringList.Create;  // список названий секций
    try
      ReadSections(LS);          // читаем все секции в список
      LV := TStringList.Create;   // список пар "имя=значение"
      try
        for i := 0 to LS.Count-1 do   // для всех секций...
        begin
          LV.Clear;                   // подготовим список
          ReadSectionValues(LS[i], LV);  // читаем список пар "имя=значение" для текущей секции
          root := Tree.Items.Add(nil, LS[i]); // добавляем корневой узел (имя текущей секции)
          for j := 0 to LV.Count-1 do    // для всех пар "имя=значение"...
          begin
           n := LV.Names[j];  // выделяем "имя"

           // добавляем дочерний по отношению к root узел,
           // в качестве текста исп. "имя"
           // в качестве значения поля Data = "значение"
           New(p);
           p^ := LV.Values[n];
           Tree.Items.AddChildObject(root, n, p);
          end;
        end;
      finally
        LV.Free;
      end;
    finally
      LS.Free;
    end;
  finally
    Free;  // корректно уничтожаем объект TIniFile
  end;
end;

// Применение:

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  if (TreeView1.Selected <> nil) and (TreeView1.Selected.Parent <> nil) then
  begin
    Edit1.Text := TreeView1.Selected.Text;
    Edit2.Text := String(TreeView1.Selected.Data^);
  end else
  begin
    Edit1.Text := '';
    Edit2.Text := '';
  end;
end;

// После использования не забыть освободить память, напр. так:
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
  if Node.Data <> nil then
    Dispose(PString(Node.Data));
end;


Author: Dynamic
ID: 00636