![]() |
AW: Methoden in abgeleiteten Klassen ggf. einschränken
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Anregungen, einige davon habe ich mit berücksichtigt. Das mit den Interfaces lass ich aber bleiben - das würde nicht viel zur Übersicht beitragen, und letztlich auch nicht alle Probleme lösen. 8-)
In jeder TagItem-Klasse muss bei den verschiedenen Set/Get-Methoden überprüft werden, ob dieser Aufruf sinnvoll ist. Dafür ist der "TagContentType" zuständig, der in den unterschiedlichen Tag-Formaten mehr oder weniger viele Werte annehmen kann, und der mehr oder weniger kompliziert zu bestimmen ist. Was genau "Sinnvoll" heißt, kann dabei vom Anwender der Lib mehr oder weniger streng ausgelegt werden - zumindest beim Thema "Text", was vor allem beim ID3v2-Tag wichtig ist. Über den optionalen Parameter "TextMode" kann der Anwender steuern, ob wirklich nur Text ausgegeben werden soll, oder ob man den Begriff etwas weiter fassen will. Also z.B. auch den "Text-Teil" von Text-Frames mit weiteren (meist uninteressanten) Metadaten haben will, oder ob man sogar eine (natürlich nicht 100% akkurate) Darstellung von binären Daten haben will. Text auslesen und schreiben geht sieht beim ID3v2-Tag jetzt so aus:
Delphi-Quellcode:
Im Testprogramm reichen dann wenige Zeilen, um alle enthaltenen Tags anzuzeigen (sieht dann so aus wie im Screenshot)
function TID3v2Frame.GetText(TextMode: TTextMode = tmReasonable): UnicodeString;
var ct: TTagContentType; Lang: AnsiString; Description: UnicodeString; begin result := ''; if not fParsable then exit else begin ct := TagContentType; if ct = tctText then result := GetConvertedUnicodeText(1, length(fData) - 1, ByteToTextEncoding(fData[0])) else begin case ct of tctComment, tctLyric: begin if TextMode in [tmReasonable, tmForced] then result := GetCommentsLyrics(Lang, Description); end; tctURL: begin if TextMode in [tmReasonable, tmForced] then result := UnicodeString(GetURL); end; tctUserText: begin if TextMode in [tmReasonable, tmForced] then result := GetUserText(Description); if Description <> '' then result := '(' + Description + ') ' + result; end; tctUserURL: begin if TextMode in [tmReasonable, tmForced] then result := UnicodeString(GetUserDefinedURL(Description)); end; tctPicture, tctBinary, tctPopularimeter, tctPrivate, tctUnknown: begin if TextMode = tmForced then result := ByteArrayToString(fData); end else result := ''; end; end; end; end; function TID3v2Frame.SetText(aValue: UnicodeString; TextMode: TTextMode = tmReasonable): Boolean; var ct: TTagContentType; dummyA, curLang: AnsiString; dummy, curDesc: UnicodeString; begin result := False; ct := TagContentType; if ct = tctText then result := DoSetText(aValue) // always true :) else begin // Try to set "reasonable" text frames // Mode "tmForced" for binary or unknown frames doesn't make any sense here, it will just make the frame invalid if TextMode in [tmReasonable, tmForced] then begin case ct of tctComment, tctLyric: begin dummy := GetCommentsLyrics(curLang, curDesc); // parameters are OUT parameters ;-) result := SetCommentsLyrics(curLang, curDesc, aValue); end; tctURL: begin result := SetURL(AnsiString(aValue)); end; tctUserText: begin dummy := GetUserText(curDesc); result := SetUserText(curDesc, aValue); end; tctUserURL: begin dummyA := GetUserDefinedURL(curDesc); result := SetUserDefinedURL(curDesc, AnsiString(aValue)); end; else result := False; end; end; end; end;
Delphi-Quellcode:
Ist nur einiges an Aufwand, alle Klassen entsprechend anzupassen. Aber ich denke, der Aufwand lohnt sich. Die Verwendung der Lib wird dadurch deutlich übersichtlicher. In ein paar wenigen Fällen schmeiße ich auch eine Exception, aber an diese Stellen sollte der Entwickler in aller Regel nicht rankommen.
procedure TMainFormAWB.RefillTagItems;
var i: Integer; TagItems: TTagItemList; begin TagItems := TTagItemList.Create; try AudioFile.GetTagList(TagItems, [tctAll]); for i := 0 to TagItems.Count - 1 do AddTagItem(cTagTypes[TagItems[i].TagType] , TagItems[i].Key, TagItems[i].GetText(tmForced)); // AddTagItem: ListViewTags.Items.Add; etc. pp. finally TagItems.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz