Zugriff auf Application.SaveAsText Hex-Werte lesen
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
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.
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();