Announcement

Collapse
No announcement yet.

Frage zum Beispiel TCollection in IStorage speichern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zum Beispiel TCollection in IStorage speichern

    Hallo,
    ich habe hier im Forum zwei hervorragende Beispiele zum Thema TCollection von Jens Schumann gefunden, doch ich habe ein Paar Probleme mit dem einen Beispiel (unter <a href="/webx?13@@.ee70e3c/8">Jens Schumann "TList laden und speichern" 13.03.2001 15:49). Beim Speichern und Laden wurden andere Klassennamen verwendet und da ich mich mit IStorage nicht auskenne, hoffe ich, daß mir jemand helfen kann.
    <pre>
    procedure SaveAnalyseToFile(aAnalyse : TTPAnalyse; const Filename : String);
    var
    FRootStorage : IStorage;
    aFilename : WideString;
    stm : IStream;
    OS : TOleStream;
    StreamDummy : TTPAnalyseDummy;
    begin
    aFilename:=Filename; // Für Typecasting
    OleCheck(StgCreateDocFile(PWideChar(aFilename),
    STGM_CREATE or
    STGM_READWRITE or
    STGM_SHARE_EXCLUSIVE,
    0,
    FRootStorage)); OleCheck(FRootStorage.CreateStream(ANALYSEDATA,
    STGM_CREATE or
    STGM_WRITE or
    STGM_SHARE_EXCLUSIVE,
    0,0,stm));
    StreamDummy:=TTPAnalyseDummy.Create(Nil);
    Try
    StreamDummy.Assign(aAnalyse);
    OS:=TOleStream.Create(stm);
    Try
    OS.WriteComponent(StreamDummy);
    Finally
    OS.Free;
    end;
    Finally
    StreamDummy.Free;
    end;
    end;</pre>
    Frage: Wie muß der header umgesetzt werden (TTPAnalyse=im alten Beispiel?)und was ist "ANALYSEDATA"?

    Gruß Alex

  • #2
    Hallo Alex,<br>
    ANALYSEDATA ist eine Konstante und enthält den Streamnamen. Das Kind braucht ja bekanntlich immer einen Namen.<br>
    Konstanten deklariere ich grundsätzlich in einer separaten unit.<br>
    <pre>
    <font face="Verdana" size="1" color="#000000">...
    const
    ANALYSEDATA = 'ANALYSESTREAM';
    ...</font></pre>
    Mit dem IStorage Interface erzeugst Du ein Compount Document File (DocFile). Ein anderes Schlagwort ist auch Structured Storage.<br>
    Ein DocFile bildet innerhalb der Datei eine Verzeichnisstruktur nach. Dabei ist ein Storage der Pfad und der Strem die Datei.<br>
    Das könnte z.B.so aussehen:<br>
    <pre>
    <font face="Verdana" size="1" color="#000000"> Root (Storage)
    |
    |
    --- Datei1 (Stream)
    |
    --- Datei2 (Stream)
    |
    --- Version 1 (Storage)
    | |
    | |
    | --- Datei3 (Stream)
    |
    --- Version 2 (Storage)
    |
    --- Datei4 (Stream)</font>
    </pre>
    Die Frage nach dem Header habe ich nicht verstanden. Es gibt nämlich keinen klassischen Header.<br>
    Prinzipiell läuft die Sache so:<br>
    Nehme eine Liste auf der Basis von TCollection und TCollectionItem. Problem: TCollection läßt sich nicht direkt streamen.<br>
    Lösung: Erzeuge eine Dummyklasse abgeleitet von TComponent. Verpasse dieser Dummyklasse eine entsprechende published property.<br>
    Die Dummyklasse läßt sich über WriteComponent streamen.<br>
    TTPAnalyse ist der TColllection Nachfahre und StreamDummy ist die Dummyklasse.<br>
    Jens Schumann<br>
    &#10

    Comment


    • #3
      Hallo,
      vielen Dank, doch dann habe ich doch noch eine Frage, wo lernt man sowas?

      Gruß Ale

      Comment


      • #4
        Hallo Alex,<br>das lernt man aus den COM Büchern von Herrn Kosch und die Sache mit WriteComponent habe ich aus:<br>
        DELPHI COM Programming<br>
        von Eric Harmon<br>
        ISBN 1-57870-221-6<br>
        Dieses Buch kostet ca. 160 DM. Damit ist es ziemlich teuer. Und wenn man bedenkt, dass ich den interessantesten Punkt hier beschrieben habe, solltest Du es Dir nicht kaufen. Da sind die Bücher von Herrn Kosch zu Thema COM günstiger und besser.<br>Das klingt jetzt vielleicht etwas oberlehrerhaft, aber ein wichtiger Punkt ist: AUSPROBIEREN.<br>Ein Quell für neue Weisheiten ist die jährliche Entwicklerkonferenz in Frankfurt. Wenn Du einen Chef haßt, der bereit ist die Konzerenzteilnahme zu bezahlen, solltest unbedingt daran teilnehmen. Dort sind die Sessions von Herrn Kosch ein MUSS und äußerst lehrreich. Außerdem sind seine Unterlagen (erhält man nach der Konferenz auf CD) sehr umfangreich und erstklassig. War jetzt vielleicht etwas schleimig, ist aber so.<br>Jens Schuman

        Comment


        • #5
          Hallo,<br>
          ich habe immer noch ein Problem mit ihrem Beispiel. Es will nicht funktionieren. Ich bekomme beim speichern immer Fehler (Cannot assign a TWvgItems to a TStreamDummy). Könnten sie mir vielleicht ihr Testprogramm für das Speichern einer TCollection mit angehängtem Objekt mit Hilfe vom IStorage Interface per E-mail schicken?
          <br><br>
          Gruß Ale

          Comment


          • #6
            Hallo Alex,<br> werden heute abend mal sehen, ob ich es noch finde.<br>Jens Schuman

            Comment


            • #7
              Hallo Alex,<br>
              schau mal unter http://home.t-online.de/home/jensschumann/istorage/storage.zip nach.<br>Kann sein, das der Link noch tot ist. T-Online braucht etwas Zeit, bevor ein Link gültig wird.<br>Jens Schuman

              Comment


              • #8
                Hallo,<br>
                es hat mir sehr geholfen, vielen Dank und Entschuldigung, dass ich mich erst jetzt wieder melde (ich war vorher nicht zu hause).<br><br>Gruß Alex

                Comment

                Working...
                X