Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1128433357
Trigun
2005-10-04 17:42
2005.10.23
Проведение выделенки. Есть ли подводные камни в быстром потоке?


6-1120482867
sunsay
2005-07-04 17:14
2005.10.23
Как узнать сколько байт собирается мне (клиенту) передать сервер


2-1128193671
NikNet
2005-10-01 23:07
2005.10.23
Можно ли положить PupupMenu как панель


2-1128030842
Буги Буги
2005-09-30 01:54
2005.10.23
Memo


14-1128218710
Deep
2005-10-02 06:05
2005.10.23
Просьба к владельцам КПК





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский