Оно везде, всегда должно выглядеть вот так:
- Код: Выделить всё
New(ptrToInt2);
PtrToInt2^ := integer(dbArr[i + 1, 1]);
даже если потребуется это сочетание написать 1000 раз подряд.
Модератор: Модераторы
New(ptrToInt2);
PtrToInt2^ := integer(dbArr[i + 1, 1]);
vitaly_l писал(а):даже если потребуется это сочетание написать 1000 раз подряд.
Dispose(ptrToInt2);
To deallocate the memory, you use the Dispose command
wofs писал(а):освобождать тоже после каждого использования?
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
vitaly_l писал(а):И делать это нужно для каждого data? которому присвоили адрес.
for i:=Tree.Items.Count-1 downto 0 do
begin
Tree.Items[i].Data:= ???
end;
wofs писал(а):ни разу не совпало.
New(ptrToInt2);
PtrToInt2^ := integer(dbArr[i + 1, 1]);
if Items.Item[iTree].Data = PtrToInt2 then <== это никогда не будет true т.к. каждый раз новый адрес.
begin
vitaly_l писал(а):Поэтому попробуйте сравнивать не по номеру ячейки, а по содержимому записанному в data.
Tree1.Items.Item[iTree].Data = Type TTREEVIEW has no component named ITEMS.ITEM[0].Data.
vitaly_l писал(а):Поэтому попробуйте сравнивать не по номеру ячейки, а по содержимому записанному в data.
if Integer(Items.Item[iTree].Data) = integer(dbArr[i + 1, 1]) then
wofs писал(а):Хе, а у меня там пусто: Так же сравнивать?
New(ptrToInt2);
PtrToInt2^ := integer(dbArr[i + 1, 1]);
zub писал(а):Естественно время жизни nodы должно быть меньше чем то куда указывает node.data, иначе указатель становится невалидным
vitaly_l писал(а):Возьмите книжку, про poiner-ы и остальное программирование и там найдёте где именно нужно поставить вот такой символ ^ чтобы узнать значение ячейки памяти.
wofs писал(а):брать книжку для меня нынче непозволительная роскошь по времени
PtrToInt2^ := integer(dbArr[i + 1, 1]);
zub писал(а):Жгешь
zub писал(а):Естественно время жизни nodы должно быть меньше чем то куда указывает node.data, иначе указатель становится невалидным.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16