Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Компоненты и Классы , TTreeView

Автор: Dynamic

Перевод контента на русский язык:

Код, который я предоставил, это приложение Delphi, которое загружает файл INI в контроле TTreeView. Файл INI содержит разделы и значения, которые представлены как узлы в дереве просмотра.

Вот подробное описание, как работает код:

  1. Процедура LoadIniToTree принимает два параметра: FName, имя файла INI для загрузки, и Tree, контрол TTreeView, где будет загружена данные.
  2. Процедура очищает дерево просмотра, вызывая Tree.Items.Clear.
  3. Затем она открывает файл INI с помощью TIniFile.Create и пытается прочитать его содержимое. Если это успешно, она создает два объекта TStringList: LS (для имен разделов) и LV (для пар значений).
  4. Процедура проходит по каждому разделу в файле INI, читая список разделов (ReadSections) и создавая новый узел для каждого из них.
  5. Для каждого раздела она читает значения с помощью ReadSectionValues и создает новый дочерний узел для каждого пары значений. Текст узла устанавливается в ключ (имя), а его данные - в значение.

Код также включает два обработчика событий:

  1. TreeView1Change: это обработчик события, который вызывается, когда пользователь выбирает другой узел в дереве просмотра. Он обновляет два редактора (Edit1 и Edit2) текстом и данными выбранного узла.
  2. TreeView1Deletion: это обработчик события, который вызывается, когда пользователь удаляет узел из дерева просмотра. Он освобождает память для данных узла (PString) для свободной памяти.

В целом, этот код предоставляет основу для загрузки файлов INI в контроле TTreeView и обработки событий выбора и удаления узлов.

Некоторые предложения по улучшению:

  • Рассмотрите использование более robust стратегии ошибок, например, ловли конкретных исключений или реализации блока try-finally.
  • Вам может потребоваться добавление дополнительных проверок валидации для содержимого файла INI, таких как проверка пустых разделов или недопустимых значений.
  • Если вы работаете с большими файлами INI, вам может потребоваться использование более эффективной структуры данных, чем TStringList, для хранения имен разделов и пар значений.

Вот альтернативное решение, использующее более объектно-ориентированный подход:

type
  TIniNode = class(TTreeNode)
    private
      FData: string;
    public
      constructor Create(AOwner: TComponent; AText: string; AData: string);
  end;

var
  LS, LV: TStringList;
  root: TTreeNode;

procedure LoadIniToTree(const FName: string; Tree: TTreeView);
begin
  Tree.Items.Clear;
  with TIniFile.Create(FName) do
    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
              New(root);
              root.Text := LV.Names[j];
              root.Data := PString(root.Data);
              Tree.Items.AddChildObject(root, root.Text, PString(root.Data));
            end;
          end;
        finally
          LV.Free;
        end;
      finally
        LS.Free;
      end;
    finally
      Free;
    end;
end;

constructor TIniNode.Create(AOwner: TComponent; AText: string; AData: string);
begin
  inherited Create(AOwner);
  Text := AText;
  Data := PString(AData);
end;

В этом коде определена класс TIniNode, представляющий узел файла INI. Он имеет конструктор, принимающий текст и данные для узла, а также методы для загрузки файлов INI в дерево просмотра.

Процедура LoadIniToTree похожа на оригинальную реализацию, но использует новый класс TIniNode вместо создания узлов динамически с помощью оператора New. Этоapproach обеспечивает более высокую степень энкапсуляции и делает код более легко поддерживаемым.

Загрузка ini-файла в TTreeView - пример программы на Delphi, позволяющей загружатьini-файл в TreeView компонент.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TTreeView ::


Code:

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;

реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-07-04 08:14:09/0.008991003036499/1