Перейти к содержанию
Fire Monkey от А до Я
  • 0

Экспорт в файл/импорт из файла.


伝説の

Вопрос

Собственно как это можно сделать?

P.S.

Сохранить то получается (с нужными данными), а вот как воссоздать дерево из файла уже всю голову сломал...

Как сохраняю:

Использую json (superobject), в цикле пробегаюсь по всем item'ам сохраняя их text и level.

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

покажи файл который получился

{
    "UPDATED": "",
    "DATA": {
        "1": {
            "level": 1,
            "text": "ITEM1"
        },
        "2": {
            "level": 2,
            "text": "ITEM1_SUB1"
        },
        "3": {
            "level": 1,
            "text": "ITEM2"
        },
        "4": {
            "level": 2,
            "text": "ITEM2_SUB1"
        },
        "5": {
            "level": 2,
            "text": "ITEM2_SUB2"
        },
        "6": {
            "level": 2,
            "text": "ITEM2_SUB3"
        },
        "7": {
            "level": 2,
            "text": "ITEM2_SUB4"
        },
        "8": {
            "level": 1,
            "text": "ITEM3"
        }
    }
}
Ссылка на комментарий
  • 0
  • Модераторы

кажется такой подход будет удобней

 

DATA - массив

{ 
   "UPDATED":"",
   "DATA":[ 
      { 
         "ItemIndex":1,
         "text":"ITEM1",
         "parent":0
      },
      { 
         "ItemIndex":2,
         "text":"ITEM1_SUB1",
         "parent":1
      }
   ]
}
Ссылка на комментарий
  • 0

 

кажется такой подход будет удобней

 

DATA - массив

{ 
   "UPDATED":"",
   "DATA":[ 
      { 
         "ItemIndex":1,
         "text":"ITEM1",
         "parent":0
      },
      { 
         "ItemIndex":2,
         "text":"ITEM1_SUB1",
         "parent":1
      }
   ]
}

Ну ок, а как из этого всего теперь дерево воссоздать в runtim'е?

Изменено пользователем My War
Ссылка на комментарий
  • 0
  • Модераторы

я показал пример, дальше по такой же схеме.

учтите что левелы нужно самому проверять.

чем больше вложенностей, тем больше будет левелов

Ссылка на комментарий
  • 0

я показал пример, дальше по такой же схеме.

учтите что левелы нужно самому проверять.

чем больше вложенностей, тем больше будет левелов

Ну так я и пытаюсь универсальный способ написать...
Ссылка на комментарий
  • 0

Получилось написать, работает на всех уровнях.

 

Экспорт

procedure ExportFromTreeView(Path: String; TreeView: TTreeView);
var
  Generated: ISuperObject;
  Counter: Integer;
  I: TTreeViewItem;
begin
  if
   not
    Assigned(TreeView)
  then
    Exit;
  {
  }
  TreeView.ExpandAll;
  Generated := SO('{"Data": []}');
  {
  }
  for
    Counter := 0
  to
    TreeView.GlobalCount - 1
  do
  begin
    I := TreeView.ItemByGlobalIndex(Counter);
    Generated.A['Data'].Add(SO(['text', I.Text, 'level', I.Level]));
  end;
  {
  }
  Generated.SaveTo(path, True);
end;

Импорт

procedure ImportToTreeView(Path: String; TreeView: TTreeView);
var
  I,
  Last: TTreeViewItem;
  ImportData,
  S: ISuperObject;
begin
  if
   not
    Assigned(TreeView)
  then
    Exit;

  ImportData := TSuperObject.ParseFile(Path, False);

  if
   not
    Assigned(ImportData)
  then
    Exit;
  {
  }
  TreeView.Clear;
  {
  }
  for
    S
  in
    ImportData['Data']
  do
  begin
    I := TTreeViewItem.Create(nil);
    I.Text := S.S['text'];
    case S.I['level'] of
      1: TreeView.AddObject(I);
      else
      begin
        if
          S.I['level'] > Last.Level
        then
          Last.AddObject(I)
        else
          if
            S.I['level'] = Last.Level
          then
            Last.ParentItem.AddObject(I)
          else
            Last.ParentItem.ParentItem.AddObject(I);
      end;
    end;
    Last := I;
  end;
  {
  }
  TreeView.ExpandAll;
end;

P.S.Сорри за мой кодстайл, но думаю суть поймете.

Ссылка на комментарий
  • 0
В 11.11.2015 в 10:02, 伝説の сказал:

Получилось написать, работает на всех уровнях.

 

Экспорт

Скрытый контент

Импорт

Скрытый контент

P.S.Сорри за мой кодстайл, но думаю суть поймете.

Спасибо тебе большое!


UPD. Только была проблема с импортом - некоторые папки попадали в не свой ЛВЛ.

Если дочерние элементы находятся на одном уровне с предыдущим элементом, то их нужно добавлять в одну и ту же папку, но в данном коде это не учитывается.

 

Фиксанула:

if S.I['level'] = 1 then
begin
  TreeView.AddObject(I);
  Last := I;
end
else
begin
  while S.I['level'] <= Last.Level do
  begin
    Last := Last.ParentItem;
  end;
  Last.AddObject(I);
  Last := I;
end;

Код добавляет новый элемент в папку на уровне выше, если уровень нового элемента меньше или равен уровню предыдущего элемента, иначе добавляет его в предыдущую папку. Кроме того, в начале обработки первого элемента устанавливается Last в корневой элемент TreeView.

 

Может потомкам пригодится. Хотя, делфи уже мертв((

Изменено пользователем Ksusha
Ссылка на комментарий
  • 0
15 часов назад, Ksusha сказал:

Спасибо тебе большое!


UPD. Только была проблема с импортом - некоторые папки попадали в не свой ЛВЛ.

Если дочерние элементы находятся на одном уровне с предыдущим элементом, то их нужно добавлять в одну и ту же папку, но в данном коде это не учитывается.

 

Фиксанула:

if S.I['level'] = 1 then
begin
  TreeView.AddObject(I);
  Last := I;
end
else
begin
  while S.I['level'] <= Last.Level do
  begin
    Last := Last.ParentItem;
  end;
  Last.AddObject(I);
  Last := I;
end;

Код добавляет новый элемент в папку на уровне выше, если уровень нового элемента меньше или равен уровню предыдущего элемента, иначе добавляет его в предыдущую папку. Кроме того, в начале обработки первого элемента устанавливается Last в корневой элемент TreeView.

 

Может потомкам пригодится. Хотя, делфи уже мертв((

Спасибо, на тот момент видимо под мою задачу я это не учитывал...

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...