Delphi ve Google Maps API

// 6 Haziran 2009 // Delphi, Internet, Programlama

google_maps Hepimizin bildiği üzere Google arama motorunun popüler haritalama hizmetidir Google Maps. Gelişen teknoloji ile iyice küçülen dünyamızı evlerinizde gözlerinizin önüne getiren faydalı bir hizmet. Hizmete girmesinden kısa bir zaman sonra popülerliğini arttıran Google Map, sunduğu API’ler ile daha da yaygınlaşacağa benzer.

Artık hemen hemen her web sitesinde bir Google Map haritasına rastlamak mümkün. Ancak masaüstü uygulamalarda emsaline pek rastlanılmıyor henüz. Bizim makalemizin konusu ise masaüstü uygulamalarda Google Maps API’lerini kullanmak. Devasa bir hizmet kütüphanesi olma yolunda hızla ilerleyen Google Maps’in tüm özelliklerini detaylıca anlatmamız elbette mümkün değil; ancak makelemiz, Delphi’de TWebBrowser nesnesi vasıtası ile Google MAP API’lerinin kullanımını ve JavaScript – Delphi interaktif haberleşmesini anlatacak.

Makalemizi okumakta ilerlemeden evvel, Delphi & JavaScript Kardeşliği isimli makalemizi okumanız faydalı olacaktır. Google’ın bizlere sunduğu bu harita hizmeti ile haberleşmenin temellerini “Delphi & JavaScript Kardeşliği” isimli makalemizde anlattığımız için bu kısımda haritalama hizmetini kullanacak olan JavaScript sınıf tanımını, bu sınıfın Delphi altından kullanımını ve karşılıklı etkileşimini göstereceğim.

JavaScript hususunda pek bilgili olduğum söylenemez, bu vesile ile yapmış olabileceğim hatalardan yada yanlış kullanımlardan ötürü şimdiden affınızı istirham edeceğim. Google Maps’in hizmetlerinden istifade edebilmemiz için hemen hemen heryerde rastlayabileceğiniz; “Google Maps API Key almalısınız” tavsiyesini ben yapmayacağım. Çünkü key’siz de çalışabiliyor bu hizmet. Sitemde bu hizmetten faydalanmadığım için, API Key gereksinimi hakkında pek derin bilgi veremeyeceğim ama geliştirdiğim ve sizlerle paylaşacağım masaüstü uygulamasında bu key’e ihtiyaç duymadım. Ancak sizler illa da key olsun kırmızıdan olsun derseniz, buyurun adresi burası.

Makalemize geçmeden evvel haritalama hususunda okul hayatımızdaki bilgileri anımsamakta fayda olduğunu düşünüyorum. Ülkemiz 36-42 kuzey paralelleri ve 26-45 doğu meridyenleri arasındadır. Google Maps’de latitude ve longitude olarak isimlendirilen kavramlar bu enlem ve boylam bilgilerinden ibarettir. Enlem ve boylam bilgisini bildiğimiz herhangi bir lokasyona Google Map üzerinden erişmemiz son derece kolaydır. Ancak, Google haritalama hizmetinde dünya üzerindeki her ülkeye henüz destek vermemektedir. Hangi ülkelerde hangi google maps fonksiyonalitesinin kullanılabildiğini merak ederseniz eğer, bu adresten bakabilirsiniz.

Kod örneklerimize geçmeden evvel, ülkemizin haritasını yayınlamak istiyorum. Bu harita, sizin denemeleriniz için faydalı olabilir.

turkiye_enlem_boylam_haritasi

Şimdi esas işi yapacak olan JavaScript sınıfımıza bir göz gezdirelim:

function TGoogleMap()
{
    var map = null;
    var smallMapControl = null;
    var smallZoomControl= null;

    this.CreateMap = CreateMap;
    this.Render = Render;
    this.FindGeoCode = FindGeoCode;
    this.AddMarker = AddMarker;
    this.OpenInfoWindow = OpenInfoWindow;
    this.CloseInfoWindow = CloseInfoWindow;
    this.AddSmallMapControl = AddSmallMapControl;
    this.AddSmallZoomControl = AddSmallZoomControl;
    this.RemoveSmallMapControl = RemoveSmallMapControl;
    this.RemoveSmallZoomControl = RemoveSmallZoomControl;
    this.GotoCoordinat = GotoCoordinat;



    function CreateMap()
    {
        map = new GMap2(document.getElementById("Canvas"));

        GEvent.addListener(map, "click", function(overlay, point, overlaypoint) { if(point) external.DoClick(point.lat(), point.lng()); } );
    }

    function Render(lat, lng)
    {
        map.setCenter(new GLatLng(lat, lng), 15);
    }

    function FindGeoCode(address)
    {
        var geoCoder = new GClientGeocoder();
        geoCoder.getLatLng(address,
                     function(point)
                     {
                         if (!point) { external.DoError("Belirtilen adres bulunamadı.!"); }
                         else
                         {
                             external.DoGeoCodeFound(point.lat(), point.lng());
                         }
                     }
                           );
    }

    function AddMarker(lat, lng, draggable)
    {
        var marker;

        if (draggable)
        {
            marker = new GMarker(new GLatLng(lat, lng), {draggable: true});
        }
        else
        {
            marker = new GMarker(new GLatLng(lat, lng), {draggable: false});
        }

        map.addOverlay(marker);
        GEvent.addListener(marker, "click", function()
            {
                var coord = marker.getLatLng();
                if (coord)
                    external.DoMarkerClick(coord.lat(), coord.lng());
            } );
    }


    function OpenInfoWindow(lat, lng, message)
    {
        map.openInfoWindow(new GLatLng(lat, lng),
                           document.createTextNode(message));

    }

    function CloseInfoWindow()
    {
        map.closeInfoWindow();
    }

    function AddSmallMapControl()
    {
        if (!smallMapControl)
        {
            smallMapControl = new GSmallMapControl();
            map.addControl(smallMapControl);
        }
    }

    function AddSmallZoomControl()
    {
        if (!smallZoomControl)
        {
            smallZoomControl = new GSmallZoomControl();
            map.addControl(smallZoomControl);
        }
    }

    function RemoveSmallMapControl()
    {
        if (smallMapControl)
        {
            map.removeControl(smallMapControl);
            smallMapControl = null;
        }
    }

    function RemoveSmallZoomControl()
    {
        if (smallZoomControl)
        {
            map.removeControl(smallZoomControl);
            smallZoomControl = null;
        }
    }

    function GotoCoordinat(lat, lng)
    {
        map.panTo(new GLatLng(lat, lng));
    }

}

var GoogleMap = new TGoogleMap();

Yukarıda TGoogleMap isimlli bir sınıf tanımladık. Bu sınıfın CreateMap metodu, bir google harita nesnesi oluşturacak ve bu haritaya mouse ile tıklanması durumunda, Delphi’deki DoClick metodu tetiklenecek. Haritamızı Delphi’de TWebBrowser nesnesi aracılığı ile göstereceğimizi daha önce söylemiştik. Bunun için bize bir de HTML dosyası lazım. Henüz html dosyasının içeriğini paylaşmayacağım, çünkü daha anlatmamız gereken hususlar var bu JavaScript sınıfında. Ancak bir ön bilgi olarak, JavaScript sınıfımız içinde tanımladığımız CreateMap() isimli metodu, html dosyamızın body bölümünde onload event’ine yazacağız. Bu sayede, html dökümanımız yüklenir yüklenmez, harita nesnemiz oluşturulmuş olacak.

Yukarıda tanımını gördüğünüz JavaScript ile yazılmış TGoogleMap isimli sınıfımızın metodları; en yaygın kullanıldığına inandığım kısımları içeriyor. Elbette Google Maps API’si çok daha devasa boyutlarda ve burada sizinle paylaştıklarımdan çok daha fazlasını yapmaya muktedir. Bizim JavaScript sınıfımız, belirttiğiniz bir adrese ait olan enlem ve boylam bilgisini bulabilen, bu koordinata gidebilen, harita üzerine bir işaretçi(marker) bırakabilen ve istediğiniz bir metin mesajını istenilen enlem ve boylamda ekrana getirebilen küçük bir sınıf. Sizler bu sınıfa yeni özellikler eklemek, daha da yeteneklendirmek arzusunda iseniz, Google Maps API referans sayfasına uğramalısınız.

Render isimli metodumuz ise, belirtilen bir enlem boylamdaki harita bilgisini ekrana yansıtacaktır. Diğer metodların kendisini izah edebildiğini düşünerek, Delphi & Google Maps işbirliğine geçiyorum müsaadenizle.

Delphi & JavaScript konusunda izah etmeye çalıştığım hususları bu örneğimizde de kullanacağız. Örneğimizde izah etmeyeceğimiz bölümleri bir önceki makalemizden takip edebilirsiniz.

//frmGoogleMap uygulamamızın ana formudur..

  TApplicationWrapper = class(TObjectWrapper)
  private
    function GetApplication: TApplication;
  published
    procedure DoError(ErrorMessage : String);
    procedure DoGeoCodeFound(lat, lng : Double);
    procedure DoClick(lat, lng : Double);
    procedure DoMarkerClick(lat, lng : Double);

    property Application: TApplication read GetApplication;
  end;

var
  frmGoogleMap: TfrmGoogleMap;

  MarkerLat,
  MarkerLng : Double;

implementation

{$R *.dfm}

const
  Enter             = Char(13) + Char(10);
  HtmlFirstSection  = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ' + Enter +
                      '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';

  HtmlStartSection  = '<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">';
  HtmlEndSection    = '</html>';
  HeadStartSection  = '<head>';
  HeadEndSection    = '</head>';

  BodyStartSection  = '<body onload="GoogleMap.CreateMap()" onunload="GUnload()">';
  BodyEndSection    = '</body>';
  BodyGoogle        = '<div id="Canvas" style="width: 500px; height: 300px"></div>';

  ScriptGoogle      = '<script src="http://maps.google.com/maps?file=api&v=2&sensor=true&key=" '+
                      'type="text/javascript"></script>';


  ScriptStartSection= '<script type="text/javascript">';
  ScriptEndSection  = '</script>';
  MetaSection       = '<meta http-equiv="content-type" content="text/html; charset=utf-8"/>';


  HTML = HtmlFirstSection         + Enter +
         HtmlStartSection         + Enter +
          HeadStartSection        + Enter +
            MetaSection           + Enter +
            ScriptGoogle          + Enter +
            '%HEADSECTION%'       + Enter +
            '%SCRIPTSECTION%'     + Enter +
          HeadEndSection          + Enter +
          BodyStartSection        + Enter +
            BodyGoogle            + Enter +
            '%BODYSECTION%'       + Enter +
          BodyEndSection          + Enter +
         HtmlEndSection;


procedure LoadHTML(WebBrowser: TWebBrowser; HTMLCode: String);
var
  sl: TStringList;
  ms: TMemoryStream;
begin
  WebBrowser.Navigate('about:blank') ;

  if Assigned(WebBrowser.Document) then
  begin
     sl := TStringList.Create;
     try
        ms := TMemoryStream.Create;
        try
           sl.Text := HTMLCode;
           sl.SaveToStream(ms);
           ms.Seek(0, 0);
           (WebBrowser.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms));
        finally
           ms.Free;
        end;
     finally
        sl.Free;
     end;
  end;
end;

const
  JSGoogle =
   ' function TGoogleMap() ' + Enter +
   ' { ' + Enter +
   '     var map = null; ' + Enter +
   '     var smallMapControl = null; ' + Enter +
   '     var smallZoomControl= null; ' + Enter +

   '     this.CreateMap = CreateMap; ' + Enter +
   '     this.Render = Render; ' + Enter +
   '     this.FindGeoCode = FindGeoCode; ' + Enter +
   '     this.AddMarker = AddMarker; ' + Enter +
   '     this.OpenInfoWindow = OpenInfoWindow; ' + Enter +
   '     this.CloseInfoWindow = CloseInfoWindow; ' + Enter +
   '     this.AddSmallMapControl = AddSmallMapControl; ' + Enter +
   '     this.AddSmallZoomControl = AddSmallZoomControl; ' + Enter +
   '     this.RemoveSmallMapControl = RemoveSmallMapControl; ' + Enter +
   '     this.RemoveSmallZoomControl = RemoveSmallZoomControl; ' + Enter +
   '     this.GotoCoordinat = GotoCoordinat; ' + Enter +

   '     function CreateMap() ' + Enter +
   '     { ' + Enter +
   '         map = new GMap2(document.getElementById("Canvas")); ' + Enter +

   '         GEvent.addListener(map, "click", function(overlay, point, overlaypoint) { if(point) external.DoClick(point.lat(), point.lng()); } ); ' + Enter +
   '     } ' + Enter +

   '     function Render(lat, lng) ' + Enter +
   '     { ' + Enter +
   '         map.setCenter(new GLatLng(lat, lng), 15); ' + Enter +
   '     } ' + Enter +

   '     function FindGeoCode(address) ' + Enter +
   '     { ' + Enter +
   '         var geoCoder = new GClientGeocoder(); ' + Enter +
   '         geoCoder.getLatLng(address, ' + Enter +
   '                                     function(point) ' + Enter +
   '                                     { ' + Enter +
   '                                         if (!point) { external.DoError("Belirtilen adres bulunamadi.!"); } ' + Enter +
   '                                         else ' + Enter +
   '                                         { ' + Enter +
   '                                             external.DoGeoCodeFound(point.lat(), point.lng()); ' + Enter +
   '                                         } ' + Enter +
   '                                     } ' + Enter +
   '                            ); ' + Enter +
   '     } ' + Enter +

   '     function AddMarker(lat, lng, draggable) ' + Enter +
   '     { ' + Enter +
   '         var marker; ' + Enter +

   '         if (draggable) ' + Enter +
   '         { ' + Enter +
   '             marker = new GMarker(new GLatLng(lat, lng), {draggable: true}); ' + Enter +
   '         } ' + Enter +
   '         else ' + Enter +
   '         { ' + Enter +
   '             marker = new GMarker(new GLatLng(lat, lng), {draggable: false}); ' + Enter +
   '         } ' + Enter +

   '         map.addOverlay(marker); ' + Enter +
   '         GEvent.addListener(marker, "click", function() {' +
   '              var coord = marker.getLatLng();' + Enter +
   '              if(coord)' + Enter +
   '                 external.DoMarkerClick(coord.lat(), coord.lng()); } );' + Enter +
   '     } ' + Enter +

   '     function OpenInfoWindow(lat, lng, message) ' + Enter +
   '     { ' + Enter +
   '         map.openInfoWindow(new GLatLng(lat, lng), ' + Enter +
   '                            document.createTextNode(message)); ' + Enter +
   '     } ' + Enter +

   '     function CloseInfoWindow() ' + Enter +
   '     { ' + Enter +
   '         map.closeInfoWindow(); ' + Enter +
   '     } ' + Enter +

   '     function AddSmallMapControl() ' + Enter +
   '     { ' + Enter +
   '         if (!smallMapControl) ' + Enter +
   '         { ' + Enter +
   '             smallMapControl = new GSmallMapControl(); ' + Enter +
   '             map.addControl(smallMapControl); ' + Enter +
   '         } ' + Enter +
   '     } ' + Enter +

   '     function AddSmallZoomControl() ' + Enter +
   '     { ' + Enter +
   '         if (!smallZoomControl) ' + Enter +
   '         { ' + Enter +
   '             smallZoomControl = new GSmallZoomControl(); ' + Enter +
   '             map.addControl(smallZoomControl); ' + Enter +
   '         } ' + Enter +
   '     } ' + Enter +

   '     function RemoveSmallMapControl() ' + Enter +
   '     { ' + Enter +
   '         if (smallMapControl) ' + Enter +
   '         { ' + Enter +
   '             map.removeControl(smallMapControl); ' + Enter +
   '             smallMapControl = null; ' + Enter +
   '         } ' + Enter +
   '     } ' + Enter +

   '     function RemoveSmallZoomControl() ' + Enter +
   '     { ' + Enter +
   '         if (smallZoomControl) ' + Enter +
   '         { ' + Enter +
   '             map.removeControl(smallZoomControl); ' + Enter +
   '             smallZoomControl = null; ' + Enter +
   '         } ' + Enter +
   '     } ' + Enter +

   '     function GotoCoordinat(lat, lng) ' + Enter +
   '     { ' + Enter +
   '         map.panTo(new GLatLng(lat, lng)); ' + Enter +
   '     } ' + Enter +
   ' } ' + Enter +

   ' var GoogleMap = new TGoogleMap(); ';

{ TApplicationWrapper }

procedure TApplicationWrapper.DoClick(lat, lng: Double);
begin
  frmGoogleMap.Caption := 'Map Clicked. Lat:' + FloatToStr(lat) + ' / Lng:' + FloatToStr(lng);
end;

procedure TApplicationWrapper.DoMarkerClick(lat, lng: Double);
begin
  frmGoogleMap.Caption := 'Marker Clicked. Lat:' + FloatToStr(lat) + ' / Lng:' + FloatToStr(lng);
end;

procedure TApplicationWrapper.DoError(ErrorMessage: String);
begin
  ShowMessage('Hata oluştu:' + ErrorMessage);
end;

procedure TApplicationWrapper.DoGeoCodeFound(lat, lng: Double);
var
  Doc : IHTMLDocument2;
  Win : IHTMLWindow2;
  sLat,
  sLng : String;
begin
  frmGoogleMap.Caption := 'Geocode found. Lat=' + FloatToStr(lat) + ', Lng=' + FloatToStr(lng);

  sLat := FloatToStr(lat);
  sLng := FloatToStr(lng);

  sLat := StringReplace(sLat, ',', '.', [rfReplaceAll]);
  sLng := StringReplace(sLng, ',', '.', [rfReplaceAll]);

  Doc := frmGoogleMap.wBrowser.Document as IHTMLDocument2;
  Win := Doc.parentWindow;

  Win.execScript('GoogleMap.Render(' + sLat + ',' + sLng + ')', 'JavaScript');

  MarkerLat := lat;
  MarkerLng := lng;
end;

function TApplicationWrapper.GetApplication: TApplication;
begin
  Result := Forms.Application;
end;

Yukarıdaki kod bloğunda, daha önce izah ettiğimiz Delphi & JavaScript haberleşmesini sağlayan TApplicationWrapper sınıfını ve ona eklenen metodları; örneğimiz için gereken HTML dosyanın yapısını ve JavaScript sınıfımızın şablonunun Delphi içine gömülü halini gözlemleyebilirsiniz. Eğer siz bir Google Maps API Key’i aldı iseniz bu anahtar değerini ScriptGoogle isimli sabitimizin key parametresine ekleyebilirsiniz. Ancak bizim örneğimizde gördüğünüz gibi boş ve çalışmaya mâni bir durum söz konusu değil. Tüm bu tanımlardan sonra, artık ekranımıza bir harita getirmenin zamanı geldi sanırım :)

procedure TfrmGoogleMap.btnLoadMapClick(Sender: TObject);
var
  sHTML,
  sScript : String;
begin
  sHTML := HTML;
  sScript :=  ScriptStartSection + Enter +
                   JSGoogle + Enter +
                 ScriptEndSection;

  sHTML := StringReplace(sHTML, '%HEADSECTION%'   , ''          , [rfReplaceAll]);
  sHTML := StringReplace(sHTML, '%SCRIPTSECTION%' , sScript , [rfReplaceAll]);
  sHTML := StringReplace(sHTML, '%BODYSECTION%'   , ''         , [rfReplaceAll]);

  LoadHTML(wBrowser, sHTML);

  while wBrowser.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages;
end;

Bu örneğimiz TWebBrowser nesnemizde boş bir haritanın oluşturulmasını sağlar. Şimdi Istanbul’daki Topkapı Sarayı‘nı arayalım ve haritamızda gösterelim:

procedure TfrmGoogleMap.btnFindTopkapiClick(Sender: TObject);
var
  Doc : IHTMLDocument2;
  Win : IHTMLWindow2;
begin
  Doc := wBrowser.Document as IHTMLDocument2;
  Win := Doc.parentWindow;

  Win.execScript('GoogleMap.FindGeoCode("Topkapı Sarayı, istanbul");', 'JavaScript');
end;

Karşımıza aşağıdaki gibi bir görüntü çıkmış olmalı:

topkapi_sarayi_google_maps

Bir sonraki adımımız haritaya bir işaretçi koymak olacak;

procedure TfrmGoogleMap.btnAddMarkerClick(Sender: TObject);
var
  Doc : IHTMLDocument2;
  Win : IHTMLWindow2;

  sLat,
  sLng : String;
begin
  Doc := wBrowser.Document as IHTMLDocument2;
  Win := Doc.parentWindow;

  sLat := FloatToStr(MarkerLat); // TApplicationWrapper.DoGeoCodeFound'da atama yapılmıştı.
  sLng := FloatToStr(MarkerLng);// TApplicationWrapper.DoGeoCodeFound'da atama yapılmıştı.

  sLat := StringReplace(sLat, ',', '.', [rfReplaceAll]);
  sLng := StringReplace(sLng, ',', '.', [rfReplaceAll]);

  Win.execScript('GoogleMap.AddMarker(' + sLat + ',' + sLng + ', true);', 'JavaScript');
end;

TGoogleMap sınıfımızın FindGeoCode çağrısı, Delphi’de TApplicationWrapper.DoGeoCodeFound çağrısının yapılmasına neden olur. Bulunan coğrafik koordinat bilgileri geçici iki değişkende saklanır ve marker eklemek için kullanılır. Son çağrımız ise , belirtilen koordinata gitmek ile ilgili olacaktır. Buyrun kodumuza bakalım:

procedure TfrmGoogleMap.btnGotoCoordinatClick(Sender: TObject);
var
  Doc : IHTMLDocument2;
  Win : IHTMLWindow2;

  sLat,
  sLng : String;
begin
  Doc := wBrowser.Document as IHTMLDocument2;
  Win := Doc.parentWindow;

  sLat := edtLat.Text;
  sLng := edtLng.Text;

  sLat := StringReplace(sLat, ',', '.', [rfReplaceAll]);
  sLng := StringReplace(sLng, ',', '.', [rfReplaceAll]);

  Win.execScript('GoogleMap.GotoCoordinat(' + sLat + ',' + sLng + ');', 'JavaScript');
  Win.execScript('GoogleMap.AddMarker(' + sLat + ',' + sLng + ', true);', 'JavaScript');
end;

Bu örneğimiz ise belirttiğimiz enlem ve boylam noktalarına haritayı konumlandıracak ve o noktaya bir adet işaretçi(marker) bırakacaktır. Örneğimizde harita üzerinde yada marker’lar üzerinde yapacağınız tıklamalar, Delphi’ye iletilecek ve TApplicationWrapper sınıfının DoClick ve DoMarkerClick metodlarının tetiklenmesine neden olacaktır.

Gördüğünüz gibi, bir önceki makelemizde değindiğimiz Delphi ve JavaScript kardeşliğinin pek çok faydası var. Verdiğimiz bu örnek şu aşamada pek bir anlam ifade etmese de, siz uygulamalarınızda eminimki bu fonksiyonaliteyi anlamlandırabileceksiniz. Belki veritabınında kayıtlı olan müşterilerinizin adres bilgilerini harita üzerinde gösterecek yada sadece merakınızı tatmin etmek için kullanacaksınız. Ancak bir gerçek var ki, bu verilen bilgiler ışığında daha fazlasını yapabilmek için yola çıkacaksınız ;) Daha önce de dediğim gibi, Google Maps API bir derya, ben sizler için deryadan bir damla aldım, sizlere sundum.

Gerisi sizlerin keşfini bekliyor.

Saygılar, sevgiler..

“Delphi ve Google Maps API” için 40 Yorum

  1. sadettinpolat diyor ki:

    tugrul hocam, sapkam olsaydi cikartcaktim :)
    cok guzel , egitici ve ogretici bir yazi olmus. tesekkur ediyoruz. gavurun felix colibri si varsa bizim de tugrul hocamiz var :)

  2. Tuğrul HELVACI diyor ki:

    Üstadım havalar sıcak, şapkayı çıkartma güneş geçmesin başına :) Ayrıca pek de şapka çıkartılacak bir husus değil yazdıklarım, ama yine de iltifatlarına teşekkür ediyorum.

  3. Sinem diyor ki:

    Tuğrul bey, mousewheel event ini yakalayabiliyor musunuz delphi içerisinden? Explorer dan açtığım html dosyasında mouse tekerleği çalışıyor, ancak aynısını delphi de twebbrowser a yüklüyorum, tepki vermiyor, wm_mousewheel eventi de tetiklenmiyor, cevap yazabilirseniz sevinirim.

  4. zafer diyor ki:

    Tuğrul hocam merhaba.

    Anlatımız çok güzel. fakat Google Maps API Key gerekmez demişsiniz bana bu web sitesi farklı bir Google Maps API anahtarı gerekiyor diye mesaj çıkıyor. acaba google bu key gereksinimini zorunlu halemi getirdi. bu arada key girsemde yine aynı mesajı veriyor.

    çalışmalarınızda başarılar dilerim

    • Tuğrul HELVACI diyor ki:

      Merhaba Zafer bey, ben yaptığım testler üzerine API Key’e ihtiyaç olmaz demiştim ve nitekim örneğimi yaptığım zaman diliminde API Key olmadan çalıştırabildim örneğimi. Ancak şu anda durum nedir bir bilgim yok. Yazdığınız kodda bir sorun yok ise, varsayımınız doğru olabilir.

  5. yasar diyor ki:

    mrb. paylaşımın için teşekkür ediyorum.fakat ben bir türlü çalıştıramadım. delphi de hazırlanmmış halde varmı acaba .nerede hata yaptığımıda öğrenmiş olurum. iyi günler

  6. Tuğrul HELVACI diyor ki:

    Yaşar bey, sorun konusunda daha spesifik olabilirseniz sanırım yorum yapabilirim. Ancak şu durumda hangi ortamda ve neden çalıştıramadığınızı anlayamıyorum mesajınızdan.

  7. mustafa diyor ki:

    Tuğrul bey çalışmalarınız için teşekkürler.SİZE BU KONUYLA DOLAYLI OLARAK ALAKALI BİR SORU SORMAK İSTİYORUM BİLGİLENDİRİRSENİZ SEVİNİRİM ŞİMDİDEN TEŞEKKÜRLER.SORUM ŞU:BEN HARİTAYI FORM ÜZERİNDE İMAGE İÇERİSİNDE RESİM OLARAK YÜKLEYİP SOKAK İSİMLERİNE LABEL EKLEDİM HARİTAMIN ENİ VE BOYU 7000*7000 EBADINDA ŞİMDİ COMBOBOXTA İSTEDİĞİM SOKAĞI SEÇTİĞİMDE O SOKAĞA AİT LABELİN POZİSYONUNA FORMUN SCROLLARININ OTOMATİK KAYARAK EKRANIN ORTA YERİNE GELMESİNİ İSTİYORUM BUNU COMBOBOXLARIN İTEMLERİNE YAZDIĞIM ZAMAN HEMEN HEMEN 1000 SOKAK İSMİNE 1000 İTEMS VE 10 BİN SATIRLIK KOD GEREKİYOR BU HEM PROJEYİ ŞİŞİRİYOR VE YAZIMI GÜNLERİ BULUYOR BUNU EN KISA NASIL GERÇEKLEŞTİREBİLİRİM.SAYGILARIMLA

  8. secilus diyor ki:

    cok guzel cok ogretici bi paylasim olmus ellerinize emeginize saglik:)

  9. Işıl Çiçekdal diyor ki:

    Tuğrul Bey iyi günler;

    Bu konuyla alakası yok ama nereye yazacağımı bilmediğim için rastgele yazmak istedim…
    Paylaşımlarınızı websitenizden izliyorum teşekkür ediyorum. Size bir sorum olacak, mysql de yüklü bir datam var, bunları Delphi’de DBGrid içerisine 1 saniye de 1 tane daha basmasını istiyorum. Form üzerine bir Timer ekledim ve bağlantı için gerekli componentlerle bağlantıyı sağladım…Timer event’ine şu kodu yazdım

    a := (Random(65595));
    MyTable1.SQL.Text := ‘Insert Into test(id1) Values(‘+IntToStr(a) +’)';

    kodu derlediğim zaman bir hata vermiyor çalıştırıyorum Grid içerisine herhangi bir veri aktarmıyor, hiçbir işlem yok. Kodumda hata yok, eminim başka şeylerde yapmam lazım ama ne yapacağım hakkında bilgim yok, bir ipucu verirseniz sevinirim. Teşekkür ederim…

    • Tuğrul HELVACI diyor ki:

      Merhabalar, timer içine koyduğunuz kodda test isimli tabloya bir kayıt insert ediyorsunuz ama o Sql cümlesini Execute ediyor musunuz ;) Ben onu göremedim. Ayrıca Ins. işleminden hemen sonra grid üzerinde verileri gösterdiğiniz veri kaynağı(tablo) hangisi ise o tablonun refresh edilmesi icap eder.(Kapatıp/açabilirsiniz). Sanırım sorununuz sql’inizi execute etmemek ile ilgili.

  10. Işıl Çiçekdal diyor ki:

    Hocam ben çok yeni Mysql kullanıcısıyım, execute etmek demekle tam anlamadım ama kodu şu şekilde yeniledim..(tüm kodlamayı yazıyorum)

    a :Integer;
    begin
    a := Random(65595);
    if Timer1.Interval = 5000 then
    Timer1.Interval := 0000;
    if Timer1.Interval = 0000 then
    begin
    MyTable1.SQL.Text := ‘INSERT INTO test VALUES (‘ +IntToStr(a)+ ‘)’;
    MyTable1.Execute; // Bunlarımı kasdettiniz?
    MyTable1.Refresh; // ?
    end;
    Timer1.Interval := 5000;
    end;

    daha acemice anlatırsanız memnun olurum, cevabınız için teşekkürler…

  11. Işıl Çiçekdal diyor ki:

    hatamı buldum, teşekkür ederim :)

  12. Işıl Çiçekdal diyor ki:

    ama yinede execute etmek derken tam olarak ne demek istediniz bilmek isterim, benim bildiğim execute programı run etmek yani bir .exe sini yaratmak…

    • Tuğrul HELVACI diyor ki:

      Geç yanıtımdan ötürü kusuruma bakmayın, siz kod örneğinizde Execute’u keşfetmişsiniz zaten ;)

  13. Hasan Danışık diyor ki:

    Hocam merhabalar ve ellrine sağlık. Bende Google Map üzerinde çalışıyorum fakat web tarafım iyi olmadığı için fazla birşeyler yapamadım. Yazmış olduğunuz uygulamayı denedim fakat bir sorunum var harita ekrana yansımıyor. Sanırım TObjectWrapper sınıfı ile ilgili bir sorun var. Bu sınıf hangi unit içerisindedir ? Ben bulamadım ve kendim TObject sınıfından türettim. Sorun bununla ilgili olabilirmi ?

    Ayrıca webbrowser üzerinde mouse hareket ettirdikçe mouse ın bulunduğu noktaların koordinatını anında nasıl alabilirim. Google Earth te olduğu gibi mouse gezdirdikçe alt kısımda enlem ve boylam sürekli değişiyor. Yapmak istediğim mouse ın sağ butonu ile harita üzerine bir dikdörtgen çizmek ve o alanın sol üst köşesindeki koordinatı ile sağ alt köşesindeki koordinatı almak.

    Yardımlarınız için şimdiden teşekkürler.

    • Tuğrul HELVACI diyor ki:

      Merhabalar, teşekkür ederim. Sanırım aradığınız cevaplar “Delphi & JavaScript Kardeşliği” başlığı altındaki makalede ve makalenin dibindeki indirilebilir dosyanın içindedir ;)

  14. s_r diyor ki:

    Merhaba Tuğrul Hocam paylaşımınız için çok teşekkürler..

    size sorum webbrowserda yalnızca harita kısmını göstermek istiyorum yol tarifleri ve edit kısımları görünsün istemiyorum bu işlemi nasıl gerçekleştirebilirim?

  15. ahmet diyor ki:

    Merhaba

    Kodlarda bir sorun mu var? yoksa ggogle bu hizmeti durdurdu mu?
    Sadece boş bir google map geliyor.

    • Tuğrul HELVACI diyor ki:

      Merhaba, makaleyi yazdığım zaman kodlarda bir sorun yoktu. Belki Google Maps’de bir şeyler değişmiştir, yahut gözden kaçırdığınız bir şeyler vardır.

  16. Luis Roldan diyor ki:

    Hola:
    Te escribo desde Argentina, encontre tu sitio por accidente, buscando informacion sobre el tema…hay posibilidades de tener una copia del project completo. Me parecio fantastico tu trabajo.
    Yo estoy intentando hacer que mi aplicacion genere un mapa con la ubicacion de los clientes de un comercio y creo que lo tuyo hace algo de eso.
    Pero por cuestion del idioma no te entiendo mucho.
    Gracias

    Merhaba
    Ben Arjantin’den yazmayı, ben tabi … tam projenin bir kopyası olması muhtemeldir konusunda bilgi edinmeye kazara sitenizi buldum. Ben fantastik senin iş olduğunu düşündüm.
    Ben uygulama iş müşterilerinin yerini bir harita oluşturur ve ben senin bu konuda bir şeyler yapar düşünmeleri için çalışıyorum.
    Ama dil sorunları çok anlamıyorum.
    Teşekkürler

    • Tuğrul HELVACI diyor ki:

      Hi, i think you just translated your text using Google Translate Service. So, i couldn’t understand what do u mean. You can speak English Luis, then may be i can help you.

  17. Luis Roldan diyor ki:

    Thanks …
    I said I want to do a google map, the location of the clients who consult from an Interbase database.
    I saw your example, and parce me I’m missing things. You can have a complete copy of proyject.
    It is necessary that the map is hosted on a website?, I did some tests, gave me java script error. I did it with some examples of Delphi in Spanish Club.
    I look forward to your response

  18. Iskandar Achmad diyor ki:

    Hi!

    This is a very useful information for me. But i could understand the description. Could you please sent me (if possible) the full project source of this article ?

    Thanks,
    Iskandar A

  19. John diyor ki:

    Very good article. I miss some things because i don’t now much Turkish language but your code is fantastic .
    Thank you and long live Delphi!!!

  20. bilgin diyor ki:

    selam hocam ben bişi üzerinde araştırıyorum bu who’s web sitesi var onun gibi nasıl bişi yapabilirim ama ne xml nede başka bi kod bilgim var ufak kodlar biliyorum okadar bana yardımcı olabilirmisiniz

  21. Gökhan diyor ki:

    tebrik ederim çok güzel bir paylaşım olmuş ellerinize sağlık. Sizden ricam bu kod parçacığını delphi -7 üzerinde çalıştırmam gerekiyor bana nasıl yardımcı olabilirsiniz ?

    – GetObjectDispatch methodunda ve daha bir çok methodda hata veriyor.

  22. kodcugenc diyor ki:

    – GetObjectDispatch gibi fonksiyonlarda bende hata alıyorum bunun sebebi delphi 7 kullanıyor olmamdan kaynaklanıyor olabilir mi yada bir kütüphane mi kullandınız?

    • Tuğrul HELVACI diyor ki:

      Bu sorunuzun yanıtını yorumlarda vermiştim, sanıyorum gözünüzden kaçmış olacak. Delphi & JavaScript kardeşliği isimli makaleyi inceleyebilirsiniz.

  23. Selim Ataç diyor ki:

    Çalışmayı Mail Adresime Yollarmısınız..
    Kolay gelsin

  24. Tuğrul HELVACI diyor ki:

    Zaten bir indirme bağlantısı var Selim bey, oradan temin edebilirsiniz. Bir kaç yorum yukarıda..

  25. ersin diyor ki:

    Tugrul bey oncelikle merhaba uzu uzun arastırmalarımın sonunda bana sadece sizin yardım edebılecegınız kanısına vardım benım sorunum şirketime ait web sitesi uzrinden şirket arabaları ile yapmış oldugumuz gitmiş oldugumuz yerleri google mapstan gorebılıyorduk fakat artık goremıyorum su sekılde bir hata veriyor Bu web sitesi farklı bir Google Maps API anahtarı gerektiriyor. http://code.google.com/apis/maps/signup.html adresinde yeni bir anahtar oluşturulabilir. şeklinde uyarı gelıyor tamam dedikten sonra yine eskiden harita açılan yer sadece gri renkte duruyor bu problemı nasıl halledeblırız tesekkurler iyi çalışmalar.

  26. Abdullah ÇATAKLI diyor ki:

    Tuğrul Hocam Merhabalar..
    Üsttede GetObjectDispatch bu hata konusunu Delphi & JavaScript kardeşliği isimli makalede olduğunu yazmışsınız. evet orada bahsi geçiyor ama ben delphi7 projeme bunu uygulayamadım ve hatayı gideremedim. Rica etsem bu konuda yardımcı olabilirmisiniz.

    Teşekkürler
    abdullahcatakli@gmail.com

    • Tuğrul HELVACI diyor ki:

      Pek çok arkadaşımız Delphi 7 kullandığı için Delphi 7′de çalışan projeyi de paylaşayım istedim.
      Buradan indirebilirsiniz.

  27. güzel bir iş çıkartmışsınız hocam. ancak google artık engel oluyor. google da değişti çook değişti :)

Yorum Yazın