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

Benzer belgeler

Class of …… | Delphi Programming

Class of …… | Delphi Programming EnumDesktopProc EnumDesktops Flash

Detaylı