Announcement

Collapse
No announcement yet.

Komponenteneigenschaften streamen

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

  • Komponenteneigenschaften streamen

    Ich habe eine Komponente mit einem Property MeineListe:TListe.<p><p>
    Ich kann aber die Einträge in der IDE zur Entwurfszeit nicht speichern. In einem Artikel habe ich gelesen, daß man diese Eigenschaften dem Streaming-System der VCL übergeben muß. Aus der Hilfe werde ich leider auch kein bischen schlauer. Wie muß man mit DEFINEBINARYPROPERTY, TSTREAM.Read und TSTREAM.write umgehen?

    Hilfe!Hilfe!Hilfe!Hilfe!Hilfe!Hilfe!Hilfe!Hilfe!Hi lfe!Hilfe!

    MfG Carsten Jockenhöfer

  • #2
    Hallo Carsten,

    ich würde Dir gern weiterhelfen, brauche aber weitere Informationen.
    Ich gehe davon aus, daß es sich um die Liste aus der Diskussion Pointer,Pointer handelt, in der Du Zeiger auf Komponenten abgespeichert hast. Wenn nun diese Liste zur Entwurfszeit in der IDE gefüllt wird, stelle ich mir vor, daß die Komponenten in ein Formular eingefügt wurden und in Liste ein Verweis auf diese Komponenten eingetragen wird. In diesem Fall werden die Komponenten über das Formular bereits abgespeichert, sie müssten zur Laufzeit also vorhanden sein. Dein Problem besteht jetzt darin, daß die Verweise in der Liste fehlen. Stimmt das so ?

    Gruß Lory

    Comment


    • #3
      Hallo Lyron!
      genau so.

      1. Die von mir geschriebene Komponente mit der TListe ist auf dem Formular.<p>

      2. Die Komponenten die ich der TListe meiner Komponente hinzugefügt habe sind ebenfalls auf dem Formular.

      3. Die in der TListe "gespeicherten" Komponenten sind in der IDE zur Entwurfszeit in der TListe vorhanden und durch die TListe erreichbar (manipulierbar).

      4. Jetzt der Knackpunkt: zur Laufzeit ist die TListe nicht mehr mit gültigen Verweisen gefüllt. In einem Artikel habe ich kürzlich in zwei Sätzen gelesen, daß man solche "Properties" "Streamen" muß. In der Hilfe fand ich auch DefineProperties, DefineProperty, DefineBinaryProperty ... aber wie soll das nur funktionieren ???

      Für Hilfe immer dankbar ... Carsten Jockenhöfe

      Comment


      • #4
        Hallo Carsten. Ich habe jetzt ebenfalls eine (visuelle) Komponente mit einer TList versehen. Ich weiß jetzt zwar nicht genau, was Du damit willst, aber offensichtlich willst Du über diese TList auf zugeordnete (visuelle?) Komponenten zugreifen. Demzufolge würde ich im Create des Formulars z.B. die Handles der (visuellen) Komponenten der TListe hinzufügen. Dabei kannst Du diese eben z.B. auf Hidden setzen, und bei Bedarf über die TList Show'en.
        Ich selbst verwalte über diese Liste nichtvisuelle Objekte, welche ich als TObject in die Liste mittels <KlassenName>.Create Add'e. Im Destroy der Liste räume(destroye) ich zuvor alle Objete der Liste, womit alle beinhalteten Objekte sauber freigegeben wurden. Das einzige was noch zu tun bleibt, ist ein sauberes Handling zum Zugriff auf die beinhalteten Objekte (in der Form <with Liste.Item[i] as MeineKlasse do>) mittels Properties

        Comment


        • #5
          Hallo zusammen!
          Das Problem ist, dass der Typ *nicht* TList ist, sondern TList*e*. Vielleicht kann das folgende Code-Fragment etwas Licht in die Sache bringen. Den Rest kann man auch in der Delphi-Hilfe finden.

          TMyClass = class(TPersistent)
          private
          procedure ReadListe(Reader: TReader);
          procedure WriteListe(Writer: TWriter);
          protected
          procedure DefineProperties(Filer: TFiler); override;

          ...

          procedure TMyClass.DefineProperties(Filer: TFiler);
          begin
          Filer.DefineProperty('Liste', ReadListe, WriteListe,
          Liste.Count> 0);
          end;

          mfg Michael Tieke

          procedure TMyClass.ReadListe(Reader: TReader);
          begin
          with Reader do begin
          // irgendwas lesen
          end;
          end;

          procedure TMyClass.WriteListe(Writer: TWriter);
          begin
          with Writer do begin
          // irgendwas schreiben
          end;
          end

          Comment


          • #6
            Hi

            Sind in der "TListe" ALLE Komponeten des Formulars enthalten ?
            Wenn ja, ist diese "TListe" überflüssig da das Formular, bzw. JEDE Componente mit "Sub-" Componeten, eine eigene Liste verwalten.
            Mit: Form1.ComponentCount und Form1.Components[x]: TComponent kann auf diese Liste zugegriffen werden.
            Sollte es eine ausgewählte Anzahl von Komponenten in der "TListe" sein würde ich anstelle einer "TListe = class(TList)" eine TStringList nutzen. In der Eigenschaft Objects[x] werden die Komponeten gespeichert und in den dazugehörigen Strings[x] die NAMEN der Komponenten. Speichern ist nun einfach, beim Laden wird die Methode .Loaded überschrieben und mit Objects[x] := Owner.FindComponent(Strings[x]) die Referenzen wieder hergestellt !
            Da der Komponetenname IMMER eindeutig im Formular sein muß, gibt es mit FindComponent IMMER ein eindeutiges Resultat.

            Gruß Hage

            Comment

            Working...
            X