Delphi ve Google Maps API | Delphi Programming
Transkript
Delphi ve Google Maps API | Delphi Programming
Contact Me | Subscribe D e l p h i P r o g r a m m i n g Search Keywords There are only 10 types of people in the world: Those who understand binary, and those who don’t. Home TObject.Create Delphi Hakkında Ziyaretçi Defteri Posted by Tuğrul HELVACI - Haziran 6, 2009 Comments 21 Delphi ve Google Maps API 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 Plugin WP FlashTime by horoscop 2009.org requires Flash Player 8 or better currency converter calculator.Plugin creat de horoscop | horoscop saptamanal | horoscop zilic | horoscop | play sonic games Etiketler Absolute Abstract Classes ActionScript Algoritma API Bug Byte Arrays Class Reference CloseHandle COM CreateDesktop CreateEvent CreateMutex CreateProcess CreateRemoteThread CreateSemaphore CreateToolHelp32SnapShot CreateWaitableTimer DeleteCriticalSection delphi 2010 DTS EnterCriticalSection EnumDesktopProc EnumDesktops Flash Function PDFmyURL.com 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. EnumDesktopProc EnumDesktops Flash Function Pointer GetCurrentProcess GetIconInfo GetKeyState GetLastInputInfo GetProcessMemoryInfo GetStartupInfo GetThreadContext GetTickCount GetTickCount64 Hacking Inheritance InitializeCriticalSection Interface InterlockedCompareExchange InterlockedDecrement InterlockedExchange InterlockedExchangeAdd InterlockedIncrement JavaScript LeaveCriticalSection Method Pointer Module32First Module32Next MSSQL OpenDesktop OpenEvent OpenMutex OpenSemaphore OpenWaitableTimer Operator Overloading Persistance Pointer Procedure Pointer Process Process32First Process32Next Query QueryInterface QueryPerformanceCounter Queue ReleaseMutex ReleaseSemaphore Reqursion ResetEvent ResumeThread RTTI SetEvent SetProcessWorkingSetSize SetThreadContext SetWaitableTimer Smilarity SORT SQL SQL Server Stream SuspendThread Sw itchDesktop TDateTime TerminateProcess TerminateThread Thread TInterfacedObject TValue Untyped Parameters VirtualAllocEx VirtualFreeEx WaitForSingleObject WaitForMultipleObjects Weaver WriteProcessMemory _AddRef _Release WP Cumulus Flash tag cloud by Roy Tanck requires Flash Player 9 or better. Şimdi esas işi yapacak olan JavaScript sınıfımıza bir göz gezdirelim: 001. 002. 003. 004. 005. 006. 007. 008. 009. 010. function TGoogleMap() { var map = null; var smallMapControl = null; var smallZoomControl= null; this.CreateMap = CreateMap; this.Render = Render; this.FindGeoCode = FindGeoCode; this.AddMarker = AddMarker; Son Yorumlar Yeni Veri Tipleri ve Operator Overloading için Tuğrul HELVACI Yeni Veri Tipleri ve Operator Overloading için Zafer Çelenk Delphi ve Google Maps API için Tuğrul HELVACI Delphi ve Google Maps API için ahmet Ziyaretçi Defteri için Tuğrul HELVACI PDFmyURL.com 010. 011. 012. 013. 014. 015. 016. 017. 018. 019. 020. 021. 022. 023. this.AddMarker = AddMarker; this.OpenInfoWindow = OpenInfoWindow; this.CloseInfoWindow = CloseInfoWindow; this.AddSmallMapControl = AddSmallMapControl; this.AddSmallZoomControl = AddSmallZoomControl; this.RemoveSmallMapControl = RemoveSmallMapControl; this.RemoveSmallZoomControl = RemoveSmallZoomControl; this.GotoCoordinat = GotoCoordinat; 024. 025. 026. 027. 028. 029. 030. 031. 032. 033. 034. 035. 036. 037. } 038. 039. 040. 041. 042. 043. 044. 045. 046. 047. 048. 049. 050. 051. 052. 053. 054. 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 Son Yazılar Yeni Veri Tipleri ve Operator Overloading Interface Nedir, Nerelerde ve Neden Kullanırız ? Derinlemesine Threading..(3) SQL’de Benzerlik Algoritmaları… Full Text Searching… Kategoriler Genel (4) IDE (1) İşletim Sistemi (7) Programlama (43) .Net (3) C# (2) Delphi (43) Grafik (2) Internet (4) Veritabanı (3) Win32 (6) Takvim Temmuz 2010 Pts Sal Çar Per Cum Cts Paz 1 2 3 4 PDFmyURL.com 054. 055. 056. else { 057. 058. 059. 060. 061. 062. 063. 064. } 065. 066. 067. 068. 069. 070. 071. 072. 073. 074. 075. 076. 077. 078. 079. 080. 081. 082. 083. 084. 085. 086. 087. 088. 089. 090. 091. 092. 093. 094. 095. 096. 097. 098. 099. 100. 101. } 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) { 5 12 19 26 6 13 20 27 7 14 21 28 8 15 22 29 9 16 23 30 10 11 17 18 24 25 31 « Haz Arşivler Haziran 2010 (1) Mayıs 2010 (1) Nisan 2010 (3) Ağustos 2009 (1) Temmuz 2009 (2) Haziran 2009 (7) Mayıs 2009 (32) Bağlantılar Bir Türkçe Sevdalısı.. Delphi Türkiye Forum Gürcan ÖZTÜRK M.Fatih KÜÇÜKKELEPÇE Memik YANIK Kişisel Memik YANIK’ın Günlüğü Nick Hodges Sinan BARAN Zafer Çelenk Ziyaretçi Bilgileri PDFmyURL.com 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. } } 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. Ziyaretçi Bilgileri Ziyaret: 5 / 12073 Beğenilenler Delphi 2010 (Weaver) ve TValue - 14 votes Derinlemesine Threading..(3) - 13 votes Derinlemesine Threading..(2) - 6 votes Derinlemesine Threading..(1) - 6 votes Yeni Veri Tipleri ve Operator Overloading - 4 votes Win32 & .Net(Delphi->C#) - 4 votes Delphi ve Google Maps API - 3 votes TThread.WaitFor Bug.. - 3 votes BITS(Background Intelligent Transfer Service) ile sessiz sedasız download ;) - 3 votes Bir Kiosk ve CreateDesktop macerası.. - 3 votes Meta Giriş Yazılar RSS Yorumlar RSS WordPress.org 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. Etiketler-Liste PDFmyURL.com 001. 002. 003. 004. 005. 006. 007. 008. 009. 010. 011. 012. 013. 014. 015. 016. 017. 018. 019. 020. 021. 022. 023. 024. 025. 026. 027. 028. 029. 030. 031. 032. 033. 034. 035. 036. 037. 038. 039. 040. //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 Absolute API Byte Arrays Class Reference COM CreateDesktop CreateProcess CreateRemoteThread CreateToolHelp32SnapShot Function DTS EnumDesktopProc EnumDesktops Pointer GetCurrentProcess GetIconInfo GetKeyState GetLastInputInfo GetProcessMemoryInfo GetStartupInfo Hacking Inheritance Interface JavaScript Method Pointer Module32First Module32Next OpenDesktop Persistance Pointer Procedure Pointer Process Process32First Process32Next RTTI SetProcessWorkingSetSize SQL Server Sw itchDesktop TerminateProcess Reqursion Thread Untyped Parameters VirtualAllocEx WaitForSingleObject VirtualFreeEx WriteProcessMemory {$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/xhtml1strict.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>'; Delphi About Auto Select All The Text For TCustomEdit On Mouse Click 29 Haziran 2010 Memory Leak Notification in Delphi - Report Memory Leak on Program Exit 27 Haziran 2010 PCRE Workbench - Regular Expression Test Tool - Source Code Delphi Application 22 Haziran 2010 Deleting Dataset Records In a Loop - Poll Results - Why All Records Are Not Deleted 21 Haziran 2010 Force TListView's Edit Mode using a Keyboard Shortcut 17 Haziran 2010 Implementing On Item Click / Double Click for Delphi's TListView control 16 Haziran 2010 Run Your Delphi Application in Full Screen Implement "F11 - Full Screen" 14 Haziran 2010 Displaying Enumerated Properties in a PDFmyURL.com 041. 042. 043. 044. 045. 046. 047. 048. 049. 050. 051. 052. 053. 054. 055. 056. 057. 058. 059. 060. 061. 062. 063. 064. 065. 066. 067. 068. 069. 070. 071. 072. 073. 074. 075. 076. 077. 078. 079. 080. 081. 082. 083. 084. 085. 086. ScriptStartSection= '<script type="text/javascript">'; ScriptEndSection = '</script>'; MetaSection = '<meta http-equiv="content-type" content="text/html; charset=utf-8"/>'; HTML = HtmlFirstSection HtmlStartSection HeadStartSection MetaSection ScriptGoogle '%HEADSECTION%' '%SCRIPTSECTION%' HeadEndSection BodyStartSection BodyGoogle '%BODYSECTION%' BodyEndSection HtmlEndSection; + + + + + + + + + + + + Enter Enter Enter Enter Enter Enter Enter Enter Enter Enter Enter Enter + + + + + + + + + + + + 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 Displaying Enumerated Properties in a Selectable List - Run-Time Enum Selection in Delphi 10 Haziran 2010 How Do You Delete Dataset Records In a Loop? 08 Haziran 2010 Display Custom Hints for Status Bar Panels 07 Haziran 2010 Sık Ziyaret Edilenler Sayfa: Home (16059) Delphi ve Google Maps API (4132) Delphi ve Google Maps API (1976) Nedir bu Thread’lerden çektiğimiz..! (1444) Delphi & Animated Flash Charts(Fusion Charts) (1179) Delphi & JavaScript Kardeşliği (933) Delphi 2010 (Weaver) ve TValue (918) Derinlemesine Threading..(1) (886) Derinlemesine Threading..(2) (695) Win32 & .Net(Delphi->C#) (617) Kategori: Delphi (613) Bir Kiosk ve CreateDesktop macerası.. (568) Sayfa: Hakkında (563) PDFmyURL.com 086. 087. 088. 089. 090. 091. 092. 093. 094. 095. 096. 097. 098. 099. 100. const JSGoogle = ' function TGoogleMap() ' + Enter + ' { ' + Enter + ' var map = null; ' + Enter + ' var smallMapControl = null; ' + Enter + ' var smallZoomControl= null; ' + Enter + ' ' ' ' ' ' ' 101. ' 102. ' 103. ' 104. 105. 106. 107. 108. ' 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. ' ' ' 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 + TThread.WaitFor Bug.. (540) Delphi 2010 (Weaver) ve TValue (530) Oylama.. Sitedeki makaleleri yararlı buluyor musunuz ? Evet, yararlı ama yetersiz. Evet, son derece yararlı. Evet, mükemmel. Hayır, yararlı değil. Hayır, hem yararlı değil, hem de yetersiz. Hayır, rezalet. ' ' ' ' function Render(lat, lng) ' + Enter + { ' + Enter + map.setCenter(new GLatLng(lat, lng), 15); ' + Enter + ' } ' + Enter + ' ' ' 121. 122. ' ' 123. 124. ' ' + function FindGeoCode(address) ' + Enter + { ' + Enter + var geoCoder = new GClientGeocoder(); ' + Enter Enter + geoCoder.getLatLng(address, ' + Enter + function(point) ' + { ' + Enter + if (!point) { Vote View Results Delphi'nin hangi sürümünü kullanıyorsunuz ? Delphi 5 yada öncesi Delphi 6 Delphi 7 Delphi 8 Delphi 2005 Delphi 2006 Delphi 2007 PDFmyURL.com 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 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 + 140. 141. 142. 143. ' ' ' ' 144. 145. 146. 147. ' 148. 149. 150. ' ' ' 151. 152. 153. ' ' ' {' + Delphi 2009 Delphi 2010 Vote View Results 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 154. 155. ' ' { ' + Enter + map.openInfoWindow(new GLatLng(lat, lng), ' + Enter + 156. ' 157. 158. 159. 160. 161. 162. 163. ' document.createTextNode(message)); ' + Enter + } ' + Enter + ' ' ' ' function CloseInfoWindow() ' + Enter + { ' + Enter + map.closeInfoWindow(); ' + Enter + } ' + Enter + PDFmyURL.com 164. 165. 166. 167. 168. ' ' ' ' ' 169. 170. 171. 172. 173. 174. 175. 176. 177. ' ' ' ' ' 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 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 } PDFmyURL.com 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 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; PDFmyURL.com 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 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 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: 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 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ı: PDFmyURL.com Bir sonraki adımımız haritaya bir işaretçi koymak olacak; 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 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 PDFmyURL.com ise , belirtilen koordinata gitmek ile ilgili olacaktır. Buyrun kodumuza bakalım: 01. 02. 03. 04. 05. 06. 07. 08. 09. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 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.. [Translate] PDFmyURL.com 21 Comments sadettinpolat on Haziran 8th, 2009 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 Tuğrul HELVACI Üstadım havalar sıcak, şapkayı çıkartma güneş geçmesin başına on Haziran 8th, 2009 Ayrıca pek de şapka çıkartılacak bir husus değil yazdıklarım, ama yine de iltifatlarına teşekkür ediyorum. Sinem on Eylül 17th, 2009 zafer 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. Tuğrul hocam merhaba. on Ekim 4th, 2009 Anlatımız çok güzel. fakat Google M aps API Key gerekmez demişsiniz bana bu web sitesi farklı bir Google M aps 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 PDFmyURL.com Tuğrul HELVACI on Ekim 5th, 2009 yasar on Ekim 18th, 2009 Tuğrul HELVACI on Ekim 19th, 2009 mustafa on Aralık 8th, 2009 M erhaba 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. 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 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. Tuğrul bey çalışmalarınız için teşekkürler.SİZE BU KONUYLA DOLAYLI OLARAK ALAKALI BİR SORU SORM AK İSTİYORUM BİLGİLENDİRİRSENİZ SEVİNİRİM ŞİM DİDEN TEŞEKKÜRLER.SORUM ŞU:BEN HARİTAYI FORM ÜZERİNDE İM AGE İÇERİSİNDE RESİM OLARAK YÜKLEYİP SOKAK İSİM LERİNE LABEL EKLEDİM HARİTAM IN ENİ VE BOYU 7000*7000 EBADINDA ŞİM Dİ COM BOBOXTA İSTEDİĞİM SOKAĞI SEÇTİĞİM DE O SOKAĞA AİT LABELİN POZİSYONUNA FORM UN SCROLLARININ OTOM ATİK KAYARAK EKRANIN ORTA YERİNE GELM ESİNİ İSTİYORUM BUNU COM BOBOXLARIN İTEM LERİNE YAZDIĞIM ZAM AN HEM EN HEM EN 1000 SOKAK İSM İNE 1000 İTEM S VE 10 BİN SATIRLIK KOD GEREKİYOR BU HEM PROJEYİ ŞİŞİRİYOR VE YAZIM I GÜNLERİ BULUYOR BUNU EN KISA NASIL GERÇEKLEŞTİREBİLİRİM .SAYGILARIM LA PDFmyURL.com secilus cok guzel cok ogretici bi paylasim olmus ellerinize emeginize saglik:) on Aralık 9th, 2009 Tuğrul HELVACI on Aralık 9th, 2009 Neden Google M aps kullanmayı denemiyorsunuz Işıl Çiçekdal Tuğrul Bey iyi günler; on Oc ak 8th, 2010 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)); M yTable1.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 on Oc ak 8th, 2010 M erhabalar, 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 PDFmyURL.com ise o tablonun refresh edilmesi icap eder.(Kapatıp/açabilirsiniz). Sanırım sorununuz sql’inizi execute etmemek ile ilgili. Işıl Çiçekdal on Oc ak 11th, 2010 Hocam ben çok yeni M ysql 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 M yTable1.SQL.Text := ‘INSERT INTO test VALUES (‘ +IntToStr(a)+ ‘)’; M yTable1.Execute; // Bunlarımı kasdettiniz? M yTable1.Refresh; // ? end; Timer1.Interval := 5000; end; daha acemice anlatırsanız memnun olurum, cevabınız için teşekkürler … Işıl Çiçekdal on Oc ak 16th, 2010 Işıl Çiçekdal on Oc ak 16th, 2010 hatamı buldum, teşekkür ederim ama yinede execute etmek derken tam olarak ne demek istediniz bilmek isterim, benim bildiğim execute programı run etmek yani bir .exe sini yaratmak… PDFmyURL.com Tuğrul HELVACI Geç yanıtımdan ötürü kusuruma bakmayın, siz kod örneğinizde on Oc ak 18th, 2010 Execute’u keşfetmişsiniz zaten Hasan Danışık on Şubat 19th, 2010 Hocam merhabalar ve ellrine sağlık. Bende Google M ap ü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 on Şubat 22nd, 2010 M erhabalar, 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 s_r M erhaba Tuğrul Hocam paylaşımınız için çok teşekkürler.. on Mart 23rd, 2010 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? PDFmyURL.com ahmet M erhaba on Haziran 21st, 2010 Kodlarda bir sorun mu var? yoksa ggogle bu hizmeti durdurdu mu? Sadece boş bir google map geliyor. Tuğrul HELVACI on Haziran 22nd, 2010 M erhaba, makaleyi yazdığım zaman kodlarda bir sorun yoktu. Belki Google M aps’de bir şeyler değişmiştir, yahut gözden kaçırdığınız bir şeyler vardır. Share your comment Name (required) Mail (required) Website PDFmyURL.com Son Yorumlar Yeni Eklenenler Linkler Yorumunuza teşekkürler. Aslında operatör aşırı yüklemenin sınıflarda pek bir avantaj... by Tuğrul HELVACI Yeni Veri Tipleri ve Operator Overloading Bir Türkçe Sevdalısı.. - Taha EKREM Interface Nedir, Nerelerde ve Neden Kullanırız ? Delphi Türkiye Forum Merhaba, Ben ilk olarak merakımdan dolayı uğraştığım C++ dilinde görmüştüm Operatör... by Zafer Çelenk Derinlemesine Threading..(3) Gürcan ÖZTÜRK - Gürcan ÖZTÜRK SQL’de Benzerlik Algoritmaları… M.Fatih KÜÇÜKKELEPÇE Full Text Searching… Memik YANIK Kişisel Delphi 2010 (Weaver) ve TValue Memik YANIK’ın Günlüğü Derinlemesine Threading..(2) Nick Hodges Merhaba, makaleyi yazdığım zaman kodlarda bir sorun yoktu. Belki Google Maps'de bir şeyler... by Tuğrul HELVACI Merhaba Kodlarda bir sorun mu var? yoksa ggogle bu hizmeti durdurdu mu? Sadece boş bir... by ahmet Programcı arkadaşların daha fazla takıldığı bir yerde yazsa idiniz mesajınızı daha... by Tuğrul HELVACI Sinan BARAN Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenle hata ediyorsam özür dilerm bir iş ilanı... by geyikben Teşekkürler ;) by Tuğrul HELVACI Copyright © 2009 Delphi Programming Pow ered by WordPress | Increase Traffic w ith TrafficWhirl. PDFmyURL.com