Zugriff auf Application.SaveAsText Hex-Werte lesen

Sep 11 2020

Ich habe mehrere Access-Objekte mit application.saveastext in einer VB.net-Anwendung in Textdateien exportiert. Ich verwende Microsoft.Interop, um dies zu erreichen. Idealerweise möchte ich dann die resultierende (n) Textdatei (en) einschließlich der hexadezimalen Teile durchlesen.

Ich verstehe, wie man mit diesen Dateien in Access aus Text lädt, aber ich frage mich, wie man die Hex-Werte in diesen Dateien in einer vb.net-Anwendung trennbar liest. Eine Beispiel-Hex-Zeichenfolge in einer der Dateien sieht folgendermaßen aus.

Begin TextBox
                Enabled = NotDefault
                Locked = NotDefault
                TabStop = NotDefault
                OverlapFlags =85
                IMESentenceMode =3
                Left =4770
                Top =30
                Width =1080
                Height =345
                TabIndex =3
                Name ="Qty Available"
                ControlSource ="Qty Available"
                Format ="General Number"
                EventProcPrefix ="Qty_Available"
                ConditionalFormat = Begin
                    0x0100000090000000010000000000000005000000000000001700000001000000 ,
                    0xff000000ffffff00000000000000000000000000000000000000000000000000 ,
                    0x0000000000000000000000000000000000000000000000000000000000000000 ,
                    0x5b0046006f0072006d005d0021005b00520065006f0072006400650072002000 ,
                    0x4c006500760065006c005d0000000000
                End
                GUID = Begin
                    0x992063bfd02642489a85ffd951279cb6
                End
                ColumnGroup =3
                GroupTable =6
                HorizontalAnchor =1
                IMEMode =0
            End

An diesem Punkt habe ich versucht, einige Online-Decoder zu verwenden, um zu sehen, ob ich sie leicht in einen String konvertieren kann. Was ich stattdessen bekomme, sind Sonderzeichen und unlesbarer Text. Ich habe ausgiebig nach verschiedenen Themen im Zusammenhang mit application.saveastext gesucht, aber Microsoft hat diesen Prozess noch nicht einmal dokumentiert, und ich sehe zu diesem Thema nichts Ausführliches.

Hat jemand Erfahrung damit oder kann er mir eine Richtung weisen?

Antworten

1 Heinzi Nov 03 2020 at 15:47

Wie dekodiere ich diese hexadezimalen Ziffernblöcke?

Auf den Punkt gebracht: Split sie in Blöcke von zwei Zeichen ( 0x5b0046-> 5b, 00, 46, ...) und dann Parse sie in ein Byte - Array. Hier ist der Code, den wir dafür verwenden:

''' <summary>
''' Parses binary data formatted as follows:
'''     0x.... ,
'''     0x.... ,
'''     0x..
''' </summary>
Public Shared Function ParseBinaryData(lines As IEnumerable(Of String)) As Byte()
    Dim colBytes As New List(Of Byte)()

    For Each sLine In lines
        sLine = sLine.TrimStart(" "c).TrimEnd({vbCr(0), vbLf(0), ","c, " "c})
        If Not sLine.StartsWith("0x") Then
            Throw New FormatException($"Line does not start with 0x: {sLine}.")
        End If

        For Each sPair In StringTools.SplitOnLength(sLine, 2).Skip(1)
            colBytes.Add(Convert.ToByte(sPair, 16))
        Next
    Next

    Return colBytes.ToArray()
End Function

Und hier ist die verwendete StringTools.SplitOnLengthHilfsmethode:

Public Shared Iterator Function SplitOnLength(s As String, iSegmentLength As Integer) As IEnumerable(Of String)
    s = If(s, "")
    If iSegmentLength < 1 Then Throw New ArgumentOutOfRangeException("iSegmentLength")

    While s <> ""
        Yield Left(s, iSegmentLength)
        s = Mid(s, iSegmentLength + 1)
    End While
End Function

Und was bedeuten diese Byte-Arrays?

Es hängt davon ab, ob. Folgendes haben wir bisher herausgefunden:

  • PrtDevNames / PrtDevNamesW sind die ANSI / Unicode-Versionen der DEVNAMES-Struktur .
  • PrtDevMode / PrtDevModeW sind die ANSI / Unicode-Versionen der DEVMODE-Struktur .

Was ist mit ConditionalFormat und ConditionalFormat14? Leider scheinen sie eine undokumentierte binäre Datenstruktur zu enthalten. Vor drei Jahren habe ich im Access for Developers-Forum von MSDN danach gefragt , aber der Microsoft-Mitarbeiter hat mir nur höflich gesagt, ich solle mich verlaufen.

Wir haben dieses Problem gelöst, indem wir Access-Entwicklern intern verboten haben, bedingte Formatierungen im Access Form-Designer festzulegen, und sie gezwungen haben, stattdessen VBA-Code zu verwenden (dh die FormatConditionsEigenschaft manuell im Code festzulegen). Dies kann je nach Größe Ihrer alten Codebasis eine geeignete Lösung für Sie sein oder auch nicht.

ComputerVersteher Sep 11 2020 at 09:21

Schauen Sie sich die Kontrollnamen von MS-Access-Formularen und -Berichten sowie die Kurzübersicht über SaveAsText und LoadFromText an .

Struktur scheint zu sein:

Begin {control-class-name}
    {property-name} = {value}
End
CodeBehindForm
{attributes}
{declarations}
{body}

Die PrtMip-Eigenschaft in Visual Basic legt die Gerätemodusinformationen fest oder gibt sie zurück, die für ein Formular oder einen Bericht im Dialogfeld Drucken angegeben wurden.

Die Dekodierungseigenschaft ConditionalFormatscheint schwierig zu sein, verglichen mit dem einfachen Durchlaufen der Forms Controls-Collection und dem Überprüfen der FormatConditionsEigenschaft .

Kann etw sein wie ( hier gestohlener C # -Code ):

var objAccess = new Microsoft.Office.Interop.Access.Application();
    objAccess.OpenCurrentDatabase(@"C:\Users\Public\Database1.accdb");

    string formName = "ClientForm";
    objAccess.DoCmd.OpenForm(formName, Microsoft.Office.Interop.Access.AcFormView.acDesign);
    Microsoft.Office.Interop.Access.Form frm = objAccess.Forms[formName];

    Console.WriteLine(String.Format("The FormHeader section of form [{0}] contains the following controls:", formName));
    foreach (Microsoft.Office.Interop.Access.Control ctl in frm.Controls)
    {
        foreach (Microsoft.Office.Interop.Access.FormatCondition fc in ctl.FormatConditions)
        {
            //read  FormatCondition properties here https://docs.microsoft.com/en-us/office/vba/api/access.formatcondition
            Console.WriteLine();
            Console.WriteLine(String.Format("    [{0}]", ctl.Name));
            Console.WriteLine(String.Format("        {0}", ctl.GetType()));
            Console.WriteLine(String.Format("           {0}", fc.Backcolor));
            ...
            Console.WriteLine(String.Format("           {0}", fc.Type));
        }
    }
    objAccess.DoCmd.Close(Microsoft.Office.Interop.Access.AcObjectType.acForm, formName);
    objAccess.CloseCurrentDatabase();
    objAccess.Quit();