>>Вот это неправильно:
Слышал звон и не знал где он. Что тут неправильно?
На этом форуме всё топится во флейме, а непонимающие люди с умным видом порют чушь((
Модератор: Модераторы
zub писал(а):Цените время форумчан
vitaly_l писал(а):И покажите, в своём примере, как вы чистите pointer,
wofs писал(а):А как мне их почистить? Посмотрите, пожалуйста, примеры в сообщении выше.
zub писал(а):На этом форуме всё топится во флейме, а непонимающие люди с умным видом порют чушь((
Слышал звон и не знал где он. Что тут неправильно?
zub писал(а):olegy123 писал(а):wofs писал(а):Просто в коде процедурубуду вызывать через QueueAsyncCall
- Код: Выделить всё
FillTree();
WTF?
Зачем?
Мултипоточность нужно применять там где это необходимо - иначе решения задачи усложняется в разы.
Вместо правильности кода будете ловить эксепшены в неожиданных местах.
У вас было проблема в утечке памяти. Продолжали работать с зомби классом.
Какая тут мультипоточность? это отложенное выполнение процедуры
zub писал(а):>>Вот это неправильно:
Слышал звон и не знал где он. Что тут неправильно?
На этом форуме всё топится во флейме, а непонимающие люди с умным видом порют чушь((
vitaly_l писал(а):Я в примерах не нашёл использования функции new(), соответственно: постольку, поскольку - Вы ничего не создавали, то и удалять ничего ненужно.
vitaly_l писал(а):Соответственно "самодельная" функция Clear(); лишняя и более того неправильная, т.к. ничего не чистит, разве что data присваивается nil.
vitaly_l писал(а):Я так понимаю сейчас всё работает и делает правильно? И автор при этом, ничего не чистит? Верно?
Золотое правило: Если работает - не трогай!
wofs писал(а):Правильно, через QueueAsyncCall.
Clear(); А ее и нет ныне...
vitaly_l писал(а):Но теперь когда их нет, зачем QueueAsyncCall ?
Items.Clear; //очищаем дерево
wofs писал(а):пытаетесь тыкнуть меня носом в мои ошибки
vitaly_l писал(а):в следствии чего и появляются Ваши "странные" глюки.
wofs писал(а):Глюки есть и без моих самописных функций очистки.
vitaly_l писал(а):И такое решение (с помощью костыля в виде QueueAsyncCall, но без понимания сути проблемы ) уже - не приведёт к сбою АЭС или падению самолёта, если они подсмотрят это решение в этом топике.
wofs писал(а):Однако, предложенное вами решение в виде создания своих указателей не заработало и дерево не заполнилось.
if Tree1.Items.Item[i].Data = Pointer(FieldByName(idParent).asInteger)
vitaly_l писал(а):и прочитать уже про pointеr
wofs писал(а):хранит адрес на ячейку памяти
vitaly_l писал(а):Я пробовал переписать
- Код: Выделить всё
if Items.Item[iTree].Data = Pointer(integer(dbArr[i + 1, 1])) then
на
- Код: Выделить всё
PtrToInt2^ := integer(dbArr[i + 1, 1]);
if Items.Item[iTree].Data = PtrToInt2 then
procedure TForm1.FillTree(); // заполнение дерева
var
i, iTree: integer;
ptrToInt2 : ^Integer;
begin
New(ptrToInt2);
with Tree1 do
begin
BeginUpdate;
Items.Clear; //очищаем дерево
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
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]));
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;
Dispose(ptrToInt2);
end;
end;
PtrToInt2^ := integer(dbArr[i + 1, 1]);
if Items.Item[iTree].Data = PtrToInt2 then
Сейчас этот форум просматривают: Google [Bot] и гости: 6