Autor Téma: Překlad z VB do C#  (Přečteno 9938 krát)

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Překlad z VB do C#
« kdy: 06-07-2012, 14:34:22 »
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

Offline TC

  • Příspěvků: 20
  • Karma: 1
Re:Překlad z VB do C#
« Odpověď #1 kdy: 06-07-2012, 14:52:44 »
Kód: C++ [Vybrat]
  1. '--------------------------------------
  2. ' funkce vyhodnotí Status Code
  3. '--------------------------------------
  4. Function fceGetCodeResult(sCode) As String
  5. Dim sResult
  6.   Select Case sCode
  7.      Case 200
  8.         sResult = 1
  9.      Case 500
  10.         sResult = "Chyba serveru."
  11.      Case 601
  12.         sResult = "Adresa nebyla zadána nebo byla chybně uvedena."
  13.      Case 602
  14.         sResult = "Nepodařilo se najít georeferenci k uvedené adrese."
  15.      Case 603
  16.         sResult = "Tato adresa je legislativně chráněna a nemůže být zveřejněna."
  17.      Case 610
  18.         sResult = "Chybný klíč API."
  19.      Case 620
  20.         sResult = "Překročen povolený limit hledání pro tento API klíč"
  21.      Case Else
  22.         sResult = "Neznámý kód."
  23.   End Select
  24.   fceGetCodeResult = sResult
  25. End Function
  26.  
Kód: C++ [Vybrat]
  1. //--------------------------------------
  2. // funkce vyhodnotí Status Code
  3. //--------------------------------------
  4. public string fceGetCodeResult(sCode)
  5. {
  6.         dynamic sResult = null;
  7.         switch (sCode) {
  8.                 case 200:
  9.                         sResult = 1;
  10.                         break;
  11.                 case 500:
  12.                         sResult = "Chyba serveru.";
  13.                         break;
  14.                 case 601:
  15.                         sResult = "Adresa nebyla zadána nebo byla chybně uvedena.";
  16.                         break;
  17.                 case 602:
  18.                         sResult = "Nepodařilo se najít georeferenci k uvedené adrese.";
  19.                         break;
  20.                 case 603:
  21.                         sResult = "Tato adresa je legislativně chráněna a nemůže být zveřejněna.";
  22.                         break;
  23.                 case 610:
  24.                         sResult = "Chybný klíč API.";
  25.                         break;
  26.                 case 620:
  27.                         sResult = "Překročen povolený limit hledání pro tento API klíč";
  28.                         break;
  29.                 default:
  30.                         sResult = "Neznámý kód.";
  31.                         break;
  32.         }
  33.         return sResult;
  34. }
  35.  
  36.  
  37.  
Kód: C++ [Vybrat]
  1. public string URLEncode(string StringToEncode)
  2. {
  3.         string functionReturnValue = null;
  4.         //ZDROJ: http://www.experts-exchange.com/Programming/Languages/Visual_Basic/Q_23770838.html
  5.         //by danaseaman, alexspi
  6.         int i = 0;
  7.         long iAsc = 0;
  8.         string sTemp = null;
  9.         byte[] ByteArrayToEncode = null;
  10.         ByteArrayToEncode = ADO_EncodeUTF8(StringToEncode);
  11.         for (i = 0; i <= Information.UBound(ByteArrayToEncode); i++) {
  12.                 iAsc = ByteArrayToEncode[i];
  13.                 switch (iAsc) {
  14.                         case 32:
  15.                                 //space
  16.                                 sTemp = "+";
  17.                                 break;
  18.                         case 48:
  19.                         case 49:
  20.                         case 50:
  21.                         case 51:
  22.                         case 52:
  23.                         case 53:
  24.                         case 54:
  25.                         case 55:
  26.                         case 56:
  27.                         case 57:
  28.                         case 65: // TODO: to 90
  29.                         case 97: // TODO: to 122
  30.                                 sTemp = Strings.Chr(ByteArrayToEncode[i]);
  31.                                 break;
  32.                         default:
  33.                                 //Debug.Print iAsc
  34.                                 sTemp = "%" + Conversion.Hex(iAsc);
  35.                                 break;
  36.                 }
  37.                 functionReturnValue = functionReturnValue + sTemp;
  38.         }
  39.         return functionReturnValue;
  40. }
  41.  

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


« Poslední změna: 11-07-2012, 16:35:58 od TC »

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:Překlad z VB do C#
« Odpověď #2 kdy: 06-07-2012, 14:55:29 »
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/

Offline erdt.martin

  • Příspěvků: 35
  • Karma: 0
Re:Překlad z VB do C#
« Odpověď #3 kdy: 06-07-2012, 15:22:06 »
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


Offline TC

  • Příspěvků: 20
  • Karma: 1
Re:Překlad z VB do C#
« Odpověď #4 kdy: 06-07-2012, 15:31:28 »
Pet sekund na Google:

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

Kód: C++ [Vybrat]
  1. function getXMLHttpRequest()
  2. {
  3.     if (window.XMLHttpRequest) {
  4.         return new window.XMLHttpRequest;
  5.     }
  6.     else {
  7.         try {
  8.             return new ActiveXObject("MSXML2.XMLHTTP.3.0");
  9.         }
  10.         catch(ex) {
  11.             return null;
  12.         }
  13.     }
  14. }

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
« Poslední změna: 11-07-2012, 16:36:29 od TC »

Offline Mi.Chal.

  • Moderátoři
  • Guru
  • *****
  • Příspěvků: 577
  • Karma: 25
Re:Překlad z VB do C#
« Odpověď #5 kdy: 06-07-2012, 15:33:14 »
Mi.Chal. Nezlob se, tvuj odkaz nefunguje... Nerozumim treba tomuto radku:

Já se nezlobím, ale mě to funguje normálně. Asi bude chyba na tvém přijímači. Pokud použiješ vyhledávač, tak těch konvertorů najdeš hromadu, tak zkus něco jiného.

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

nejspíš ten XmlHttp. Prostě dim je deklarace proměnné, volitelně následuje as s názvem typu