Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

Проблема при работе с TreeView   Найти похожие ветки 

 
Profi ©   (2005-08-28 18:16) [0]

Может я некорректо создал пост, тогда извините. Просто хочу обьяснить суть проблемы.\

Код:

 Repeat
   inc(i);
   Sp:=TStringList.Create;
   if TreeView.Items[i].data<>nil then
     Sp:=TreeView.items[i].data
   else begin
     if TreeView.Items[i].getFirstChild=nil then begin
       If TreeView.Items[i].Parent.getFirstChild=TreeView.Items[i] then Begin
         TreeView.Items[i].Delete;
         i:=i-2;
       end else begin
         TreeView.Items[i].Delete;
         i:=i-1;
       end;
     end;
     Continue;
   end;
   est:=false;
   if Sp.Count<0 then continue;
   For j:=0 to Sp.Count-1 do
     if pos(FileName,Sp.Strings[j])>0 then begin
       est:=true;
       Break;
     end;
     if not est then begin
       if TreeView.Items[i].getFirstChild=nil then begin
         If TreeView.Items[i].Parent.getFirstChild=TreeView.Items[i] then Begin
           TreeView.Items[i].Delete;
           i:=i-2;
         end else begin
           TreeView.Items[i].Delete;
           i:=i-1;
         end;
       end else
         TreeView.Items[i].Data:=nil;
     end;
   Sp.Free;
 Until i>=TreeView.Items.Count-1;


Код нужен для того, что бы удалять все Item"ы, в Data которых нет строки FileName. При этом надо сохранить древовидность. Когда находится Item, в котором есть FileName, он не удаляется. При удалении следующего Item"а цикл возвращается к предыдущему (из-за вложенности) и тогда-то и возникает AV при попытке

For i:=0 to SP.Count-1

Целый день бьюсь, может, просто глупую ошибку не вижу


 
jack128 ©   (2005-08-28 20:40) [1]

Profi ©   (28.08.05 18:16)
При этом надо сохранить древовидность

Не понятна эта фраза, но задача
Profi ©   (28.08.05 18:16)
Код нужен для того, что бы удалять все Item"ы, в Data которых нет строки FileName.
решается так:

var
 i, j: Integer;
 f: boolean;
begin
 i := TV.Items.Count - 1;
 while i >= 0 do
 begin
   sp := TV.Items[i].Data;
   f := False;
   for j := 0 to sp.Count - 1 do
   begin
     f := pos(FileName, sp.Strings[j]) > 0;
     if f then Break;
   end;
   if not f then
     TV.Items.Delete(TV.Items[i]);
   dec(i);
   if i >= TV.Items.Count then
     i := TV.Items.Count - 1;
 end;
end;


 
Profi ©   (2005-08-28 21:06) [2]

jack128 ©   (28.08.05 20:40) [1]
Предположим, что у нас есть:

-1
--2
--3
---4

В 4 есть FileName, а в 3 и 1 нет. Ваш код сразу удалит 1, а этого делать нельзя. Поэтому При этом надо сохранить древовидность.


 
jack128 ©   (2005-08-28 21:50) [3]

а-а-а..  
Правда не очень понятно, как с этим связана древовидность, ну да ладно..
Что нить типа этого...

 function DeleteIfNotExistsFilename(ANode: TTreeNode; const AFilename: string): boolean;
 var
   i, j: Integer;
   sl: TStrings;
   f: boolean;
 begin
   Result := False;
   for i := ANode.Count - 1 downto 0 do
     DeleteIfNotExistsFilename(ANode.Item[i], AFileName);
   if ANode.Count <= 0 then
   begin
     sl := ANode.Data;
     f := False;
     for i := 0 to sl.Count - 1 do
     begin
       f := pos(AFilename, sl[i]);
       if f then Break;
     end;
     if not f then
     begin
       ANode.Delete;
       Result := True;
     end;
   end;
 end;
var
 i: Integer;
 Run: TTreeNode;
begin
 Run := TV.Items.GetFirstNode;
 while Assigned(Run) do
 begin
   if DeleteIfNotExistsFilename(Run, FileName) then
     Run := TV.Items.GetFirstNode
   else
     Run := Run.getNextSibling;
 end;
end;


ps Не тестил..


 
jack128 ©   (2005-08-28 22:58) [4]

оп-с.. глюк.

var
i: Integer;
Run, NextRun: TTreeNode;
begin
SaveRun := nil;
Run := TV.Items.GetFirstNode;
while Assigned(Run) do
begin
  NextRun := Run.getNextSibling;
  DeleteIfNotExistsFilename(Run, FileName);
  Run := NextRun;
end;
end;


 
jack128 ©   (2005-08-28 23:00) [5]

jack128 ©   (28.08.05 22:58) [4]
SaveRun := nil;
- это лишнее естественнно.

var
 i: Integer;
 Run, NextRun: TTreeNode;
begin
 Run := TV.Items.GetFirstNode;
 while Assigned(Run) do
 begin
   NextRun := Run.getNextSibling;
   DeleteIfNotExistsFilename(Run, FileName);
   Run := NextRun;
 end;
end;


 
Profi ©   (2005-08-29 00:49) [6]

Спасибо! Но уже сделал сам. Пошел от обратного. Сначала проверял самые глубокие Item"ы, потом повыше и т.д. Просто еще замес, что это функция в движке базы данных, так что там еше и другие запарки есть. Но все равно спасибо.


 
jack128 ©   (2005-08-29 00:53) [7]

Profi ©   (29.08.05 0:49) [6]
Сначала проверял самые глубокие Item"ы, потом повыше и т.д.

ну вобщем то так и надо, я как раз это и делаю.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.01 c
5-1099315596
PRM
2004-11-01 16:26
2005.09.18
Как получить список допустимых констант для перечисления


1-1124864836
Dr. Andrew
2005-08-24 10:27
2005.09.18
Как записать в *.ini файл свойство шрифта Style?


4-1122287537
AxelBlack
2005-07-25 14:32
2005.09.18
Вопрос об использовании параметров WM_SysCommand в Perform


14-1124261289
Lexer
2005-08-17 10:48
2005.09.18
Посоветуйте стиральную машину


4-1122055520
Ученик
2005-07-22 22:05
2005.09.18
Зависание Thread-ов в функциях TMemoryManager (Delphi 2005)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский