AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TStream in (dp)CollectionItem speichern

Ein Thema von jensw_2000 · begonnen am 9. Aug 2006 · letzter Beitrag vom 19. Aug 2006
Antwort Antwort
Seite 1 von 3  1 23      
jensw_2000
(Gast)

n/a Beiträge
 
#1

TStream in (dp)CollectionItem speichern

  Alt 9. Aug 2006, 10:21
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
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: TStream in (dp)CollectionItem speichern

  Alt 10. Aug 2006, 21:06
*push*

Dürfte ich den Thread noch einmal nach oben stellen ?

Ich habe immernoch keine Lösung gefunden.

Versuche ich da etwas, das die DPCollection nicht kann oder sitzt das Problem vor dem Monitor ?
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#3

Re: TStream in (dp)CollectionItem speichern

  Alt 16. Aug 2006, 11:36
*push*

... keiner da, der sich mit der dpCollection auskennt ?

Eventuell habe ich mich auch unglücklich ausgedrückt.

In einem meiner Projekte werden sensibele Audiodateien erzeugt (Gesprächsmitschnitte).
Diese Daten sollen für einen gewissen Zeitraum verschlüsselt archiviert werden.

Jedes Archiv-File muss einen Header mit ein paar grundlegenden Informationen besitzen (Datum, Zeit, Rufnummern usw.).
Nach dem Header folgt dann ein Stream mit den verschlüsselten Audiodaten.

Die dpCollection bietet mir, wenn ich das richtig herausgelesen habe, den Vorteil, dass ich die Informationen in File-Header erweitern kann, ohne dabei die Kompatibilität mit "alten" Archiven zu verlieren.

Ich komme bei meinen ersten Experimenten mit der DP-Connection nicht weiter.
Dabei möchte ich "einfach" nur eine Collection mit einem einzigen Collection-Item via SaveToStream speichern und später wieder öffnen. Dieses Collection-Item enthält ein paar String- und Integer Werte und einen Stream für die "verschlüsselten" Daten.

Ich wäre überglücklich, wenn sich jemand finden würde, der mit beim Start etwas unter die Arme greift.

Mein Kunde strebt einen Installationstermin in 9 Tagen an



Schöne Grüße,
Jens
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: TStream in (dp)CollectionItem speichern

  Alt 16. Aug 2006, 12:13
Sorry, dass ich erst jetzt antworte, aber ich hab' den Thread irgendwie nicht beachtet ^^

Was mir auffällt:
TStream.Create; TStream ist eine abstrakte Klasse. Und was macht man damit nicht? Genau - verwenden
Im Ernst: Verwende dort einen TMemoryStream oder so - dann geht auch das Kopieren

Und der Stream muss natürlich published sein - sonst geht das alles nicht mit der Collection

Soweit so gut ... aber funktioniert es auch?
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#5

Problem >> Stream in dpCollectionItem speichern

  Alt 16. Aug 2006, 16:16
Danke, das sieht schon viel besser aus.

Wenn ich die Collection derzeit mit SaveToStream speichere, erhalte ich eine Datei mit folgendem Inhalt:

Code:
object AudioArchiveCollection: TmxJsCollection
  items = <
    item
      Call_Identifier = '2006-08-16-17-04-16-20777'
      ItemName = 'AudioArchiveCollectionItem'
      Call_CallingNumber = '<eine Rummer>'
      Call_internalCalledNumber = '<eine Rummer>'
      Call_StartTime = 38945.711303414360000000
      Call_EndTime = 38945.711511932880000000
      Call_RecordedTime = 13
    end>
end

-- (vorher) ----------------------------------------------
object AudioArchiveCollection: TmxJsCollection
  items = <
    item
    end>
end
----------------------------------------------------------
Das ist schon mal ein Riesen Schritt nach vorn.

Zwei published Properties fehhen aber:
- AudioArchive
- AudioArchiveSize

Warum werden die nicht mitgespeichert ?

[edit]
... Code entfernt.
s. Beispielprojekt in Post #10
// Jens
[/edit}
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#6

Re: TStream in (dp)CollectionItem speichern

  Alt 16. Aug 2006, 19:34
Hallo Jens,

bin da kein Profi, aber die AudioArchiveSize ist erklärbar: Diese ist nur als ReadOnly definiert. Das heisst, dass Du die ehedem im Quellcode irgendwo vorbelegen mußt. Da ist es einfach intelligent die Property nicht abzuspeichern.

Tja zu dem MemoryStream, dass würde mich auch interessieren! Kann die DPCollection eigentlich auch in XML-Speichern?

Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#7

Re: TStream in (dp)CollectionItem speichern

  Alt 16. Aug 2006, 20:44
Ich vermute inzwischen, dass das Problem nur bei Variablen auftritt, die durch das CollectionItem selbst gefüllt werden. Alle Properties die von "extern" gesetzt werden, schreibt Collection.SaveToStream brav in die Datei.



Hier die komplette Implementation des CollectionItems...

[edit]
... Code entfernt.
s. Beispielprojekt in Post #10
// Jens
[/edit}
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#8

Re: TStream in (dp)CollectionItem speichern

  Alt 16. Aug 2006, 21:09
Zitat von mschaefer:
AudioArchiveSize ist erklärbar: Diese ist nur als ReadOnly definiert. Das heisst, dass Du die ehedem im Quellcode irgendwo vorbelegen mußt. Da ist es einfach intelligent die Property nicht abzuspeichern.
Hi Martin, du hast Recht. Wenn ich AudioArchiveSize RW setze wird die Property auch gespeichert.

Zitat von JensW_2000:
Ich vermute inzwischen, dass das Problem nur bei Variablen auftritt, die durch das CollectionItem selbst gefüllt werden. Alle Properties die von "extern" gesetzt werden, schreibt Collection.SaveToStream brav in die Datei.
Das ist damit verworfen...
Die Collection speichert nur den MemoryStream nicht ...

PS
Die unit uArchiveCollection habe ich auch gleich noch etwas aufgeräumt.
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#9

Re: TStream in (dp)CollectionItem speichern

  Alt 16. Aug 2006, 21:25
Ist heute Abend zu spät für mich,

aber es wäre möglich nachzuforschen wie eine Bitmap abgespeichert wird.
Vielleicht werden nur bestimmte Streams gespeichet.

Jens, vielleicht solltest Du die Routine als Miniprojekt anhängen, dass verleitet doch eher zum Testen...

Gute Nacht-Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#10

Re: TStream in (dp)CollectionItem speichern

  Alt 16. Aug 2006, 22:46
Du hast Recht.
Ein Beispielprojekt erleichtert das Helfen erheblich.

Anbei ein D7 Spielprojekt (Sourcen und Echse).
Angehängte Dateien
Dateityp: zip dpcollection_und_memorystream-property_128.zip (251,1 KB, 25x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz