![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пропадают данные из TreeNode.Data при обращении к ним.
Profi © (2005-10-03 13:34:00)Если в функции делаю так:
Sp:=TStringList.Create;
Sp:=TreeNode.Data;
То при повторном обращении выскакивает AV. Как быть? Могу привести функцию полностью.
Profi (2005-10-03 14:02:00) [1]Amoeba © (03.10.05 13:52) [9]
Отличная мысль! Спасибо!
Vladimir88 (03.10.05 14:01) [11]
Уже исправил! Сделал так Sp.AddStrings(TreeNode.data);
Vladimir88 (2005-10-03 14:01:00) [2]//if TreeView.Items[i].Data<>nil
имхо лучше
if Assigned(TreeView.Items[i].Data);
//Sp:=TreeNode.Data;
хм, просто назначать пойнтер стринглисту имхо есть неправильно
Sp:=TStrings(TreeNode.Data);
Vladimir88 (2005-10-03 14:00:00) [3]//if TreeView.Items[i].Data<>nil
имхо лучше
if Assigned(TreeView.Items[i].Data);
//Sp:=TreeNode.Data;
хм, просто назначать пойнтер стринглисту имхо есть неправильно
Sp:=TStrings(TreeNode.Data);
Amoeba (2005-10-03 13:52:00) [4]
> Дело в том. Что если где-то в программе я опять сделаю Sp:
> =TreeNode.Data вот тогда-то и выскакивает AV.
Не надо так делать! Тем более, если ты profi.
Profi (2005-10-03 13:50:00) [5]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.
begin...end (2005-10-03 13:46:00) [6]> Profi © (03.10.05 13:45) [6]
А в чём смысл всего этого?
Profi (2005-10-03 13:45:00) [7]begin...end © (03.10.05 13:43) [5]
1. Sp:=TStringList.Create можно не писать?
2. Дело в том. Что если где-то в программе я опять сделаю Sp:=TreeNode.Data вот тогда-то и выскакивает AV.
begin...end (2005-10-03 13:43:00) [8]> Profi © (03.10.05 13:39) [3]
> откуда она?
> Sp:=TStringList.Create
Сохраняем ссылку на только что созданный объект в переменной Sp.
> Sp:=TreeNode.Data
Затираем эту ссылку значением свойства TreeNode.Data. Предыдущая ссылка потеряна.
Amoeba (2005-10-03 13:42:00) [9]
> Я это понимаю, но откуда она? И как этого избежать?
Как откуда? Она просто обязана быть в таком коде. Включи мозги!
Profi (2005-10-03 13:39:00) [10]begin...end © (03.10.05 13:37) [2]
Я это понимаю, но откуда она? И как этого избежать?
begin...end (2005-10-03 13:37:00) [11]> Profi © (03.10.05 13:34)
> Sp:=TStringList.Create;
> Sp:=TreeNode.Data;
Утечка памяти.
Amoeba (2005-10-03 13:36:00) [12]
> Могу привести функцию полностью.
Не просто можно, но обязательно нужно.