Access Application.SaveAsText हेक्स मान पढ़ें

Sep 11 2020

मैं एक VB.net आवेदन के भीतर application.saveastext का उपयोग कर पाठ फ़ाइलों के लिए कई पहुँच वस्तुओं का निर्यात किया है। मैं इसे पूरा करने के लिए Microsoft.Interop का उपयोग कर रहा हूं। आदर्श रूप में मैं तब हेक्साडेसिमल भागों सहित परिणामी पाठ फ़ाइल (ओं) के माध्यम से पढ़ना चाहता हूं।

मैं समझता हूं कि एक्सेस में उन फ़ाइलों का उपयोग करके पाठ से कैसे लोड किया जाए, लेकिन मैं इस बारे में पूछताछ कर रहा हूं कि उन फ़ाइलों के भीतर हेक्स मानों को अलग से vb.net एप्लिकेशन में कैसे पढ़ा जाए। फ़ाइलों में से एक के भीतर एक उदाहरण हेक्स स्ट्रिंग इस तरह दिखता है।

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

इस बिंदु पर मैंने जो कुछ करने की कोशिश की है वह यह देखने के लिए कुछ ऑनलाइन डिकोडर का उपयोग कर रहा है कि क्या मैं आसानी से उन्हें एक स्ट्रिंग में बदल सकता हूं। इसके बजाय मुझे जो मिल रहा है वह विशेष अक्षर और अपठनीय पाठ है। मैंने Application.saveastext से संबंधित विभिन्न विषयों पर बड़े पैमाने पर खोज की है, लेकिन Microsoft ने वास्तव में उस प्रक्रिया का दस्तावेजीकरण भी नहीं किया है और मुझे इस विषय पर कुछ भी व्यापक नहीं दिखाई दे रहा है।

किसी को भी इस के साथ अनुभव है या मुझे एक दिशा में बात कर सकते हैं?

जवाब

1 Heinzi Nov 03 2020 at 15:47

हेक्स अंकों के इन ब्लॉकों को कैसे डिकोड किया जाए?

(उन्हें दो अक्षर के ब्लॉक में विभाजित करें: संक्षेप में 0x5b0046-> 5b, 00, 46फिर उन्हें पार्स और एक बाइट सरणी में, ...)। यहां वह कोड है जिसका उपयोग हम करते हैं:

''' <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

और यहाँ StringTools.SplitOnLengthसहायक विधि का इस्तेमाल किया गया है:

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

और इन बाइट सरणियों का क्या मतलब है?

निर्भर करता है। यह वही है जो हमने अब तक पता लगाया है:

  • PrtDevNames / PrtDevNamesW DEVNAMES संरचना के ANSI / यूनिकोड संस्करण हैं ।
  • PrtDevMode / PrtDevModeW DEVMODE संरचना के ANSI / यूनिकोड संस्करण हैं ।

ConditionalFormat और ConditionalFormat14 के बारे में क्या? दुर्भाग्य से, वे कुछ अनिर्दिष्ट द्विआधारी डेटा संरचना को शामिल करते हैं। तीन साल पहले, मैंने MSDN के डेवलपर्स फोरम के लिए इस बारे में पूछा था, लेकिन Microsoft कर्मचारी ने मुझे विनम्रता से कहा कि मैं हार गया।

हमने एक्सेस डेवलपर्स में सशर्त स्वरूपण सेट करने से उन्हें एक्सेस डेवलपर्स को आंतरिक रूप से प्रतिबंधित करने और वीबीए कोड का उपयोग करने के लिए मजबूर करने (यानी, मैन्युअल रूप FormatConditionsसे कोड में संपत्ति सेट करने ) द्वारा इस मुद्दे को हल किया । यह आपकी विरासत कोडबेस के आकार के आधार पर आपके लिए एक उपयुक्त समाधान हो सकता है या नहीं भी हो सकता है।

ComputerVersteher Sep 11 2020 at 09:21

पर एक नज़र डालें एमएस एक्सेस रूपों और रिपोर्ट के प्राप्त नियंत्रण के नाम और SaveAsText और LoadFromText के त्वरित अवलोकन ।

संरचना प्रतीत होती है:

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

Visual Basic सेट में PrtMip गुण या प्रिंट संवाद बॉक्स में फ़ॉर्म या रिपोर्ट के लिए निर्दिष्ट डिवाइस मोड जानकारी देता है।

डिकोडिंग ConditionalFormatप्रॉपर्टी सिर्फ फॉर्म कंट्रोल-कलेक्शन को लूप करने और FormatConditionsप्रॉपर्टी का निरीक्षण करने की तुलना में कठिन लगता है ।

मई sth की तरह हो सकता है (सी # कोड यहाँ चोरी ):

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();