Akses Application.SaveAsText Baca nilai Hex
Saya telah mengekspor beberapa objek Access ke file teks menggunakan application.saveastext dalam aplikasi VB.net. Saya menggunakan Microsoft.Interop untuk mencapai ini. Idealnya saya mencari untuk kemudian membaca file teks yang dihasilkan termasuk bagian heksadesimal.
Saya mengerti cara memuat dari teks menggunakan file-file itu di Access tetapi saya bertanya tentang cara membaca nilai hex di dalam file-file itu secara terpisah di aplikasi vb.net. Contoh string hex dalam salah satu file terlihat seperti ini.
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
Pada titik ini yang saya coba lakukan adalah menggunakan beberapa decoder online untuk melihat apakah saya dapat dengan mudah mengubahnya menjadi string. Yang saya dapatkan adalah karakter khusus dan teks yang tidak dapat dibaca. Saya telah mencari secara ekstensif pada berbagai topik yang berkaitan dengan application.saveastext tetapi Microsoft sebenarnya belum mendokumentasikan proses itu dan saya tidak melihat sesuatu yang ekstensif tentang subjek tersebut.
Apakah ada yang punya pengalaman dengan ini atau bisa menunjukkan saya arah?
Jawaban
Bagaimana cara memecahkan kode blok digit hex ini?
Singkatnya: Berpisah mereka ke dalam blok dari dua karakter ( 0x5b0046-> 5b, 00, 46, ...) dan kemudian parse ke dalam array byte. Berikut adalah kode yang kami gunakan untuk melakukan itu:
''' <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
Dan inilah StringTools.SplitOnLengthmetode pembantu yang digunakan:
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
Dan apa arti dari array byte ini?
Tergantung. Inilah yang kami temukan sejauh ini:
- PrtDevNames / PrtDevNamesW adalah versi ANSI / Unicode dari struktur DEVNAMES .
- PrtDevMode / PrtDevModeW adalah versi ANSI / Unicode dari struktur DEVMODE .
Bagaimana dengan ConditionalFormat dan ConditionalFormat14? Sayangnya, mereka tampaknya mengandung beberapa struktur data biner yang tidak terdokumentasi. Tiga tahun lalu, saya menanyakan hal ini di forum Access for Developers MSDN, tetapi karyawan Microsoft dengan sopan meminta saya untuk tersesat.
Kami memecahkan masalah ini dengan melarang pengembang Access secara internal dari pengaturan pemformatan bersyarat di desainer Formulir Access dan memaksa mereka untuk menggunakan kode VBA sebagai gantinya (yaitu, secara manual mengatur FormatConditionsproperti dalam kode). Ini mungkin atau mungkin bukan solusi yang cocok untuk Anda, bergantung pada ukuran basis kode lama Anda.
Lihat Dapatkan nama kontrol formulir & laporan MS-Access dan Ikhtisar Cepat SaveAsText dan LoadFromText .
Strukturnya terlihat seperti:
Begin {control-class-name}
{property-name} = {value}
End
CodeBehindForm
{attributes}
{declarations}
{body}
Properti PrtMip dalam Visual Basic mengatur atau mengembalikan informasi mode perangkat yang ditentukan untuk formulir atau laporan di kotak dialog Cetak.
ConditionalFormatProperti decoding tampaknya sulit dibandingkan dengan hanya mengulang Koleksi Kontrol Formulir dan memeriksa FormatConditionsproperti .
Mungkin seperti (kode c # dicuri di sini ):
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();