![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Здравствуйте.
Результат работы программы: 1-Поиск музыкальных файлов. 2-Сортировка по первой букве исполнителей и и добавление имен исполнителей. Вывод в TreeView. Программа рабочая, но, написана она мною очень криво. Вложение 4376 Помогите, пожалуйста, упростить(оптимизировать, устранить ошибки) код, УСКОРИТЬ РАБОТУ. Конкретно интересует Button1Click. Ее не выкладываю - слишком большая. Не ругайте и не смейтесь - в программирование я ....... Спасибо. Исходник: Вложение 4375 Последний раз редактировалось Stalker2-42, 20.08.2014 в 20:44. |
#2
|
||||
|
||||
![]() Вот что-то по теме
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#4
|
||||
|
||||
![]() А плеер смотрели?, там как раз в TV заполнение происходит, причём по всем канонам, с бегинапдейт/ендапдейт. Или вы хотите чтоб кто-то все за вас собрал - кому только это надо даже догадок нет
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#5
|
||||
|
||||
![]() Цитата:
Я же писал "Программа рабочая, но, написана она мною очень криво.". Мне бы хотелось бы получить советы, что и где исправить , изменить- Код:
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
|
|||
|
|||
![]() Упростить - явно можно.
1. Не надо делать 2 прохода, сначала искать файлы, а потом еще раз по этому же списку проходиться и уже добавлять в дерево. Нашел файл - добавь сразу. 2. Тоже самое относится к самому добавлению. Нашел точку добавления (если готовой нет, то создал), добавил файл и сразу рекурсией обновил цифирки в вышестоящих узлах. ЗЫ. Можно хранить разные данные в свойстве узлов data, только чистить за собой не забывать. Я для этого завожу список TObjectList в режиме владения объектами. Тогда легко чистить просто очищая сначала список, потом дерево (или наоборот). |
Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
Stalker2-42 (15.07.2014)
|
#7
|
||||
|
||||
![]() lmikle
Здравствуйте. Можете привести любой пример с Data? |