| Autor |
Beitrag |
Solid Snake
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: So 07.08.05 22:57
Hi
Ich bin noch ein relativer Anfänger was Delphi angeht und wollte mal ein für mich sehr nützliches Tool schreiben!
Das Programm soll meine ganzen MP3’s Sortieren
Zum Programm Ablauf:
Man gibt den Ordner an in dem Die Unsortieren MP3’s liegen und einen in dem die MP3’s nach Interpreten einsortiert werden sollen!
Durch einen Klick auf den Button „Suchen“ werden alle MP3’s in dem „Unsortiert“ Ordner gesucht und in einer ListBox aufgelistet und gezählt!
===> Das klappt auch schon soweit
Anschließend sollen die MP3’s durch einen Klick auf den Button „Sortieren“ in dem vorher ausgewählten Ordner nach Ihrem Interpret sortiert werden!
Meine MP3’s sind alle nach folgendem Muster aufgebaut:
Interpret – Titel zwischen jedem Interpreten und Titel steht ein “ – “
z.B. ACDC – Thunderstruck.mp3
oder Children of Bodom – Silent Night, Bodom Night.mp3
Das Programm soll nun den Dateinamen Zerlegen so dass nur noch der Interpret übrig bleibt!
(Pfad, “ – “ und alles was dahinter steht muss weg)
Damit man nur noch den Interpreten hat!
Nun soll Überprüft werden ob im „Sortiertem Verzeichnis“ schon ein Ordner mit diesem Namen besteht wenn ja dann Datei Kopieren wenn nicht, dann Ordner Erstellen und Datei Kopieren!
Und das mit allen MP3’s die sich in der ListBox befinden!
Ich habe hier im Forum schon sehr viel gelesen aber mit dem Sortieren komme ich einfach nicht weiter!
Im Anhang habe ich mal den kompletten Source Code angehangen von dem was ich bis jetzt geschafft habe!
Ich würde mich sehr freuen wenn ihr mal über den Code schaut und mir eventuell allgemeine Tipps bzw. Verbesserungsvorschläge zum bestehenden Code geben könntet!
Denn ich denke mal da sind noch so einige Fehler drin
Des Weiteren komme ich mit dem Sortieren der MP3’s ja nicht weiter!
Wie schon erwähnt habe ich hier im Forum schon sehr viel gelesen aber irgendwie klappt das alles noch nicht so recht!
Es währe schön wenn ihr mir da helfen könntet am besten mit etwas SourceCode
Danke schon mal im Voraus!
mfg
Solid Snake
Einloggen, um Attachments anzusehen!
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
Calyptus
      
Beiträge: 386
Win Xp Prof
D3, D6 Pers, D7 Ent
|
Verfasst: Mo 08.08.05 00:00
Zum Interpret:
Delphi-Quelltext 1:
| Interpret := Copy(Dateiname, 0, Pos('-')-1); |
(hoff ich doch...)
_________________ Luft- und Raumfahrtechnik an der Uni Stuttgart
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mo 08.08.05 03:27
sowas ähnliches habe ich auch mal gecodet: dabei werden verz.strukturen mit mp3s in eine access datenbank geschrieben, anhand derer man dann z.b. doppelte dateien aus einer 2. verz.struktur löschen kann, oder unterordner mit dem artist anlegen
dazu muss noch ne active-x datei einbinden, wie das geht steht hier ADODB_TLB.PAS
Einloggen, um Attachments anzusehen!
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Solid Snake 
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Di 09.08.05 06:16
@retnyg
Dein Programm ist doch schon wesentlich komplexer als meins eigentlich werden sollte und so ganz blicke ich da auch net durch!
Im Prinzip brauche ich ja nur eine funktion die mir den Interpreten aus der ListBox Extrahiert und dann wenn nötig einen Ordner anlegt und die Datei dann kopiert und das wiederum mit allen Dateien die sich in der ListBox befinden!
So wie ich hier gelesen habe muss man das meiner meinung nach mit einer "repeat-until-Schleife" und "ExtractFilePath" machen aber das kapier ich irgendwie net so richtig wie ich das genau machen muss!
Ich währe dankbar um etwas Source Code das für mein kleines Programm zutreffend währe und ein paar kleinen kommentaren wieso, weshalb und warum!
Denn ich bin hier echt völlig am verzweifeln
Hilfe 
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Di 09.08.05 10:42
die 2 prozeduren sind aus obigem quellcode:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function getinterpret(pfad:string):string; begin result:=copy(pfad,0, pos('-',pfad) -1); if result = '' then result := pfad else result:=trim(result); end;
function getalbum(pfad:string):string; var s: string; begin s:=copy(pfad,pos('-',pfad) + 1, length(pfad)); result:=trim(s); end; |
und anzuwenden so:
Delphi-Quelltext 1:
| interpret := getinterpret( extractFileName ( myMp3File ) ); |
aus meinem programm wirst du vielleicht schlauer wenn du mal einen ordner scannst und dir danach den inhalt der access-datenbank ansiehst... falls du kein access hast müsste es auch möglich sein die datenbank in excel zu importieren.
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Solid Snake 
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Di 09.08.05 19:33
Habe jetzt mal folgendes Probiert!
Ich wollte die ListBox durch gehen und mir nacheinander die Interpreten in einem Label anzeigen lassen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure TMain_Form.Timer1Timer(Sender: TObject); var interpret : String; Mp3File : integer; Mp3File2 : String; begin LB_Dateien.ItemIndex:=LB_Dateien.ItemIndex+1; Mp3File:=LB_Dateien.ItemIndex; Mp3File2 := IntToStr(Mp3File); interpret := getinterpret( extractFileName (Mp3File2) ); Label1.Caption := Interpret; end; |
Geht aber irgendwie net!
Anstatt den Interpreten anzuzeigen, zeigt er mir nur 0 dann 1 usw. an!
Wenn ich aber bei der markierten stelle den Pfad zu einer MP3 angebe funktioniert es und ich bekomme den Interpreten angezeigt!
Wo liegt der Fehler?
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Di 09.08.05 20:20
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Solid Snake 
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Mi 10.08.05 12:46
So....
Nachdem ich die ganze nacht an meinem Programm gebastelt habe funktioniert es jetzt soweit
Doch ein kleines Problem habe ich da noch.
Wenn ich auf ein Item in der ListBox einen DoppelKlick mach öffnet sich eine zweite Form.
Auf der Form ist ein Edit Feld und ein Button. Im Editfeld wird der Dateiname angezeigt um ihn zu bearbeiten. Mit dem Button soll dann der Eintrag in der ListBox Aktualisiert werden aber auch der Dateiname der Original Datei auf der Festplatte soll entsprechend angepasst werden!
Das Mit der zweiten Form habe ich so gelöst:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TMain_Form.LB_DateienDblClick(Sender: TObject); var SelectedFile : string; FName : string; begin SelectedFile := LB_Dateien.Items.Strings[LB_Dateien.ItemIndex]; Form_EditFile.Show; FName := ExtractFileName( SelectedFile ); Form_EditFile.Edit_File.Text :=FName; end; |
Das klappt auch so wunderbar!
Doch ich schaffe es einfach nicht den Bearbeiteten Eintrag durch den Button Klick in der ListBox zu Aktualisieren und den Dateinamen der Original Datei entsprechend anzupassen!
Das muss doch irgendwie machbar sei?!
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Mi 10.08.05 13:49
für den interpreten würde ich lieber den id3tag auslesen, weil man die mp3s ja nennen kann wie man will 
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Mi 10.08.05 15:49
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Solid Snake 
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Mi 10.08.05 22:13
| Zitat: | für den interpreten würde ich lieber den id3tag auslesen, weil man die mp3s ja nennen kann wie man will
| Zitat: | ich hab hier 320 GB mp3s. weisst du bei wievielen die ID3 informationen richtig eingetragen sind ? maximal die hälfte. die dateinamen stimmen dafür bei allen, und bei den 1 % wo's anfangs nicht gepasst hat hab ichs halt nachgetragen. |
|
Genau so ist es bei mir auch
Das Suchen und Kopiren der MP3's klappt ja jetzt!
Suchen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TMain_Form.B_SearchClick(Sender: TObject); var unsortDir : String; begin LB_Dateien.Clear; unsortDir := Edit_Unsortiert.Text;
if CB_Subfolders.Checked then FindFiles (unsortDir, '*.mp3', True, LB_Dateien.Items) else FindFiles (unsortDir, '*.mp3', False, LB_Dateien.Items);
Label_Dateien_Gesamt.Caption:=Inttostr(LB_Dateien.Items.Count) + ' Dateien gefunden.';
B_Start.Enabled := True; end |
Kopieren:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| procedure TMain_Form.B_StartClick(Sender: TObject); var interpret : String; Mp3File : String; index : integer; sortDir : String; FName : String; ZuKopierendeD : String;
begin sortDir := Edit_Sortiert.Text+'\'; repeat LB_Dateien.ItemIndex:=LB_Dateien.ItemIndex+1; index:=LB_Dateien.ItemIndex; Mp3File := LB_Dateien.Items[index];
FName := ExtractFileName( Mp3File ); interpret := getinterpret( extractFileName ( Mp3File ) )+'\';
if DirectoryExists(sortDir+interpret) then else ForceDirectories (sortDir+interpret);
CopyFile (PAnsiChar(Mp3File), PAnsiChar(sortDir+interpret+FName), True);
ZuKopierendeD := IntToStr(LB_Dateien.Items.Count); if LB_Dateien.Items.Count > 0 then StatusBar.Panels[1].Text := ('Noch ' + ZuKopierendeD + ' Dateien') else StatusBar.Panels[1].Text := 'Fertig';
if LB_Dateien.Items.Count >0 then else Label_Dateien_Gesamt.Caption := '. : F E R T I G : .';
LB_Dateien.DeleteSelected; until LB_Dateien.Items.Count = 0;
end; |
Ein kleines Problem gibt es da aber noch.
Ich wollte in der StatusBar anzeigen wie viele Dateien noch austehen (makiert).
Das klapp auch so aber nur wenn ich das Auskomentierte drin habe! Sprich wenn immer die MessageBox kommt klappt das mit dem Runterzählen! Doch wenn die Weg ist Zeigt er nichts mehr an!
Desweiteren besteht ja das Problem mit dem Dateinamen ändern was ich in meinem letzten beitrag ja schon beschrieben habe.
Ich habe jetzt mal noch den kompletten SourceCode angehängt und hoffe ihr könnt mir mit den Problemen weiterhelfen!
Einloggen, um Attachments anzusehen!
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 11.08.05 13:35
Solid Snake hat folgendes geschrieben: |
Ein kleines Problem gibt es da aber noch.
Ich wollte in der StatusBar anzeigen wie viele Dateien noch austehen (makiert).
Das klapp auch so aber nur wenn ich das Auskomentierte drin habe! Sprich wenn immer die MessageBox kommt klappt das mit dem Runterzählen! Doch wenn die Weg ist Zeigt er nichts mehr an! |
liegt wahrscheinlich daran, dass delphi das formular nicht aktualisiert, während es arbeitet.
bau einfach ein application.processmessages; in deine repeat schleife ein.
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Solid Snake 
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Do 11.08.05 15:04
Cool danke jetzt klappt es!
Bleibt nur noch das Problem mit dem Dateinamen ändern!
Hast du/ihr dafür eventuell auch noch eine Lösung?
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Do 11.08.05 20:30
Solid Snake hat folgendes geschrieben: |
Auf der Form ist ein Edit Feld und ein Button. Im Editfeld wird der Dateiname angezeigt um ihn zu bearbeiten. Mit dem Button soll dann der Eintrag in der ListBox Aktualisiert werden aber auch der Dateiname der Original Datei auf der Festplatte soll entsprechend angepasst werden!
...
Doch ich schaffe es einfach nicht den Bearbeiteten Eintrag durch den Button Klick in der ListBox zu Aktualisieren und den Dateinamen der Original Datei entsprechend anzupassen!
|
bin nicht ganz dahintergekommen was du willst, jedenfalls ist bei deinem projekt kein derartiges edit-feld zu finden, und dateinamen kriege ich auch keine angezeigt
übrigens:
| Zitat: | 01fernanda_porto_-_sambassim-alc.mp3
02-drumagick_-_easy_bddm-alc.mp3
03-max_de_castro_-_pra_voce_lembrar_(dj_patife_remix)-alc.mp3 |
usw...
wird bei deinem programm zu :
| Zitat: | C:\sorted\01fernanda_porto_-_sambassim-alc.mp3\01fernanda_porto_-_sambassim-alc.mp3
C:\sorted\02-drumagick_-_easy_bddm-alc.mp3\02-drumagick_-_easy_bddm-alc.mp3
C:\sorted\03-max_de_castro_-_pra_voce_lembrar_(dj_patife_remix)-alc.mp3\03-max_de_castro_-_pra_voce_lembrar_(dj_patife_remix)-alc.mp3
|
sieht mir wie ein bug aus 
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
Solid Snake 
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Fr 12.08.05 07:08
| Zitat: | | bin nicht ganz dahintergekommen was du willst, jedenfalls ist bei deinem projekt kein derartiges edit-feld zu finden, und dateinamen kriege ich auch keine angezeigt |
Wenn man den "Unsortiert Pfad" und den "Sortiert Pfad" Angegeben hat und auf suchen klickt wird unten angezeigt wieviele MP3 Dateien gefunden wurden! Wechselt man dann auf den Reiter "Status" sieht man in einer ListBox die ganzen Dateien + Pfad etc. aufgelistet! Macht man nun einen Doppelklick auf einen Eintrag erscheint eine neue Form mit einem EditFeld und zwei Buttons! In dem EditFeld steht jetzt der Dateiname der MP3! Der eine Button ist zum Abbrechen und der Andere zum Speichern! Wenn mann jetzt den Dateinamen in dem EditFeld bearbeitet hat und auf den Button Speichern klickt soll der Eintrag in der ListBox Aktualisiert werden. Also anstatt des alten Dateinamen soll da jetzt der Dateiname erscheinen den man im EditFeld eingegeben hat!
Desweiteren muss natürlich auch der Dateiname der MP3 Datei im entsprechendem Verzeichniss geändert werden da er sonst die MP3 ja nicht mehr findet!
Der Bug den du beschrieben hast tritt deswegen auf weil das Programm bis jetzt nur MP3's richtig einsortiert die nach folgendem Muster aufgebaut sind!
z.B. 01fernanda_porto - sambassim-alc.mp3
Würde zu
C:\test\01fernando_porto\01fernanda_porto - sambassim-alc.mp3
Bis jetzt habe ich nur diesen einen Filter drin!
(Aber fals ihr noch ideen für andere Filter habt bzw. wie ich das besser lösen könnte immer raus damit!)
Um das Problem vorzubeugen wollte/will ich ja immernoch das man im Programm den Namen Anpassen kann damit solche Fehler nichtmehr Auftreten!
So ich hoffe jetzt habe ich das Problem mit dem Dateinamen verändern etwas besser erklärt und hoffe du/ihr habt dafür eine lösung parrat!
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
retnyg
      
Beiträge: 2754
SNES, GB, GBA, CPC, A500, 486/66, P4/3.0HT: NintendOS, AmigaOS, DoS
Delphi 5, Delphi 7
|
Verfasst: Fr 12.08.05 17:21
ich habe mir die freiheit genommen ein paar sachen zu ändern:
mainform: (neues onChange Ereignis bei beiden edit's)
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TMain_Form.LB_DateienDblClick(Sender: TObject); var SelectedFile : string; FName : string; begin SelectedFile := LB_Dateien.Items.Strings[LB_Dateien.ItemIndex]; Form_EditFile.Show; FName := ExtractFileName( SelectedFile ); Form_EditFile.Edit_File.Text :=FName; Form_EditFile.filename := selectedFile; end;
procedure TMain_Form.Edit_SortiertChange(Sender: TObject); begin if directoryexists(Edit_Unsortiert.text) and directoryexists(Edit_sortiert.text) then B_Search.Enabled := true else B_Search.Enabled := false end;
procedure TMain_Form.Edit_UnsortiertChange(Sender: TObject); begin if directoryexists(Edit_Unsortiert.text) and directoryexists(Edit_sortiert.text) then B_Search.Enabled := true else B_Search.Enabled := false end; |
2. form:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| type TForm_EditFile = class(TForm) Edit_File: TEdit; B_Close: TButton; B_Save: TButton; procedure B_CloseClick(Sender: TObject); procedure B_SaveClick(Sender: TObject); private public filename: string; end;
var Form_EditFile: TForm_EditFile; implementation
uses Main_Unit;
{$R *.dfm}
procedure TForm_EditFile.B_CloseClick(Sender: TObject); begin Close; end;
procedure TForm_EditFile.B_SaveClick(Sender: TObject); var f:file; s: string; begin s:= extractfilepath ( filename ) + Edit_file.text; assignfile(f,filename); rename(f, s ); Main_Form.LB_Dateien.Items.Strings[Main_Form.LB_Dateien.ItemIndex] := s; close; end; |
_________________ es gibt leute, die sind genetisch nicht zum programmieren geschaffen.
in der regel haben diese leute die regel...
|
|
F34r0fTh3D4rk
      
Beiträge: 5285
Erhaltene Danke: 29
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Fr 12.08.05 17:49
|
|
Solid Snake 
      
Beiträge: 44
Win XP Prof, Suse Linux 9 Prof
D7 Enterprise
|
Verfasst: Fr 12.08.05 18:55
@retnyg
Du bist mein Held
Klappt so alles Wunderbar! Danke Danke Danke
@F34r0fTh3D4rk
| Zitat: | | also wenn die mp3s legal vorliegen, reich einmal abspielen mit dem mediaplayer und die tags sind korrekt (ist bei allen meinen mp3s der fall) |
Das man nach den ID3 Tags sucht und nicht nach dem Dateinamen hatte ich mir auch schon überlegt! Eventuell füge ich das noch als weitere Option hinzu!
Wenn ich damit dann Probleme habe wende ich mich vertrauensvoll an dich
Nochmal Danke für eure Hilfe!
Fürs erste war es das jetzt! Aber ich finde bestimmt noch was wo ich euch zu fragen muss 
_________________ Wenn der Computer mit 0100101001010 Arbeitet ist ok,
aber wenn er mit 110 anfängt mach ich ihn kaputt!
|
|
|