Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.18;
Скачать: CL | DM;

Вниз

Проблема при работе с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.035 c
5-1099405102
AZ
2004-11-02 17:18
2005.09.18
Создание ComboBox а для компонента


5-1099127371
Arnold
2004-10-30 13:09
2005.09.18
Наследник от TStringGrid


1-1125085182
Василий
2005-08-26 23:39
2005.09.18
Компоненты


2-1123743998
kyn66
2005-08-11 11:06
2005.09.18
Как найти .... незнаю как назвать.


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