Текущий архив: 2005.10.23;
Скачать: CL | DM;
ВнизПропадают данные из TreeNode.Data при обращении к ним. Найти похожие ветки
← →
Profi © (2005-10-03 13:34) [0]Если в функции делаю так:
Sp:=TStringList.Create;
Sp:=TreeNode.Data;
То при повторном обращении выскакивает AV. Как быть? Могу привести функцию полностью.
← →
Amoeba © (2005-10-03 13:36) [1]
> Могу привести функцию полностью.
Не просто можно, но обязательно нужно.
← →
begin...end © (2005-10-03 13:37) [2]> Profi © (03.10.05 13:34)
> Sp:=TStringList.Create;
> Sp:=TreeNode.Data;
Утечка памяти.
← →
Profi © (2005-10-03 13:39) [3]begin...end © (03.10.05 13:37) [2]
Я это понимаю, но откуда она? И как этого избежать?
← →
Amoeba © (2005-10-03 13:42) [4]
> Я это понимаю, но откуда она? И как этого избежать?
Как откуда? Она просто обязана быть в таком коде. Включи мозги!
← →
begin...end © (2005-10-03 13:43) [5]> Profi © (03.10.05 13:39) [3]
> откуда она?
> Sp:=TStringList.Create
Сохраняем ссылку на только что созданный объект в переменной Sp.
> Sp:=TreeNode.Data
Затираем эту ссылку значением свойства TreeNode.Data. Предыдущая ссылка потеряна.
← →
Profi © (2005-10-03 13:45) [6]begin...end © (03.10.05 13:43) [5]
1. Sp:=TStringList.Create можно не писать?
2. Дело в том. Что если где-то в программе я опять сделаю Sp:=TreeNode.Data вот тогда-то и выскакивает AV.
← →
begin...end © (2005-10-03 13:46) [7]> Profi © (03.10.05 13:45) [6]
А в чём смысл всего этого?
← →
Profi © (2005-10-03 13:50) [8]begin...end © (03.10.05 13:46) [7]
Привожу функцию:Procedure TDMBase.GetTreeForFile(FileName:String; TreeView:TTreeView; Registr:Boolean);
var i,j,ind,k:integer;
Sp:TStringList;
est:boolean;
begin
k:=TreeView.Items.Count-1;//Смотрю, на сколько уже заполнен TreeView.
AddBaseToTreeView(TreeView,(TreeView.Images as TImageList),true);//Дополняю его (В этой функции все ок).
ind:=-1;
for i:=0 to TreeView.Items.Count-1 do
if ind<TreeView.Items[i].AbsoluteIndex then
ind:=TreeView.Items[i].AbsoluteIndex; //Нахожу самой нужний хвост.
Sp:=TStringList.Create;
repeat
i:=-1;
Repeat
inc(i);
If (i>treeView.Items.Count-1) then break;
If TreeView.Items[i].AbsoluteIndex=ind then begin
If TreeView.Items[i].Data<>nil then begin//Если data не пустое...
Sp.Clear;
Sp:=TreeView.Items[i].Data;
est:=false;
For j:=0 to Sp.Count-1 do
If registr then begin
If pos(LowerCase(FileName),LowerCase(Sp.Strings[j]))>0 then begin
est:=true;
Break;
end;
end else
if pos(FileName,Sp.Strings[j])>0 then begin
est:=true;
Break;
end;//...Проверяю есть ли в списке нужное мне слово.
If (Not Est) and (treeView.Items[i].getFirstChild=nil) then begin
TreeView.Items[i].Delete; //Если нет удаляю хвост.
end;
end else begin
If TreeView.Items[i].getFirstChild=nil then begin
TreeView.Items[i].Delete;
end;
end;
end;
Until i>=(TreeView.Items.Count-1)-k;
ind:=ind-1;
until ind=-1;
sp.Free;
end;
Остаются хвосты, где в data есть нужное слово. Мне надо его просмотреть, но выскакивает AV.
← →
Amoeba © (2005-10-03 13:52) [9]
> Дело в том. Что если где-то в программе я опять сделаю Sp:
> =TreeNode.Data вот тогда-то и выскакивает AV.
Не надо так делать! Тем более, если ты profi.
← →
Vladimir88 (2005-10-03 14:00) [10]//if TreeView.Items[i].Data<>nil
имхо лучше
if Assigned(TreeView.Items[i].Data);
//Sp:=TreeNode.Data;
хм, просто назначать пойнтер стринглисту имхо есть неправильно
Sp:=TStrings(TreeNode.Data);
← →
Vladimir88 (2005-10-03 14:01) [11]//if TreeView.Items[i].Data<>nil
имхо лучше
if Assigned(TreeView.Items[i].Data);
//Sp:=TreeNode.Data;
хм, просто назначать пойнтер стринглисту имхо есть неправильно
Sp:=TStrings(TreeNode.Data);
← →
Profi © (2005-10-03 14:02) [12]Amoeba © (03.10.05 13:52) [9]
Отличная мысль! Спасибо!
Vladimir88 (03.10.05 14:01) [11]
Уже исправил! Сделал так Sp.AddStrings(TreeNode.data);
Страницы: 1 вся ветка
Текущий архив: 2005.10.23;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.04 c