TreeView странность.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: TreeView странность.

Сообщение wofs » 03.09.2017 22:06:25

vitaly_l писал(а):А вот здесь вставьте без QueueAsyncCall и всё будет работать

Не, не будет.
vitaly_l писал(а):EditingEnd - это одна из стандартных функций Tree1

Я это знаю, и это видно из примера - я ее использую.
olegy123 писал(а):вообще можно свой визуальный компонент написать со своими плюшечками.

Не, писать компоненты мы не будем. Спасибо.
pupsik писал(а):wofs возможно кажется но: вы, малость, не валидно заполняете.

Покопался в интернете - наткнулся на несколько примеров, которые на поверку оказались одинаковыми.
pupsik писал(а):Но: если залезли в указатели то... работайте по правилам. Хотя я считаю что не нужны они в данной задаче.

Да я рад бы без них. Нуб я.

Я решил отказаться в задаче от TreeView и его подобных. Не очень то мне и нужна такая ветвистая иерархия, что бы тратить столько времени на ее изучение.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: TreeView странность.

Сообщение pupsik » 03.09.2017 22:24:43

Не, писать компоненты мы не будем.
не надо писать. Всё уже есть. Ссылки выше. Один попроще, иной поизвилистей.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: TreeView странность.

Сообщение olegy123 » 04.09.2017 07:29:54

wofs писал(а):
olegy123 писал(а):вообще можно свой визуальный компонент написать со своими плюшечками.

Не, писать компоненты мы не будем. Спасибо.

Там писать ~ 10 строчек.

Тех кто пишет свои компоненты - те "мастера спорта". За хороший компонент бабулек дать, даже в у.е., а могут предложить высокооплачиваемую работу в счастливой стране.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: TreeView странность.

Сообщение vitaly_l » 04.09.2017 09:39:32

wofs писал(а):Не, не будет.

Как это? У меня работает.
wofs писал(а):я ее использую.

Нет! Вы используете другую, вот эту: onEdited, а я Вам сказал использовать onEditingEnd.
Разницу между onEdited и onEditingEnd - видите? Что означает EditingEnd и чем отличается от просто Edited - понимаете?
Сделайте как в примере, вставив в неё только свою перерисовку дерева FillTree();, а сохранение имени оставьте, там, где оно сейчас.

И убедитесь - будет работать, т.к. EditingEnd - последняя в очереди и поэтому в ней будет работать, также как и с QueueAsyncCall. Но это не отменяет неправильное if ... then ... т.к. там могут возвращаться разные адреса.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: TreeView странность.

Сообщение wofs » 04.09.2017 16:26:09

vitaly_l писал(а):И убедитесь - будет работать, т.к. EditingEnd - последняя в очереди и поэтому в ней будет работать, также как и с QueueAsyncCall. Но это не отменяет неправильное if ... then ... т.к. там могут возвращаться разные адреса.

Хорошо, спасибо.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: TreeView странность.

Сообщение wofs » 19.09.2017 19:29:54

Дошли руки доделать дерево.
Создал юнит TTreeDataU , где объявил класс:
Код: Выделить всё
...
TTreeData = class
private
   FValue : integer;
public
   constructor Create(i : integer);
   property Value : integer read FValue;
end;     
....
constructor TTreeData.Create(i: integer);
begin
  FValue := i;
end;   


Дерево заполняю теперь так:
Код: Выделить всё
procedure TForm1.FillTree(); // заполнение дерева
var
  i, iTree: integer;
begin
  with Tree1 do
  begin
    BeginUpdate;

    TreeClear();

    Items.AddObject(nil, dbArr[0, 2], TTreeData.Create((integer(dbArr[0, 0]))));
    // добавляем корневой объект

    for i := 0 to Length(dbArr) - 2 do // перебираем в цикле
    begin

      if i = 0 then
        Log('iTree= ' + IntToStr(0) + ' Node= ' + string(dbArr[i, 0]) + ' Parent= ' +
          string(dbArr[i, 1]) + ' Name= ' + string(dbArr[i, 2]));

      iTree := 0;
      while iTree < Items.Count do
      begin
        if TTreeData(Items.Item[iTree].Data).Value = integer(dbArr[i + 1, 1]) then
        begin

          Log('iTree= ' + IntToStr(iTree) + ' Node= ' + string(dbArr[i + 1, 0]) +
            ' Parent= ' + string(dbArr[i + 1, 1]) + ' Name= ' + string(dbArr[i + 1, 2]));

          Items.AddChildObject(Items.Item[iTree],
            string(dbArr[i + 1, 2]), TTreeData.Create((integer(dbArr[i + 1, 0]))));  // добавляем дочерние объекты
          break;
        end;
        Inc(iTree);
      end;

    end;

    Items[0].Expand(True);
    EndUpdate;
  end;
end;   

Очищаю так:
Код: Выделить всё
procedure TForm1.TreeCLear;
var
  i:integer;
begin
    with Tree1 do
  begin

     for  i:=Items.Count-1 downto 0 do
     begin
          TTreeData(Items[i].Data).Free;
     end;

     Items.Clear;
  end;
end;   


Правда при редактировании обновления дерева надо ставить, как говорил vitaly_l:
Код: Выделить всё
procedure TForm1.Tree1EditingEnd(Sender: TObject; Node: TTreeNode;
  Cancel: Boolean);
begin
  FillTree();
end;     

Ну или через асинхронный вызов процедуры, по версии zub.
------
vitaly_l, теперь я верно заполняю Items.Data ? Утечек не будет?

Проект: https://yadi.sk/d/yYbRgJTm3N3grJ
Последний раз редактировалось wofs 01.10.2017 01:40:25, всего редактировалось 2 раз(а).
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Re: TreeView странность.

Сообщение serbod » 19.09.2017 20:39:02

wofs Виталий тебя троллит.

У тебя была ошибка, тебе ее указали, ты ее исправил.

Если хочешь сделать красиво, то опиши своего потомка TTreeNode:
Код: Выделить всё
type TMyTreeNode = class(TTreeNode)
  Value: Integer;
  Description: string;
  // и так далее, по вкусу
end;


А потом создавай и добавляй его в Items.AddNode(). И соответственно, при обращении к узлу, делай приведение типа:
Код: Выделить всё
(Node as TMyTreeNode).Value


И все, удалять ничего не надо, само удалится при очистке дерева.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: TreeView странность.

Сообщение wofs » 19.09.2017 20:51:51

serbod
Хорошо, спасибо.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

Рейтинг@Mail.ru