Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.07.2014, 21:31
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию Помогите оптимизировать работу TreeView

Здравствуйте.
Результат работы программы:
1-Поиск музыкальных файлов.
2-Сортировка по первой букве исполнителей и и добавление имен исполнителей.
Вывод в TreeView.

Программа рабочая, но, написана она мною очень криво.
Вложение 4376
Помогите, пожалуйста, упростить(оптимизировать, устранить ошибки) код, УСКОРИТЬ РАБОТУ.

Конкретно интересует Button1Click. Ее не выкладываю - слишком большая.

Не ругайте и не смейтесь - в программирование я .......

Спасибо.

Исходник: Вложение 4375

Последний раз редактировалось Stalker2-42, 20.08.2014 в 20:44.
Ответить с цитированием
  #2  
Старый 13.07.2014, 22:59
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вот что-то по теме
Ответить с цитированием
  #3  
Старый 13.07.2014, 23:44
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Вот что-то по теме

Не совсем то. У вас ищет и результат выводит в ListBox.
У меня выводит в TreeView сортированный по буквам и по исполнителямю.
Ответить с цитированием
  #4  
Старый 14.07.2014, 14:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А плеер смотрели?, там как раз в TV заполнение происходит, причём по всем канонам, с бегинапдейт/ендапдейт. Или вы хотите чтоб кто-то все за вас собрал - кому только это надо даже догадок нет
Ответить с цитированием
  #5  
Старый 14.07.2014, 15:20
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Или вы хотите чтоб кто-то все за вас собрал - кому только это надо даже догадок нет

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

Код:
procedure TForm1.GetAllFiles(Path: string);
var
 sRec: TSearchRec;
 isFound: boolean;
begin
  Panel1.Caption := 'Создание списка адресов';
  isFound := FindFirst( Path + '\*.*', faAnyFile, sRec ) = 0;
  while isFound do
    begin
      if ( sRec.Name <> '.' ) and ( sRec.Name <> '..' ) then
        begin
          if ( sRec.Attr and faDirectory ) = faDirectory then
            GetAllFiles(Path + '\' + sRec.Name);
          if CheckFileExt(sRec.Name) then
            begin
              IdTag.LoadFile(Path + '\' + sRec.Name);

              if IdTag.Loaded and IdTag.TagExists and (IdTag.tag.Genre <> '') and (IdTag.tag.Genre <> ' ') then
                LbItogGanre.Add(AnsiUpperCase(IdTag.tag.Genre)); //добавляет все найденные на диске жанры

              if IdTag.Loaded and IdTag.TagExists then     //добавляет имена исполнителей
                LBArtist.Add(AnsiUpperCase(IdTag.tag.Artist));

              LBAdressTrack.Add(Path + '\' + sRec.Name); //добавляет адреса
            end;
          Gauge1.MaxValue :=  Gauge1.Width + LBAdressTrack.Count;
          Gauge1.Progress := LBAdressTrack.Count;
        end;
      isFound := FindNext( sRec ) = 0;
    end;
  FindClose( sRec );
end;

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  b, n, i : Integer;
  st : string;
begin
Button1.Enabled := False;
  LBArtist.Clear;
  LbNoArt.Clear;
  LBAdressTrack.Clear;
  lbnotag.Clear;
  LbItogGanre.Clear;
  LBArtistAlfavit.Clear;

  GetAllFiles('E:\Music');

  TreeView2.Items.BeginUpdate;
  TreeView2.Items.Clear;
  Panel1.Caption := 'Создание списка "Исполнители"';

  TreeView2.Items.Add(nil,'Исполнители');

  for b := 0 to LBArtist.Count - 1 do //извлекаем первые буквы исполнителя
    begin                                     // и создаем список 
      st := LBArtist[b];
      LBArtistAlfavit.Add(st[1]);
    end;

  Gauge1.MaxValue := LBArtist.Count + LBArtistAlfavit.Count + LBAdressTrack.Count;

  for b := 0 to LBArtistAlfavit.Count - 1 do  //а здесь заполняем treeview
    begin
      Gauge1.Progress := b;
      TreeView2.Items.AddChild(TreeView2.Items[0], LBArtistAlfavit[b]) ; 
    end;

  for b := 0 to LBArtist.Count - 1 do   //здесь сравниваем первую букву исполнителя
    begin
      Gauge1.Progress := LBArtistAlfavit.Count + b;
      st := LBArtist[b];
      for i := 0 to LBArtistAlfavit.Count - 1 do
        if st[1] = LBArtistAlfavit[i] then  //и если совпало, добавляем в нужную
          TreeView2.Items.AddChild(TreeView2.Items[0].Item[i], LBArtist[b]);
    end;


// вот здесь и хотелось бы узнать, можно ли упростить?
  for n := 0 to LBAdressTrack.Count - 1 do //здесь бегаем по адресам файлов 
    begin
      Gauge1.Progress := LBArtistAlfavit.Count + LBArtist.Count + n;
      IdTag.LoadFile(LBAdressTrack.Strings[n]);   //и читаем теги
      for b := 0 to TreeView2.Items[0].Count - 1 do
        for I := 0 to TreeView2.Items[0].Item[b].Count - 1 do
          if IdTag.Loaded and (AnsiUpperCase(IdTag.tag.Artist) = TreeView2.Items[0].Item[b].Item[i].Text) then
            TreeView2.Items.AddChild(TreeView2.Items[0].Item[b].Item[i], LBAdressTrack.Strings[n])
          else
            if not IdTag.Loaded or not idtag.TagExists then
              LbNoArt.Add(LBAdressTrack.Strings[n]);
    end;
   if LbNoArt.Count <> 0 then
    begin
      Gauge1.MaxValue := LBArtist.Count + LBArtistAlfavit.Count + LBAdressTrack.Count + LbNoArt.Count - 1;
      TreeView2.Items.AddChild(TreeView2.Items[0], 'Не определены (Без "Исполнителя")');
      for n := 0 to LbNoArt.Count - 1 do
        begin
          Gauge1.Progress := LBAdressTrack.Count + LBArtist.Count + LBArtistAlfavit.Count + n;
          TreeView2.Items.AddChild(TreeView2.Items[0].Item[TreeView2.Items.Item[0].Count-1], LbNoArt.Strings[n]);
        end;
    end;

  TreeView2.Items.EndUpdate;
  Gauge1.MaxValue :=  0;
  Gauge1.Progress := 0;
  Panel1.Caption := '';
  Button1.Enabled := True;
end;



Если никто не хочет помочь, прошу удалить тему.

Последний раз редактировалось Stalker2-42, 15.07.2014 в 02:48.
Ответить с цитированием
  #6  
Старый 15.07.2014, 04:47
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Упростить - явно можно.
1. Не надо делать 2 прохода, сначала искать файлы, а потом еще раз по этому же списку проходиться и уже добавлять в дерево. Нашел файл - добавь сразу.
2. Тоже самое относится к самому добавлению. Нашел точку добавления (если готовой нет, то создал), добавил файл и сразу рекурсией обновил цифирки в вышестоящих узлах.

ЗЫ. Можно хранить разные данные в свойстве узлов data, только чистить за собой не забывать. Я для этого завожу список TObjectList в режиме владения объектами. Тогда легко чистить просто очищая сначала список, потом дерево (или наоборот).
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Stalker2-42 (15.07.2014)
  #7  
Старый 17.07.2014, 16:56
Аватар для Stalker2-42
Stalker2-42 Stalker2-42 вне форума
Новичок
 
Регистрация: 28.09.2013
Сообщения: 94
Версия Delphi: 2010
Репутация: 10
По умолчанию

lmikle

Здравствуйте. Можете привести любой пример с Data?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:48.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025