Das Problem dabei wäre, dass ich dann (abgesehen von TGenericTagItem) keinen sinnvollen gemeinsamen Vorfahren für die TagItems in den jeweiligen MetaDaten-Formaten nutzen kann. Denn die Unterscheidung Text/Bild/ExtendendText/Binary/... gibt es jeweils für ID3v2Items, Apev2Items, VorbisCommentItems, ...
Dann müsste ich wieder im eigentlichen Programmcode für jedes Format anders casten bzw. den Typ checken, um "GetText" aufrufen zu können. Und genau davon möchte ich ja weg.
Warum machst Du das Verhalten nicht einfach konfigurierbar und überlässt die Wahl (nichts machen, den "Fehler" loggen, eine
Exception auslösen, den "Fehler" in einer Variablen speichern und mittels einer Methode wie getLastErrorCode auslesen usw.) nicht einfach den Benutzer deiner Lib.
Aber abgesehen davon. Wenn ich Dein Problem richtig verstehe dann hast Du nach:
Delphi-Quellcode:
aAudioFile := AudioFileFactory.CreateAudioFile(aFileName);
aAudioFile.ReadFromFile(aFileName);
aAudioFile.Title := EditTitle.Text;
aAudioFile.UpdateFile;
doch alle Informationen die Du brauchst. Kanst Du nicht beispielsweise AudioFileFactory um eine Methode erweitern die zu jedem Tag die richtige Klasse (oder alternativ Interface) registriert, und nutzt diese Informationen in der Methode GetAllTagItems um die richtigen Klassen zu instanzieren.
Delphi-Quellcode:
type TGenericIDTag = class ...
TTagClass = class of TGenericIDTag;
TTextIDTag = class( TGenericIDTag )
end;
TImageIDTag = class(TGenericIDTag)
end;
TAudioFile = class()
private
FFactory : TAudioFileFactory
public
procedure GetAllTagItems(destList: TTagItemList);
end;
TAudioFileFactory = class()
public
function CreateAudioFile(const aFileName : String) : TAudioFile;
procedure RegisterTag(const aIdentifier : String; aTag : TTagClass);
end;
dann hättest Du alle Informationen um beim Aufruf von GetAllTagItems eine Liste mit den "richtigen" Objekten zu konstruieren.
Delphi-Quellcode:
TagList := TTagItemList.Create;
try
aAudioFile.GetAllTagItems(TagList);
for var tag : TGenericIDTag in TagList do
begin
if tag is TTextIDTag then
begin
....
end;
end;
finally
end;
Ich hofffe ich habe mich verständlich ausgedrückt.
hth Ha Jö