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

伝説の

Пользователи
  • Постов

    31
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные 伝説の

  1. 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.

     

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

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

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

     

    Экспорт

    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.Сорри за мой кодстайл, но думаю суть поймете.

  3.  

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

     

    DATA - массив

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

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

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

    {
        "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"
            }
        }
    }
  5. Собственно как это можно сделать?

    P.S.

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

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

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

  6. Думаю, что все должно быть как для VCL-приложений.

    protected
      procedure WMSysCommand(var Msg:TMessage); message WM_SYSCOMMAND;
    
    procedure TfmForm1.WMSysCommand(var Msg:TMessage);
    begin
      if Msg.WParam=SC_MINIMIZE then
      begin
        .....
      end else
      inherited;
    end;
    не уверен, не пробовал, но "копать" - в том направлении..
    Все четно, даже поиск не помог.
  7. P.S. если Вы правили исходник среды FM, то проблема с "расположением позади taskbar" так же должна исчезнуть. Проверьте.

    Неа, потому я тогда разницы и не увидел.
  8. Мне долго объяснять что это даст, если Вы не понимаете как ведет себя среда FM. Я лучше подскажу как решить проблему иначе, не изменяя исходников вообще:

     

    1. Убрать при создании формы операцию nTrayIcon1.Show;

    2. Добавить таймер с интервалом минимум 10 мс

    3. В событии тамера: nTrayIcon1.Show -> Отключаем таймер.

     

    Всё. Проверил - работает.

    Блииин, как же я сразу об этом не подумал... кстати таймер не обязателен, главное этот код не в OnCreate а в OnShow выполнять и все.

    А вот на этом огромное спасибо, главную проблему решили таким простым способом =)

  9. Нужно:

    procedure TnTrayIcon.Show;
    begin
      mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle); <<< ---------- ApplicationHWND;
      mPopUpMenu := nTrayMenu;
      mIndent := nIndent;
    .....................
    
    
    Вот это:

    mHWND := FmxHandleToHWND((Self.Owner as TForm).Handle);
    
    Изменить на это:

    mHWND := ApplicationHWND;
    

    И что это дает?

    upd

    Пардон туплю, иконка в трее работать теперь стала (с прозрачной формой).

  10. В самый раз для тех, у кого версия среды совпадает с моей... Этот способ не пройдет. Сделайте это сами, вот ссылка на решение.

    А что с кодом компонента? нечего править не нужно?
  11. Пока в FM нет возможности "из коробки" вытащить Handle Application наружу - это не возможно. Можно модифицировать самому исходник, и я могу вписать функцию в исходник компонента, но тогда он будет работать только у тех, у кого модифицирован исходник FM юнита. Это не есть хорошо.

    Нет проблем, модифицируйте исходник, скомпилируйте его (в release [x32, x64], debug [x32, x64]), и выложите сюда dcu файлы.

    Пользователю всего лишь останется их закинуть в C:\Program Files (x86)\Embarcadero\Studio\14.0\lib и там в соответствующие папки (предварительно сделав бэкпак оригинальных), для временного решения в самый раз.

×
×
  • Создать...