.NET > Obecné

Překlad z VB do C#

(1/2) > >>

erdt.martin:
Budte pozdraveni,

resim ted takovy neprijemny orisek. Delam si jeden mensi projekt a nasel jsem docela pekne vytvorene "knihovny" na netu, ale bohuzel jsou ve VB a ten ja neumim. Lecos jsem si prelozil sam, ale jsou tam prikazy, ktere proste nevim jak prelozit. Moje znalosti C#az tak daleko... Myslite, ze by jste mi s tim mohli pomoc? Pokud to tedy nekdo z vas ovlada...
Pokud to sem nepatri, tak se omlouvam.

Function fceGetAddressInfo(sAdresa, sLokalita)
 Dim oHTTP As New MSXML2.XMLHTTP ' objekt HTTP
 Dim oKML As New DOMDocument     ' objekt XML
 Dim oNode As IXMLDOMNode
 
 Dim sQuery, sURL, sContent
 Dim aResult, i As Integer
 Dim sPref

   sAdresa = Trim(sAdresa) ' zbavíme se mezer před a za
   sLokalita = Trim(sLokalita)
   
   sQuery = sAdresa & IIf(Len(sLokalita) > 0, "," & sLokalita, "")
   sQuery = URLEncode(sQuery) ' korekce URL (diakritika)
   sURL = "http://maps.google.cz/maps/geo?q=" & sQuery & "&gl=cs&hl=cs&output=xml"
   
   ' výsledek dotazu v xml
   With oHTTP
      .Open "GET", sURL, False
      .send
      sContent = .responseText ' do proměnné sContent načteme výsledek v XML
   End With
   
   ' nyní obsah xml budeme parsovat za pomocí MSXML parser
   With oKML                     ' objekt DOM
     .resolveExternals = False   ' externích entity nenačítáme
     .LoadXML (sContent)         ' načtení XML z proměnné
   End With
 
   'Debug.Print sContent         ' obsah proměné vypíšeme do okna Immediate (VBA editor: CTRL + G)
     
   On Error GoTo ErrorHandler    ' některé tagy nemusí existovat, proto budeme chyby zachytávat
   
   ' ověření Status Code (zajímá nás pouze kód 200)
   sResult = fceGetCodeResult(oKML.DocumentElement.SelectSingleNode("//code").Text)
   If sResult <> 1 Then
     fceGetAddressInfo = "ERR: " & sResult
     Exit Function
   End If
   
   ' OK, vyhodnotíme
   i = 0
   aResult = 0
   sPref = "AddressDetails//Country//"
   sRegAddres = fceGetRegular(sAdresa, "^(.*[^0-9]+) ") 'pouze název ulice bez čísla
   
   For Each oNode In oKML.SelectNodes("//Placemark") 'projedeme záznam po záznamu
      With oNode
         sAccuracy = .SelectSingleNode("AddressDetails").Attributes.getNamedItem("Accuracy").Text
         If sAccuracy = 8 Then 'zajímá nás pouze přesnost "8"
             i = i + 1
           
             aTmp = Split(.SelectSingleNode("Point//coordinates").Text, ",")
             sLat = Val(aTmp(1))
             sLon = Val(aTmp(0))
           
             aTmp = Split(.SelectSingleNode("address").Text, ",")
             sAddress = aTmp(0)
             sInfAdr = Trim(aTmp(1))
           
             If i = 1 Then
                ReDim aResult(9, 1)
             Else
                ReDim Preserve aResult(9, i)
             End If
             
             'výsledek uložíme do pole
             aResult(0, i - 1) = IIf(LCase(fceGetRegular(sAddress, _
                   "^(.*[^0-9]+) ")) = LCase(sRegAddres), _
                   IIf(LCase(sAdresa) = LCase(sAddress), 2, 1), 0) '(ne)shoda názvu ul.
             aResult(1, i - 1) = sLat
             aResult(2, i - 1) = sLon
             aResult(3, i - 1) = sAddress
             aResult(4, i - 1) = .SelectSingleNode(sPref & "Locality//LocalityName").Text
             aResult(5, i - 1) = sInfAdr
             aResult(6, i - 1) = .SelectSingleNode(sPref & "Locality//DependentLocality//DependentLocalityName").Text
             aResult(7, i - 1) = .SelectSingleNode(sPref & "Locality//PostalCode//PostalCodeNumber").Text
             aResult(8, i - 1) = .SelectSingleNode(sPref & "CountryName").Text
         End If
      End With
   Next
 
Fin:
   On Error GoTo 0
   Set oNode = Nothing
   Set objHTTP = Nothing
   Set oKML = Nothing
   
   fceGetAddressInfo = aResult 'volající proceduře vrátíme námi vytvořené pole aResult
 Exit Function  ' konec

ErrorHandler: 'vyhodnocení chyby
   Select Case Err.Number
      Case 91
         Resume Next 'chybí požadovaný element (my to však ignorujeme)
      Case Else
         MsgBox "Lituji, vyskytla se chyba!" & vbCrLf & vbCrLf & _
            "Chyba č.:" & vbTab & Err.Number & vbCrLf & _
            "Popis: " & vbTab & Err.Description & vbCrLf & _
            "Kontext:" & vbTab & Err.HelpContext, vbCritical, "Chyba"
         Err.Clear
         GoTo Fin 'skok na návěstí Fin:
   End Select
End Function

'--------------------------------------
' funkce vyhodnotí Status Code
'--------------------------------------
Function fceGetCodeResult(sCode) As String
 Dim sResult
   Select Case sCode
      Case 200
         sResult = 1
      Case 500
         sResult = "Chyba serveru."
      Case 601
         sResult = "Adresa nebyla zadána nebo byla chybně uvedena."
      Case 602
         sResult = "Nepodařilo se najít georeferenci k uvedené adrese."
      Case 603
         sResult = "Tato adresa je legislativně chráněna a nemůže být zveřejněna."
      Case 610
         sResult = "Chybný klíč API."
      Case 620
         sResult = "Překročen povolený limit hledání pro tento API klíč"
      Case Else
         sResult = "Neznámý kód."
   End Select
   fceGetCodeResult = sResult
End Function

'--------------------------------------
' RegExp
'--------------------------------------
Function fceGetRegular(sText, sPattern)
 Dim oRegExp As Object, sRet
   Set oRegExp = CreateObject("VbScript.RegExp")
   With oRegExp
      .Pattern = sPattern
      .Global = True
      .IgnoreCase = True
   End With
   Set matches = oRegExp.Execute(sText)
   For Each Match In matches
      sRet = Trim(Match.Value)
   Next
   fceGetRegular = sRet
End Function

Public Function URLEncode(ByVal StringToEncode As String) As String
'ZDROJ: http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_23770838.html
'by danaseaman, alexspi
   Dim i As Integer, iAsc As Long, sTemp As String
   Dim ByteArrayToEncode() As Byte
   ByteArrayToEncode = ADO_EncodeUTF8(StringToEncode)
   For i = 0 To UBound(ByteArrayToEncode)
      iAsc = ByteArrayToEncode(i)
      Select Case iAsc
         Case 32 'space
            sTemp = "+"
         Case 48 To 57, 65 To 90, 97 To 122
            sTemp = Chr(ByteArrayToEncode(i))
         Case Else
            'Debug.Print iAsc
            sTemp = "%" & Hex(iAsc)
      End Select
      URLEncode = URLEncode & sTemp
   Next
End Function

Public Function ADO_EncodeUTF8(ByVal strUTF16 As String) As Byte()
'ZDROJ: http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_23770838.html
'by danaseaman, alexspi
'Purpose: UTF16 to UTF8 using ADO
   Dim objStream As Object, data() As Byte
   Const adTypeBinary      As Long = 1
   Const adTypeText        As Long = 2
   Const adModeReadWrite   As Long = 3

   Set objStream = CreateObject("ADODB.Stream")
   objStream.Charset = "utf-8"
   objStream.Mode = adModeReadWrite
   objStream.Type = adTypeText
   objStream.Open
   objStream.WriteText strUTF16
   objStream.flush
   objStream.Position = 0
   objStream.Type = adTypeBinary
   objStream.Read 3 ' skip BOM
   data = objStream.Read()
   objStream.Close
   ADO_EncodeUTF8 = data
End Function

TC:

--- Kód: C++ ---'--------------------------------------' funkce vyhodnotí Status Code'--------------------------------------Function fceGetCodeResult(sCode) As String Dim sResult   Select Case sCode      Case 200         sResult = 1      Case 500         sResult = "Chyba serveru."      Case 601         sResult = "Adresa nebyla zadána nebo byla chybně uvedena."      Case 602         sResult = "Nepodařilo se najít georeferenci k uvedené adrese."      Case 603         sResult = "Tato adresa je legislativně chráněna a nemůže být zveřejněna."      Case 610         sResult = "Chybný klíč API."      Case 620         sResult = "Překročen povolený limit hledání pro tento API klíč"      Case Else         sResult = "Neznámý kód."   End Select   fceGetCodeResult = sResultEnd Function 
--- Kód: C++ ---//--------------------------------------// funkce vyhodnotí Status Code//--------------------------------------public string fceGetCodeResult(sCode){        dynamic sResult = null;        switch (sCode) {                case 200:                        sResult = 1;                        break;                case 500:                        sResult = "Chyba serveru.";                        break;                case 601:                        sResult = "Adresa nebyla zadána nebo byla chybně uvedena.";                        break;                case 602:                        sResult = "Nepodařilo se najít georeferenci k uvedené adrese.";                        break;                case 603:                        sResult = "Tato adresa je legislativně chráněna a nemůže být zveřejněna.";                        break;                case 610:                        sResult = "Chybný klíč API.";                        break;                case 620:                        sResult = "Překročen povolený limit hledání pro tento API klíč";                        break;                default:                        sResult = "Neznámý kód.";                        break;        }        return sResult;}   
--- Kód: C++ ---public string URLEncode(string StringToEncode){        string functionReturnValue = null;        //ZDROJ: http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_23770838.html        //by danaseaman, alexspi        int i = 0;        long iAsc = 0;        string sTemp = null;        byte[] ByteArrayToEncode = null;        ByteArrayToEncode = ADO_EncodeUTF8(StringToEncode);        for (i = 0; i <= Information.UBound(ByteArrayToEncode); i++) {                iAsc = ByteArrayToEncode[i];                switch (iAsc) {                        case 32:                                //space                                sTemp = "+";                                break;                        case 48:                        case 49:                        case 50:                        case 51:                        case 52:                        case 53:                        case 54:                        case 55:                        case 56:                        case 57:                        case 65: // TODO: to 90                        case 97: // TODO: to 122                                sTemp = Strings.Chr(ByteArrayToEncode[i]);                                break;                        default:                                //Debug.Print iAsc                                sTemp = "%" + Conversion.Hex(iAsc);                                break;                }                functionReturnValue = functionReturnValue + sTemp;        }        return functionReturnValue;} 
Nyní jenom nezbývá než doufat, že slunéčko naše jasné, moderátor tohoto fóra,  nejvyšší osvícenost hlavní moderátor, a jeho všemocnost majitel fóra budou příznivě naloženi. Dojdou-li totiž k názoru, že publikovaná odpoveď je lepší než na jakou by se zmohlo slunéčko naše jasné moderátor tohoto fóra, nebo se nejvyšší osvícenost hlavní moderátor bude cítit ohrožen na mravnosti nestandardním slovem a nebo jeho všemocnost majitel fóra nebude spokojena s percepcí jeho fóra, tak ten příspěvek smažou.

Zdravim

TC


Mi.Chal.:
Co konkrétně nevíš? U některých .Net jazyků existují i online překladače, stačí tam vložit kód a zkopírovat si ekvivalent v jiném jazyce. Třeba  http://www.carlosag.net/tools/codetranslator/

erdt.martin:
TC: Dekuji :) U toho poslendiho kodu mi to pise nejake errory, asi nemam nejake knihovny?

Mi.Chal. Nezlob se, tvuj odkaz nefunguje... Nerozumim treba tomuto radku:

Dim oHTTP As New MSXML2.XMLHTTP ' objekt HTTP

pochopil jsem to tak, ze vytvorim promennou s nazvem oHTTP, ale jaky typ to je, to vazne netusim...

Jeste me napadlo, nezkouseli jste nekdy nekdo ziskavat GPS souradnice s maps.google.com? Tedy zadam adresu ve tvaru Ulice, mesto (Na Bezdekove 1738, Benesov) a ono mi to vypise GPS souradnice...

Vim, ze to musim resit nasledujicim zpusobem:

1) zadani adresy a mesta uzivatele
2) vytvoreni URL odkazu
3) stazení obsahu xml (z URL odkazu) (slo by to rovnou do nejakeho pole)???
//4) parsovani adres v XML do nejakeho pole
5) vypsani

dejme tomu, ze znam jak by mel vypadat URL odkaz: "http://maps.google.cz/maps/geo?q=" + sQuery + "&gl=cs&hl=cs&output=xml"
kde sQuery obsahuje Ulice,Mesto, pokud jsme to dobre pochopil:
sQuery = sAdresa & IIf(Len(sLokalita) > 0, "," & sLokalita, "")
sQuery = URLEncode(sQuery) ' korekce URL (diakritika) // tento radek by mel zavolat funkci na prevod url do bezdiakritickeho stavu

TC:
Pet sekund na Google:

http://msdn.microsoft.com/en-us/library/ie/ms535874%28v=vs.85%29.aspx


--- Kód: C++ ---function getXMLHttpRequest() {    if (window.XMLHttpRequest) {        return new window.XMLHttpRequest;    }    else {        try {            return new ActiveXObject("MSXML2.XMLHTTP.3.0");        }        catch(ex) {            return null;        }    }}
Nyní jenom nezbývá než doufat, že slunéčko naše jasné, moderátor tohoto fóra,  nejvyšší osvícenost hlavní moderátor, a jeho všemocnost majitel fóra budou příznivě naloženi. Dojdou-li totiž k názoru, že publikovaná odpoveď je lepší než na jakou by se zmohlo slunéčko naše jasné moderátor tohoto fóra, nebo se nejvyšší osvícenost hlavní moderátor bude cítit ohrožen na mravnosti nestandardním slovem a nebo jeho všemocnost majitel fóra nebude spokojena s percepcí jeho fóra, tak ten příspěvek smažou.
Zdravim

TC

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi