Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление в дереве, выделенных веток 
:(
    Опции темы
Akella
  Дата 13.12.2005, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



В дереве можно выделить несколько веток (правда выделение мышкой проблемное), так вот, как удалить выделенные ветки? smile

smile
PM MAIL   Вверх
Albinos_x
Дата 13.12.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



так не прокатывает?
Код
...
TreeView1.Selected.Delete;
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Akella
Дата 13.12.2005, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



мне нужно удалить не один, а несколько выделенных, возможно, что выделенных не подряд узлов.
Повторюсь, что нужет пример удаления выделенных (не подряд) узлов в дереве.
PM MAIL   Вверх
_hunter
Дата 13.12.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



примерно так:
for ( int item = 0; item < treeView->SelectionCount; item++ )
treeView->Items->Delete(treeView->Selections[item]);



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Akella
Дата 13.12.2005, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



вечером попробую
Добавлено @ 12:33
только в Delphi, наверное компилятор заставит что-то подставить, типа:

TreeView1.Items[index:integer].Delete

?? и что подставить вместо индекса?
PM MAIL   Вверх
Snowy
Дата 13.12.2005, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код

for i:=0 to TreeView1.SelectionCount-1 do
  TreeView1.Selections[i].Delete;

PM MAIL   Вверх
Albinos_x
Дата 13.12.2005, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



наверно так:
Код
...
var i:integer;
begin
for i:=0 to TreeView1.SelectionCount do
    TreeView1.Selected.Item[i].Delete;
...


Это сообщение отредактировал(а) Albinos_x - 13.12.2005, 12:53


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
_hunter
Дата 13.12.2005, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



щас проверил
treeView.Items.Delete()
работает


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Albinos_x
Дата 13.12.2005, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 26
Всего: 108



упс ... когда писал предыдущего поста не было... smile


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Snowy
Дата 13.12.2005, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Я не проверял, но вероятно нужна будет защина на случай, если в списке выделенных есть подузлы, выделенного узла.
При удалении узла - удаляются все подузлы.
Так что есть вероятность, что мы попытаемся удалить уже несуществуюшую ветку.
Вероятно так будет корректней:
Код

while TreeView1.Selected<>nil do begin
  TreeView1.Selected.Delete;
  Application.ProcessMessages;
end;

PM MAIL   Вверх
Akella
Дата 26.12.2005, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Snowy
Цитата(Snowy @ 13.12.2005, 12:43)
1:
2:

for i:=0 to TreeView1.SelectionCount-1 do
  TreeView1.Selections[i].Delete;


List index is out of bounds smile

Добавлено @ 13:16
Цитата(Snowy @ 13.12.2005, 13:18)
Я не проверял, но вероятно нужна будет защина на случай, если в списке выделенных есть подузлы, выделенного узла.
При удалении узла - удаляются все подузлы.
Так что есть вероятность, что мы попытаемся удалить уже несуществуюшую ветку.
Вероятно так будет корректней:

код Pascal/Delphi
1:
2:
3:
4:

while TreeView1.Selected<>nil do begin
  TreeView1.Selected.Delete;
  Application.ProcessMessages;
end;

удаляются все!!! ветви из дерева, но радует, что без ошибок
Добавлено @ 13:18
Цитата(_hunter @ 13.12.2005, 12:58)
щас проверил
  treeView.Items.Delete()ж;
работает


[Error] uMain.pas(499): Not enough actual parameters
PM MAIL   Вверх
_hunter
Дата 26.12.2005, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 15
Всего: 98



так там ноду указать нужно:
treeView.Items.Delete(treeView.Selections[0]);
+ возможно treeView.Items.BeginUpdate() перед удалением вызвать нужно ( чтобы переиндексацию не проводить )



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Snowy
Дата 26.12.2005, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(dsergey @ 26.12.2005, 13:14)
List index is out of bounds

Только при выделении подузлов. О чем я и говорил.
Вот несколько более громоздкое решение, но рабочее.
Код

var
  i: integer;
  lst: TList;
begin
  lst:=TList.Create;
  for i:=TreeView1.SelectionCount-1 downto 0 do
    lst.Add(TreeView1.Selections[i]);
  for i:=0 to lst.Count-1 do
    TTreeNode(lst[i]).Delete;
  lst.Free;
end;

PM MAIL   Вверх
Quadr0
Дата 26.12.2005, 23:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 02:58
  Вверх
Snowy
Дата 27.12.2005, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(Quadr0 @ 26.12.2005, 23:58)
Работает без запинок.

В том-то и проблема, что с запинками.
Только что проверил - если мы выделяем подузлы, то удаляет лишнее.
Все дело в волшебных пузырьках, т.е. в подузлах.
Я уже по разному пробовал - Selections модифицируется и вся логика начинает хромать на 3 ноги.
Вот, как надежный вариант - сделал слепок состояния, а потом прибиваю по состоянию на исходный момент, чтобы уйти от этой динамики.
PM MAIL   Вверх
Girder
Дата 27.12.2005, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Код
var i:integer;
function Ch_Par(T:TTreeNode):Boolean;
begin
 Result:=false;
 if T=nil then exit;
 Result:=T.Selected;
 if Result=false then Result:=Ch_Par(T.Parent);
end;
begin
 for i:=TreeView1.SelectionCount-1 downto 0 do
  if Ch_Par(TreeView1.Selections[i].Parent)=false then TreeView1.Selections[i].Delete;
end;



--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 27.12.2005, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Так что, получается, что "нормально" никак нельзя удалить выделенные узлы, что-ли?
PM MAIL   Вверх
Akella
Дата 27.12.2005, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Girder

вроде без ошибок, но удаляет даже если ничего не выделенно, поковыряю
PM MAIL   Вверх
Snowy
Дата 27.12.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Цитата(dsergey @ 27.12.2005, 14:04)
Girder
вроде без ошибок, но удаляет даже если ничего не выделенно

Сыпется. List index of bounds...
Добавлено @ 14:13
И бывает удаляет ненужное.
PM MAIL   Вверх
Girder
Дата 27.12.2005, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Код
 TreeView1.Select(TreeView1.Items.AddChild(nil,'sdf'),[ssCtrl]);
 while (TreeView1.SelectionCount>1) do
  TreeView1.Selections[TreeView1.SelectionCount-1].Delete;
 TreeView1.Selected.Delete;


PS: msControlSelect=true


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 29.12.2005, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Girder, класс с меня +

этот код с форума на исходниках, вроде тоже работает, но размер кода smile
Код

function HasAsParent(Node, PotentialParent: TTreeNode): Boolean;
begin
  Node := Node.Parent;
  while (Node <> nil) and (Node <> PotentialParent) do
    Node := Node.Parent;
  Result := Node = PotentialParent;
end;

procedure DeleteAllSelected_Jack128(TV: TTreeView);
var
  List: TList;
  I, J: Integer;
  F: boolean;
begin
  List := TList.Create;
  try
    List.Capacity := TV.SelectionCount;
    for I := 0 to TV.SelectionCount - 1 do
    begin
      // Ищем, может кого из родителей уже занесли в список на выбывание ;)
      F := False;
      for J := 0 to List.Count - 1 do
      begin
        F := HasAsParent(TV.Selections[I], TTreeNode(List[J]));
        if F then Break;
      end;
      if F then // Родителя удалят, так что текущий узел удалять не нужно
        Continue;
      // Теперь нужно удалить всех детей, которые уже были записаны в список
      for J := List.Count - 1 downto 0 do
        if HasAsParent(TTreeNode(List[J]), TV.Selections[I]) then
          List.Delete(J);
      // Вот теперь можно со спокойной душей добовлять узел в список..
      List.Add(TV.Selections[I])
    end;
    for I := 0 to List.Count - 1 do
      TTreeNode(List[I]).Delete;
  finally
    List.Free;
  end;
end;

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.