Moin,
ich komme bei meiner ersten Verwendung der dpCollection nicht weiter.
Prinzipiell soll die Collection mit ein einziges Item besitzen.
Dieses Item beinhaltet ein paar einfache String und Integer Properties sowie eine TStream Instanz.
Grundlegend soll das Ganze ein
ZLib Archiv mit ein paar zusätzlichen Header-Informationen werden, die später sicher erweitert werden.
Die ItemClass ist wie folgt definiert:
Delphi-Quellcode:
unit uArchiveCollectionItem;
interface
uses Windows, classes, JvComponent,JvZlibMultiple,dpCollection;
type
TArchiveItem =
class(TCollectionItem)
private
fItemName:
String;
fAudioFileCount:Integer;
fAudioArchive:TStream;
procedure AssignAudioArchive(Source:TStream);
public
procedure LoadAudioData(AudioFiles:TStringList);
published
Property ItemName:
String
Read fItemName
Write fItemName;
Property AudioFileCount:integer
Read fAudioFileCount
Write fAudioFileCount;
protected
end;
implementation
//////////////////////////////////////////////////////////////
// Implementation TArchiveItem
//////////////////////////////////////////////////////////////
procedure TArchiveItem.LoadAudioData(AudioFiles:TStringList);
var AudioFileCompressor:TJvZlibMultiple;
// Jedi ZLib Archiver
begin
fAudioFileCount := AudioFiles.Count;
if AudioFiles.Count > 0
then
begin
AudioFileCompressor:=TJvZlibMultiple.Create(
nil);
try
AudioFileCompressor.StorePaths:=false;
AssignAudioArchive(AudioFileCompressor.CompressFiles(AudioFiles));
// CompressFiles liefert TStream als Result
finally
AudioFileCompressor.free;
end;
end
else begin
if assigned(fAudioArchive)
then fAudioArchive.free
end;
end;
procedure TArchiveItem.AssignAudioArchive(Source:TStream);
begin
if not assigned(fAudioArchive)
then fAudioArchive:=TStream.Create;
// fAudioArchive.CopyFrom(Source,Source.size); >> liefert Exception "Abstrakter Fehler"
// fAudioArchive:=Source; >> TmxJSCollection wird mit einem leeren CollectionItem gespeichert
fAudioArchive:=Source;
end;
end.
Ursprünlich hatte die ItemClass noch einen Construktor und einen Destruktor, in dem ich den die TStream Instanz erstellen / freigeben wollte.
Der Konstruktor wurde bei " MyItem:= MyCollection.add as TArchiveItem " nicht aufgerufen.
Wenn ich ihn überschrieben habe (constructor create(Collection:TCollection); override; ) dann bekam ich einen Abstrakten Fehler...
Um das Problem zu umgeben, erstelle ich die Stream Instanz (fAudioArchive) vorerst zu einem anderen Zeitpunkt.
Mein Hauptproblem liegt hier:
Delphi-Quellcode:
procedure TArchiveItem.AssignAudioArchive(Source:TStream);
begin
if not assigned(fAudioArchive)
then fAudioArchive:=TStream.Create;
// Variante 1
// fAudioArchive.CopyFrom(Source,Source.size);
// >> liefert hier eine Exception "Abstrakter Fehler"
// Variante 2
// fAudioArchive:=Source;
// >> TmxJSCollection wird mit einem leeren CollectionItem gespeichert
fAudioArchive:=Source;
end;
Die ItemClass wird wie folgt verwendet:
Delphi-Quellcode:
Procedure Tmain.Save(Sender TObject);
var Coll: TmxJsCollection;
ArchiveItem. TArchiveItem;
begin
Coll := TmsJsCollection.Create(TArchiveItem);
try
ArchiveItem := Coll.Add as TArchiveItem;
ArchiveItem.Call_EndTime:=now;
ArchiveItem.ItemName := 'einItem';
ArchiveItem.LoadAudioData(AudioFileList);
Archive.SaveToFile('c:\test.archive');
finally
coll.Free;
end;
end;
Wenn ich den Stream mit Variante 2 zuweise, dann hat mein Testarchiv wird folgenden Inhalt.
Code:
object AudioArchiveCollection: TmxJsCollection
items = <
item
end>
end
Ohne Hilfe komme ich nicht weiter.
Schöne Grüße,
Jens