+1 800 256 3608 (toll-free in North America) or +49 7531 90 60 10| service@combit.com

LL19: LLXParameters dekodiern


(Guest) #1

Im Rahmen des Einbaus der LL19 Version möchte ich u.U. eine selbst implementierte HTML Komponente gegen die Standard LL HTML Komponente austauschen.

Dazu möchte ich einen Automatismus implementieren, der die Komponente in beliebigen *.lst Dateien austauschen kann. Das Ganze soll eine Art String-Replacer sein, der die Dateien einliest und die Stellen entsprechend austauscht.

Dazu muss eigentlich nur der LLXTYPE und die LLXParameters angepasst werden.
Die LLXParameters machen das Problem. Diese enthalten einen Base64 codierten String.

In LL17, bzw. zumindest bei unserer selbst implementierten HTML Komponente, scheint darin eine Hashtable zu sein, die man auch problemlos über C# deserialisieren kann.

In LL19 bei der Standard HTML Komponente scheint da aber keine Hashtable enthalten zu sein.

Wenn ich den Base64 String versuche zu deserialisieren, dann sehe ich zwar ungefähr was darin steht, aber es kann nicht 100%ig korrekt dekodiert werden.

Hier ein Beispiel des Base64 Strings:

LLXType=LLHTMLOBJECT LLXParameters=SABUAE0ATABPAGIAagBPAHAAdABpAG8AbgBzADIAFwB0AGUAeAB0ADEAFwAXADIAFwAwABcAAAAA

Diesen versuche ich so auszulesen:

byte[] data = Convert.FromBase64String(base64string); string decodedString = Encoding.Unicode.GetString(data);

So habe ich es auch versucht:

var ms = new MemoryStream(Convert.FromBase64String(base64string)); var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); object obj = formatter.Deserialize(ms);

  • Was genau ist in der LL19 HTML Komponente dort in den LLXParameters serialisiert?

  • Gibt es einen Weg es zuverlässig zu deserialisieren?

  • Oder muss man das über die LL API mit DOM realisieren?


(Guest) #2

Ich denke es ist am einfachsten wenn hier DOM verwendet wird. Das HTML-Objekt hat hierfür die Eigenschaften “FitToObject”, “Contents” und “ContentType”. Ist in .NET auch recht einfach: siehe .NET Hilfe den namespace cobit.ListLabel19.Dom und auch das Tool lldomview19.exe


(Jan Freitag) #3

Hallo,

ich versuche nun meine eigene HTML Komponente gegen die Standard LL HTML Komponente mit Hilfe der DOM API auszutauschen.
Der Weg ist auch relativ klar, allerdings hänge ich im Moment an der Stelle den Namen der Variablen aus meiner eigenen HTML Komponente auszulesen, um diesen als Contents der LL HTML Komponente zuzuweisen.
Der Code sieht in etwa so aus:

[code]…
_ll = new ListLabel();

// Add custom html designer object (subclass of DesignerObject).
    MyCustomHtmlComponent llCustomHTML = new MyCustomHtmlComponent ("Custom-Html", My custom Html Designer Objekt", null);
    _ll.DesignerObjects.Add(llCustomHTML);

  ProjectBase _project = GetProjectInstanceForProjectType(fileName);
  _project.Open(fileName, LlDomFileMode.Open, LlDomAccessMode.ReadWrite, true);

  if (_project.Objects.Count > 0)
  {
    DomItem mainDOMItem = _project.Objects[0] as DomItem;
    combit.ListLabel19.Dom.ObjectReportContainer reportContainerItem = mainDOMItem as combit.ListLabel19.Dom.ObjectReportContainer;

    foreach (var subItem in reportContainerItem.SubItems)
    {
      SubItemTable table = subItem as SubItemTable;

      if (table != null)
      {
        for (int lineIndex = 0; lineIndex < table.Lines.Data.Count; lineIndex++)
        {
          for (int fieldIndex = 0; fieldIndex < table.Lines.Data[lineIndex].Fields.Count; fieldIndex++)
          {
            var fieldItem = table.Lines.Data[lineIndex].Fields[fieldIndex];

        // Custom HTML component is of type TableFieldExtensionObject.
            if (fieldItem.GetType() == typeof(TableFieldExtensionObject))
            {
              TableFieldExtensionObject extObject = fieldItem as TableFieldExtensionObject;

              // Namen der Variablen ermitteln.
              // Wie ermittle ich nun hier den Inhalt meiner Custom HTML Komponente?
	  // In der .lst Datei sieht es so aus:
	  // LLXType=CUSTOM-HTML
	  //  LLXParameters=AAEAAAD/////AQAAAAAAAAAEAQAAABxTeXN0ZW0uQ29sbGVjdGlvbnM...

              ...
              // LL HTML Feld erstellen und hinzufügen und eigene Komponente entfernen.
              ...[/code]

In meiner eigenen HTML Komponente wird der Inhalt (Der Inhalt ist der Name einer Variablen, den man über einen Dialog im Designer eingeben kann) ungefähr so zugewiesen:

protected override void OnEditDesignerObject(EditDesignerObjectEventArgs e) { ... this.ObjectProperties["customHTMLString"] = htmlStringFromCustomDesignerDialogue; ... }

Zur Laufzeit sieht man in dem TableFieldExtensionObject auch in der Property ObjectTypeLLX, dass es von meinem Typ (“custm-HTML”) ist. Allerdings sehe ich noch nicht, wie ich nun meinen “customHTMLString” ermitteln kann. Ich habe auch versucht über GetProperty aus DOMItem auf verschiedene Eigenschaften zuzugreifen, aber bisher habe ich nicht die richtige gefunden.

Hat jemand Tipps, wie man den Wert am einfachsten ermitteln kann?