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

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

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

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

Сообщение vitaly_l »

zub писал(а):Какие сложности с пониманием этого?

А так Вы значит правы, а я неправ? И это значит, что указатель на адрес в памяти - может самопроизвольно меняться, в зависимости от времени выполнения функции и только QueueAsyncCall или задержка на 100 мс - лечат от этого странного нонсенса? Верно?
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Ты издеваешся? QueueAsyncCall совсем для другого. "Абстрактный" пример с кнопкой посмотри, проще объяснить невозможно
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zub писал(а):Ты издеваешся?

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

Код: Выделить всё

if Tree1.Items.Item[i].Data^ = FieldByName(idParent).asInteger then ...

Будет правильно заполнять и работать или всё таки рухнет?
Последний раз редактировалось vitaly_l 03.09.2017 16:40:30, всего редактировалось 2 раза.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>> и работать без QueueAsyncCall?
оно сегодня может работать, а завтра неработать. Нельзя удалять чтото а потом к этому чемунибудь обращаться.

>>опробуйте в изначальном варианте заменить
Чтобы окружающие не брезговали пробовать надо 1 - без ненужных зависимостей, 2 - не галемотья которой является if Tree1.Items.Item[i].Data^ =
Давно пора это запомнить. Исходный пример я не рассматриваю потому что он не проходит уже через 1.
Не компилируя и не запуская я вижу в нем проблему с отсутствием QueueAsyncCall. Это не отменяет наличие там других проблем, но мне жаль своего времени пытаться вникать в них "в уме" без компиляции и запуска
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

zub писал(а):Чтобы окружающие не брезговали пробовать надо 1 - без ненужных зависимостей,

Не брезгуйте, давно все перезалито.
viewtopic.php?f=5&t=25392&start=30#p125129
Если только зависимость от FPC и пары стандартных визуальных компонент вас не смущает.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

wofs писал(а):Не брезгуйте, давно все перезалито.

У вас не равнозначный пример т.к. в примере вы используете глобальную переменную, а у SQL она локальная и поэтому сегодня локальный адрес работает, а завтра нет. В то время как глобальный в примере - работает всегда.

Ещё вот так оно 100% правильно заполняет, без QueueAsyncCall:

Код: Выделить всё

if integer(Tree1.Items.Item[i].Data) = FieldByName(idParent).asInteger then ...

проверял на

Код: Выделить всё

if integer(Items.Item[iTree].Data) = integer(dbArr[i + 1, 1]) then ... 

И дело 100% не в QueueAsyncCall.
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

vitaly_l писал(а):проверял на

Код: Выделить всё
if integer(Items.Item[iTree].Data) = integer(dbArr[i + 1, 1]) then ...

Вы так и не поняли проблему... У меня и так все заполнялось... до ваших советов...

Добавлено спустя 1 минуту 26 секунд:
Встаньте на ветку дерева и отредактируйте ее название...

Добавлено спустя 1 минуту 36 секунд:
vitaly_l писал(а):У вас не равнозначный пример т.к. в примере вы используете глобальную переменную, а у SQL она локальная и поэтому сегодня локальный адрес работает, а завтра нет. В то время как глобальный в примере - работает всегда.

И опять - вы не туда смотрите.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

wofs писал(а):Вы так и не поняли проблему... У меня и так все заполнялось...

Ну так уберите то что закомментировано из кода и глюк пропадёт, а правильное переименование останется:

Код: Выделить всё

procedure TForm1.EditItemName(Node: TTreeNode; var S: ansistring);
// редактирование узла
var
  i: integer;
begin
  log(Format('Номер изменяемого узла = %d', [integer(Node.Data)]));
  dbArr[integer(Node.Data - 1), 2] := S;

  //FillTree();
  //Application.QueueAsyncCall(@AsyncFillTree,0); // предложение zub
end;   

Вам вообще ненужно в EditItemName вызывать FillTree или FillTree через QueueAsyncCall. Равно как и Clear() там было лишним.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Вам вообще ненужно в EditItemName вызывать FillTree или FillTree через QueueAsyncCall. Равно как и Clear() там было лишним.
Да и вообще писать эту программу не надо))
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

vitaly_l писал(а):Ну так уберите то что закомментировано из кода и глюк пропадёт, а правильное переименование останется:

А если что-то стряслось на стороне БД и она не записала изменения?
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

wofs писал(а):А если что-то стряслось на стороне БД и она не записала изменения?

Я надеюсь что работа БД написана программистами надёжнее чем написанные Вами вызов FillTree или Clear.
Мне кажется Вам нужно не о работе БД беспокоиться.
Аватара пользователя
wofs
постоялец
Сообщения: 379
Зарегистрирован: 05.10.2009 10:16:55
Откуда: Астрахань
Контактная информация:

Сообщение wofs »

Ладно, закрыли тему.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

wofs писал(а):Ладно, закрыли тему.

Вот здесь закомментируйте FillTree();

Код: Выделить всё

procedure TForm1.EditItemName(Node: TTreeNode; var S: ansistring);
// редактирование узла
var
  i: integer;
begin
  log(Format('Номер изменяемого узла = %d', [integer(Node.Data)]));
  dbArr[integer(Node.Data - 1), 2] := S;

  //FillTree();
  //Application.QueueAsyncCall(@AsyncFillTree,0); // предложение zub
end; 


А вот здесь вставьте без QueueAsyncCall и всё будет работать

Код: Выделить всё

procedure TForm1.Tree1EditingEnd(Sender: TObject; Node: TTreeNode; Cancel: Boolean);
begin
  FillTree();
end;     

EditingEnd - это одна из стандартных функций Tree1
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

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

И освобождать

Код: Выделить всё

Dispose(ptrToInt2);

тоже после каждого использования?
To deallocate the memory, you use the Dispose command

Никто не запрещает преобределить TTreeNode и в

Код: Выделить всё

TMyTreeNode.Destroy()
begin
 Dispose(Data);
 inherited Destroy();
end;


вообще можно свой визуальный компонент написать со своими плюшечками.
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

вообще можно свой визуальный компонент написать со своими плюшечками.
как бы (правки с форума надо добавить). Если не считать TVirtualDBTree (куда интереснее.. хотя "чистый" VirtualTree куда лучше).

wofs возможно кажется но: вы, малость, не валидно заполняете. Т.е. хм... "рубите топором верхушку, а не низ дерева..." .Вроде как есть темы в подмогу на вопросы.
Плюс вики никто не отменял.

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