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

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

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

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

Сообщение vitaly_l » 03.09.2017 14:48:44

New(ptrToInt2); нужно делать перед каждым присваиванием адреса PtrToInt2^ := integer(dbArr[i + 1, 1]);.
Оно везде, всегда должно выглядеть вот так:
Код: Выделить всё
New(ptrToInt2);
PtrToInt2^ := integer(dbArr[i + 1, 1]);

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

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

Сообщение wofs » 03.09.2017 14:50:15

vitaly_l писал(а):даже если потребуется это сочетание написать 1000 раз подряд.

И освобождать
Код: Выделить всё
Dispose(ptrToInt2);

тоже после каждого использования?
To deallocate the memory, you use the Dispose command
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 03.09.2017 14:52:28

wofs писал(а):освобождать тоже после каждого использования?

Освобождать нужно, когда вы закончили с ней работать. Иногда это в конце программы, иногда в дополнительной функции. И делать это нужно для каждого data, которому присвоили адрес.
Последний раз редактировалось vitaly_l 03.09.2017 14:55:38, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение wofs » 03.09.2017 14:55:23

Теперь имеем такой код:
Код: Выделить всё
procedure TForm1.FillTree(); // заполнение дерева
var
  i, iTree: integer;
  ptrToInt2 : ^Integer;
begin

  with Tree1 do
  begin
    BeginUpdate;
    Items.Clear; //очищаем дерево

    New(ptrToInt2);
    ptrToInt2^ := integer(dbArr[0, 0]);
  //  node.data := ptrToInt2; // или так @ptrToInt2; - зависит от директивы  Zub - писал выше

    Items.AddObject(nil, dbArr[0, 2], ptrToInt2);

    // добавляем корневой объект

    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

        New(ptrToInt2);
        PtrToInt2^ := integer(dbArr[i + 1, 1]);

        if Items.Item[iTree].Data = PtrToInt2 then
        begin

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

          New(ptrToInt2);
          ptrToInt2^ := integer(dbArr[i+1, 0]);

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

    end;

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

  end;
end;       

И, дерево из одного корня. Условие
Код: Выделить всё
if Items.Item[iTree].Data = PtrToInt2 then

ни разу не совпало.

Добавлено спустя 3 минуты 58 секунд:
vitaly_l писал(а):И делать это нужно для каждого data? которому присвоили адрес.

А как это сделать для каждого дата?
Допустим я в цикле перебираю Items:

Код: Выделить всё
for  i:=Tree.Items.Count-1 downto 0 do
begin

Tree.Items[i].Data:= ???

end;
Последний раз редактировалось wofs 03.09.2017 15:00:54, всего редактировалось 1 раз.
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 03.09.2017 15:00:29

wofs писал(а):ни разу не совпало.

Естественно ни один не сможет совпасть, вы ведь присвоили PtrToInt2 новый УНИКАЛЬНЫЙ адрес и потом пытаетесь его найти в Data, но его там не может быть, т.к. зомби адреса в data теперь отсутствуют.
Код: Выделить всё
        New(ptrToInt2);
        PtrToInt2^ := integer(dbArr[i + 1, 1]);

        if Items.Item[iTree].Data = PtrToInt2 then <== это никогда не будет true т.к. каждый раз новый адрес.
        begin

Поэтому попробуйте сравнивать не по номеру ячейки, а по содержимому записанному в data.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение wofs » 03.09.2017 15:06:18

vitaly_l писал(а):Поэтому попробуйте сравнивать не по номеру ячейки, а по содержимому записанному в data.


Хе, а у меня там пусто:
Tree1.Items.Item[iTree].Data = Type TTREEVIEW has no component named ITEMS.ITEM[0].Data.


Добавлено спустя 7 минут 38 секунд:
vitaly_l писал(а):Поэтому попробуйте сравнивать не по номеру ячейки, а по содержимому записанному в data.

Так же сравнивать?
Код: Выделить всё
if Integer(Items.Item[iTree].Data) = integer(dbArr[i + 1, 1]) then
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 03.09.2017 15:31:41

wofs писал(а):Хе, а у меня там пусто: Так же сравнивать?

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

PS: И заодно поделитесь этой книжкой с Zub-иком, а то у него номера ячеек памяти восстанавливаются только через несколько микросекунд и только после использования QueueAsyncCall... :roll:, а без использования QueueAsyncCall, у Zub-ика - оказывается адреса ячеек памяти могут быть разные в зависимости от времени потраченного на исполнение функции... :wink: .


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

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

Сообщение zub » 03.09.2017 15:55:29

Естественно время жизни nodы должно быть меньше чем то куда указывает node.data, иначе указатель становится невалидным. Тут вопросов быть неможет, об этом преподают в 3м классе, где виталик сейчас и застрял)) Вот только обеспечивать это
Код: Выделить всё
New(ptrToInt2);
PtrToInt2^ := integer(dbArr[i + 1, 1]);

и подобным - както колхозно
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 03.09.2017 16:07:36

zub писал(а):Естественно время жизни nodы должно быть меньше чем то куда указывает node.data, иначе указатель становится невалидным

И как же решает вопрос продолжительности жизни указателя - предложенная "не колхозная" функция QueueAsyncCall ?
Вкусные печеньки будут или только слова?

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

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

Сообщение zub » 03.09.2017 16:17:53

QueueAsyncCall - решение совсем другой проблемы - читаем тему сначала
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение wofs » 03.09.2017 16:21:53

vitaly_l писал(а):Возьмите книжку, про poiner-ы и остальное программирование и там найдёте где именно нужно поставить вот такой символ ^ чтобы узнать значение ячейки памяти.

Ладно, забейте.
Велосипед работает, брать книжку для меня нынче непозволительная роскошь по времени - по завершении текущей задачи я вновь буду что-то писать лет так через 10 и, к тому времени, я забуду не только про то, что написано в умной книжке, но и адрес этого форума с трудом припомню.

Добавлено спустя 3 минуты 31 секунду:
Это равносильно тому, что если вы обратитесь ко мне с вопросом - "я тут бегущие огни собрал,а они не работают". И я, вместо помощи, отправлю вас читать это:
http://adm-lib.ru/elektronika/horovits- ... hniki.html
А оно вам надо?
Аватара пользователя
wofs
постоялец
 
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань

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

Сообщение vitaly_l » 03.09.2017 16:29:51

wofs писал(а):брать книжку для меня нынче непозволительная роскошь по времени

Тогда попробуйте найти этот треугольный символ ^ в Вашем-же коде и быть может Вам повезёт получить значение ячейки памяти.
Код: Выделить всё
PtrToInt2^ := integer(dbArr[i + 1, 1]);

А вообще, постольку поскольку Вы не знаете как ими пользоваться, то лучше не пользуйтесь, т.к. с ними программа у вас 99% рухнет. Поверьте, pointer это одна из самых сложных тем в программировании. Даже очень опытные программисты с 20-ти летним стажем - допускают там ошибки.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 03.09.2017 16:41:56

>>Поверьте, pointer это одна из самых сложных тем в программировании
Жгешь.
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

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

Сообщение vitaly_l » 03.09.2017 16:45:25

zub писал(а):Жгешь

Ну тогда объясните человеку как ему правильно пользоваться pointer, т.к. QueueAsyncCall - решает совсем другую задачу.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение zub » 03.09.2017 16:48:17

>>Ну тогда объясните человеку как ему правильно
Чтото мне кажется что тебе это будет полезней чем человеку))
zub писал(а):Естественно время жизни nodы должно быть меньше чем то куда указывает node.data, иначе указатель становится невалидным.

Какие сложности с пониманием этого?
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Пред.След.

Вернуться в Lazarus

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

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

Рейтинг@Mail.ru