Od 2015-02-19 komponent TWebBrowser wywala błąd w JavaScript.

0

Witam. Mam soft,który ma komponent TWebBrowser. Exe skompilowany od jakiegoś czasu i działał. Od mniej więcej środy zdaje się albo wtorku (2015-02-17), przestał działać. Przy próbie wykonania tego samego skryptu co wcześniej zaczął pokazywać błąd. Skrypt nie zmieniony, exe nie zmieniony. Nie wiem co jest grane. Chodzi o geotagowanie Google (gogle maps).
Mało tego, jak odpalę ten skrypt w przeglądarce IE czy FireFox działającej samodzielnie (nie w moim exe jako TBrowser) to jak działało to i dalej działa. Problem zaczął się pojawiać tylko w TWebBrowser.

Komunikat z błędem jest taki: Nie można odczytać właściwości: display. Nieprawidłowy argument.

Wiem nawet na jakiej metodzie się wywala, na wywołaniu "map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);"
Oczywiście jak wspomniałem już, to samo jak odpalę "normalnie" czyli nie z exe tylko z przeglądarki to działa. Co dziwne na starych XP to dalej działa. Na Win8 działało i przestało przedwczoraj. Co jest ?

Skrypt jest taki np.:

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta http-equiv="Content-Language" content="pl">
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
    <title>Geocoding service</title>
    <style>
      html, body, #map-canvas {
        height: 100%;
        margin: 0px;
        padding: 0px
      }
      #panel {
        position: absolute;
        top: 5px;
        left: 20%;
        margin-left: 0px;
        z-index: 5;
        background-color: #fff;
        padding: 5px;
        border: 1px solid #999;
      }
    </style>
    <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
    <script>

var geocoder;
var map;
var markersArray = [];
var infowindow = new google.maps.InfoWindow(); 

function initialize() {
  geocoder = new google.maps.Geocoder();
  var latlng = new google.maps.LatLng(52.173931692568, 18.8525390625);
  var mapOptions = {
    zoom: 8,
    center: latlng
  }
  
  map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
  codeAddress();
}

// Czyszczenie wszystkich markerów na mapie
function clearOverlays() {
  for (var i = 0; i < markersArray.length; i++ ) {
    markersArray[i].setMap(null);
  }
  markersArray.length = 0;
}

//Rozkodowanie adresu na lokalizację i ustawienie markera na pozycji
function codeAddress() {
  var address = document.getElementById('address').value;
  geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      map.setCenter(results[0].geometry.location);
      clearOverlays();
      var marker = new google.maps.Marker({
          map: map,
          position: results[0].geometry.location
        });
      markersArray.push(marker);
      map.setZoom(19);
    } else {
      alert('Geocode was not successful for the following reason: ' + status);
    }
  });
}


function codeLatLng() { 
  var input = document.getElementById('latlng').value; 
  var latlngStr = input.split(',', 2); 
  var lat = parseFloat(latlngStr[0]); 
  var lng = parseFloat(latlngStr[1]); 
  var latlng = new google.maps.LatLng(lat, lng); 
  geocoder.geocode({'latLng': latlng}, function(results, status) { 
    if (status == google.maps.GeocoderStatus.OK) { 
      if (results[1]) { 
        map.setCenter(latlng);
        var marker = new google.maps.Marker({ 
            map: map,
            position: latlng
        }); 
        map.setZoom(19); 
        infowindow.setContent(results[1].formatted_address); 
        infowindow.open(map, marker);
        document.getElementById('address').value = results[1].formatted_address; 
      } else { 
        alert('No results found'); 
      } 
    } else { 
      alert('Geocoder failed due to: ' + status); 
    } 
  }); 
}

 google.maps.event.addDomListener(window, 'load', initialize);

    </script>
  </head>
  <body>
    <div id="panel">
      <input id="address" name="address" size="70" type="textbox" value="Warszawa, ul. Akademicka 5">
      <input type="button" value="Ustaw po adresie" onclick="codeAddress()">
      <br>
      <input id="latlng" size="30" type="textbox" value=""> 
      <input type="button" value="Ustaw po GPS" onclick="codeLatLng()">
    </div>
    <div id="map-canvas"></div>
  </body>
</html>
1

Znalazłem w Google na to "lekarstwo" którym okazał się artykuł https://msdn.microsoft.com/en-us/library/ie/ee330730%28v=vs.85%29.aspx na podstawie którego napisałem kod dla Delphi, który będzie tworzył odpowiedni klucz. Jest to gotowa procedura dla Delphi >= XE2 w starszych trzeba "na piechotę" wyciągać wersję systemu a mi się nie chciało bawić... w każdym razie spokojnie da się to zrobić a nawet znaleźć w sieci gotowca ;) Wywołanie procedury trzeba umieścić przy uruchamianiu programu np. w OnCreate formy. Procedura tworzy klucz w rejestrze nakazujący systemowi emulować odpowiednią wersje przeglądarki dla danej aplikacji (którą rozpoznaje po nazwie pliku exe).

procedure IEbrowserEmulate();
const
  KEY_PATH = 'SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION';
var
  Reg: TRegistry;
  AppName: string;
begin
  Reg:= TRegistry.Create; //w Delphi domyslnie RootKey to HKEY_CURRENT_USER więc OK ;)
  try
    if not Reg.OpenKey(KEY_PATH, True) then Exit;

    AppName:= ExtractFileName(Application.ExeName);

    if (TOSVersion.Major = 5) and (TOSVersion.Minor = 1) then //Windows XP
      Reg.WriteInteger(AppName, 8000) //IE 8
    else if (TOSVersion.Major = 6) and ((TOSVersion.Minor = 0) or (TOSVersion.Minor = 1)) then //Windows Vista lub 7
      Reg.WriteInteger(AppName, 9000) //IE 9
    else if (TOSVersion.Major = 6) and ((TOSVersion.Minor = 2) or (TOSVersion.Minor = 3)) then //Windows 8 lub 8.1
      Reg.WriteInteger(AppName, 10000) //IE 10
    else if (TOSVersion.Major = 6) and (TOSVersion.Minor = 4) then //Win 10 (przynajmniej preview)
      Reg.WriteInteger(AppName, 11000); //IE 11

    Reg.CloseKey;
  finally
    Reg.Free;
  end;

PS: Mogłem coś namieszać z wersjami systemu więc jak coś sprawdź to. W każdym razie na Windows 7 działa.

0

Super, dzięki - działa 100%. Ponieważ mam XE w wersji pierwszej to skorzystałem z:

// Zwraca wersję systemu operacyjnego, zarówno w postaci zmiennej var jak i łańcucha znakowego
function GetOsVersion(var Os: TOsVersionInfo): string;
 var s: string;
begin
 Os.dwOSVersionInfoSize := SizeOf(os);
 GetVersionEx(os);
 case os.dwPlatformId of
  VER_PLATFORM_WIN32s: s := 'WIN 3.1';
  VER_PLATFORM_WIN32_WINDOWS: s := 'WIN 9x';
  VER_PLATFORM_WIN32_NT: s := 'WIN NT';
 end;
 Result := Format('Platform id=%d, Platform=%s, Major=%d, Minor=%d, Build=%d',[Os.dwPlatformId, s, Os.dwMajorVersion, Os.dwMinorVersion, Os.dwBuildNumber]);
end;
  • dodane znaczniki <delphi> - olesio*

1 użytkowników online, w tym zalogowanych: 0, gości: 1