Announcement

Collapse
No announcement yet.

Document Properties

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

  • Document Properties

    Hallo, das setzen der "einfachen" Properties funktioniert problemlos wie folgt:

    FillChar (FPSpec^, SizeOf (TPropSpec), #0);
    With FPSpec^ do begin
    ulKind := PRSPEC_PROPID;
    propID := PID;
    end;
    FillChar (FPropVariant^, SizeOf (TPropVariant), #0);
    with FPropVariant^ do begin
    vt := VT_LPWSTR;
    pwszVal := PWideChar (Value);
    end;
    OleCheck (FPropertyStorage.WriteMultiple (1, FPSpec, FPropVariant, PID_FIRST_USABLE));

    soweit so gut, aber ich komme leider mit den zwei: HeadingPairs und TitlesofPairs nicht zurecht. Hätte vielleicht jemand ein kurzes Beispiel.

    Danke
    Matthias Förster

  • #2
    Okay, ich hab schon selbst was gefunden: <br>

    var C: TCAPROPVARIANT; <br>
    P: PPropVariant;<br>
    begin <br>
    FillChar (FPSpec^, SizeOf (TPropSpec), #0); <br>
    with FPSpec^ do begin <br>
    ulKind := PRSPEC_PROPID; <br>
    propID := 12; //HeadingPairs <br>
    end; <br>
    FillChar (FPropVariant^, SizeOf (TPropVariant), #0); <br>
    OleCheck (FDocPropStorage.ReadMultiple (1, FPSpec, FPropVariant)); <br>
    C := FPropVariant^.capropvar; <br>
    P := C.pElems; <br>

    jetzt habe ich den Zeiger auf die erste Struktur, und ich weiß die Anzahl der Elemente. Wie komme ich jetzt an das nächste Element.
    Den Zeiger zu verschieben <br>

    Inc (P, SizeOf (PPropVariant)); -> Schmutzverletzung! <br>

    Gibt es dafür vieleicht eine Funktion, ich habe im MSDN nix gefunden.

    Danke
    Matz

    Comment


    • #3
      Hallo Matthias,

      Longint(PPropVariant) := Longint(PPropVariant) + SizeOf (TPropVariant);
      müßte eigentlich funktionieren (Ohne Schmutzverletzung ;-
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo Falk <br>
        gut so habe ich den Zeiger verschoben bekommen, allerdings zeigt dieser immer noch nicht auf das nächste Element. Eigentlich dachte ich mir, daß es für so was eine Callback-Funkt. gibt, hab aber nix gefunden. Im MSDN is es wie folgt beschrieben: <br>
        The HeadingPairs property is stored as a vector of variants, in repeating pairs of VT_LPSTR (or VT_LPWSTR) and VT_I4 values. The VT_LPSTR value represents a heading name, and the VT_I4 value indicates the count of document parts under that heading. <br>
        Ich teste das ganze immer mit einem kurzen doc-file, da kann ich mir anschauen, was ich kriegen müßte. Wahrscheinlich ist die Lösung ganz simpel, ich denke bloß prinzipiell in die falsche Richtung

        Comment


        • #5
          Hallo Matthias,

          wahrscheinlich mußte den zeiger um eine Variable Größer weiterschieben. Die Größe der Datenstruktur hilft dabei nicht weiter. Probier mal den Zeiger jeweils um die <b>Länge von vt + SizeOf(pwszVal)</b> weiterzuschieben (evtl. noch +1 wegen der 0 am Nullterminierten String)

          Gruß Fal
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Falk, <br><br>
            so geht das auch nicht. Außerdem habe ich noch was gefunden: <br>
            ...vector elements in the HeadingPairs and TitlesofParts properties should be aligned on 32 bit boundaries within the property set. <br>
            so weit so gut, es funkt aber auch nicht.
            ich habe mal in einer größeren Schleife den Pointer immer um 1 erhöht
            und hab mir das ergebnis angeschaut, hat aber auch nix gebracht.

            Matz

            Comment


            • #7
              Hallo,

              mittlerweise geht das Lesen, es war doch schon mal richtig ;-)

              die HeadingPairs sind jeweils um SizeOf (TPropVariant) verschoben und die TitlesOfParts um SizeOf (Pointer).

              Jetzt wäre da nur noch die Sache mit Schreiben, wenn ich die Strukturen analog aufbaue und schreibe -> peng.

              Vielleicht hat ja doch jemand schon ein Beispiel in der Schublade.

              Danke
              Matz

              Comment


              • #8
                Hallo, <br>

                leider klappt das Schreiben, so nicht, weiß jemand Rat?

                type PProps = ^TProps;
                TProps = array [0..1] of PPropVariant;
                var Props: PProps;
                PropVector: TCAPROPVARIANT;
                ... <br>
                FillChar (FPSpec^, SizeOf (TPropSpec), #0); <br>
                with FPSpec^ do begin <br>
                ulKind := PRSPEC_PROPID; <br>
                propID := 12; <br>
                end; <br>
                FillChar (FPropVariant^, SizeOf (TPropVariant), #0); <br>
                New (Props); New (Props[0]); <br>
                FillChar (Props[0]^, SizeOf (TPropVariant), #0); <br>
                New (Props[1]); FillChar (Props[1]^, SizeOf (TPropVariant), #0); <br>
                Props[0]^.vt := VT_LPSTR; <br>
                Props[0]^.pszVal := 'Hallo'; <br>
                Props[1]^.vt := VT_I4; <br>
                Props[1]^.lVal := 1; <br>
                PropVector.cElems := 2; <br>
                longint (PropVector.pElems) := longint (Props); <br>
                FPropVariant^.vt := VT_VARIANT or VT_VECTOR; <br>
                FPropVariant^.capropvar := PropVector; <br>
                OleCheck (FDocumentPropertyStorage.WriteMultiple (1, FPSpec, FPropVariant, PID_FIRST_USABLE)); <br>

                Danke
                Matz

                Comment

                Working...
                X