Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > удаление элементов в TreeView и ListBox


Автор: Delphiec 5.8.2010, 20:30
привет всем!
такая проблема:
делаю помощника в котором TrееView  и ListBox. файлы (не папки) заносимые и сохраненные в TreeView отражаются в ListBox.
при удалении выделенного элемента в TreeView должен удалятся соответствующий элемент и в ListBox.
но у меня так не получается, в ListBox  удаляется выделенный элемент.
как сделать чтобы в ListBox удалялся именно соответствующий TreeView элемент?

код такой 

Код

//------------------------ удаляем элемент ---------------------------


procedure TForm1.SpeedButton6Click(Sender: TObject);
 var k: integer;
begin

if TreeView1.Selected <> nil then                // если дерево выделено
begin
if TreeView1.Selected.HasChildren then     // если имеются дети
begin
for k:= 0 to TreeView1.Items.Count - 1 do                            // то идет цикл по всем элементам дерева чтобы удалить вложенные файлы
                                                                                                                                               
DeleteFile('а3\' + TreeView1.Items.Item[k].Text + '.txt');

end

else
DeleteFile('а3\' + TreeView1.Selected.Text + '.txt');    // удаляю файл в каталоге (а3)

TreeView1.Items.Delete(TreeView1.Selected);       // удаляю эл. дерева
ListBox1.Items.Delete(ListBox1.ItemIndex);           //   удаляю эл. ListBox  (думаю  ошибка тут)
Memo1.Lines.Clear;
end

else
showmessage('а че удалять то? ');
end;


в коде еще есть  проблма с удалением вложенных файлов
если в TreeView папок нет  (т.е. эл. дерева = эл. ListBox = имя файла), то все нормально,
но если файл в TreeView  вложен в папки, то цикл (в коде) удаляет все сохраненные файлы в каталоге (а3).

помогите пожалста разобраться с этим.
может перепишите по другому код.   smile 
заранее спасибо   

Автор: Чoо 16.8.2010, 23:58
Код

ListBox1.Items.Delete(ListBox1.ItemIndex);           //   удаляю эл. ListBox  (думаю  ошибка тут)

ошибка тут. А если ни один элемент не выделен, то вообще ни чего не удаляется с листбокса? smile
вобщем, думаю лучше было бы сделать следующим образом:
Перед тем, как удялять узел в дереве TreeView получаем имя файла из него, затем ищем это имя в листбоксе и удаляем его
Код

  i:=0;
  find:=FALSE;
  while (i<ListBox1.Items.Count) and (not find) do 
    if ListBox1.Items[i]=FileName then begin
      find:=TRUE;
      ListBox1.Items.Delete(i);
    end
    else inc(i);



А затем удаляем и элемент в TreeView. 
по самому коду: пользуйтесь отступами, читаемость кода повышается в несколько раз

Автор: Чoо 17.8.2010, 00:25
Delphiec,  честно говоря лень ковырять TreeView, я этим компонентом ни разу не пользовался (вместо него использую VirtuelTreeView) поэтому полностью подправить код не могу.
Ну а так, прочитайте комментарии в коде, может помогут:
Код

var
 k: integer;
 find:boolean;
begin
  if TreeView1.Selected <> nil then                // если дерево выделено
  begin
    if TreeView1.Selected.HasChildren then     // если имеются дети
      for k:= 0 to TreeView1.Items.Count - 1 do                            // то идет цикл по всем элементам дерева чтобы удалить вложенные файлы
        DeleteFile('а3\' + TreeView1.Items.Item[k].Text + '.txt')
        {^^а почему удаляем из директории а3? я так понимаю, все дочерние
        элементы прнадлежат директории, указанной в родительском узле?
        так же вопрос:
          мы должны получать имена файлов, хранящикся в дочерних элементах
          TreeView1.Selected?}
    else
      DeleteFile('а3\' + TreeView1.Selected.Text + '.txt');    // удаляю файл в каталоге (а3)

    k:=0;
    find:=FALSE;
    while (i<ListBox1.Items.Count) and (not find) do
      if ListBox1.Items[k]=TreeView1.Selected.Text + '.txt' then begin
        find:=TRUE;
        ListBox1.Items.Delete(k);
      end
      else inc(k);
    TreeView1.Items.Delete(TreeView1.Selected);       // удаляю эл. дерева
    Memo1.Lines.Clear;
  end
  else
    showmessage('а че удалять то? ');
end;

(не пойму, почему в опере синтаксис не подсвечивается)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)