delphi & javascript kardeşliği | delphi programming · 2010. 7. 1. · delphi programming...

15
Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those who don’t. Search Keywords Home TObject.Create Hakkında Ziyaretçi Defteri Delphi Posted by Tuğrul HELVACI - Haziran 1, 2009 Comments 2 Delphi & JavaScript Kardeşliği Son zamanlarda bir raporlama aracının Delphi’ye adaptasyonu ile uğraşıyorum. Bu aracın adı Fusion Charts. Son derece şık ve yetenekli bir araç. Arka planında Flash animasyonları kullanan, kendisine veriyi XML üzerinden alabilen , HTML & JavaScript kullanarak flash nesnelerinin erişimine müsaade eden bir raporlama aracı. Bu hali ile Fusion Charts aracı; Delphi üzerinde TWebBrowser nesnesi vasıtası ile rahatlıkla kullanılabiliyor. Yeterki uygulamanızın çalıştığı klasörde ihtiyaç duyduğu dosyalar olsun. Benim ileride yazacağım Fusion Charts & Delphi entegrasyonunda XML, HTML ve JavaScript dosyalarına gerek olmayacak. Ama bu raporlama aracı üzerinde çalışırken, JavaScript’e amiyane tabir ile biraz bulaşmak durumunda kaldım. Meraklı bir mizacım olduğu için, Delphi üzerinde TWebBrowser nesnesi vasıtası ile bir JavaScript sınıfını yada metodunu kullanıp kullanamayacağımı araştırdım. Ve gördüm ki, bizim sevgili Delphi’mizin yapamayacağı şey yok Delphi üzerinden TWebBrowser nesnesi vasıtası ile(daha doğru bir ifade ile COM vasıtası ile) JavaScript’e ulaşmak ve JavaScript kodları çalıştırmak mümkün. Öncelikle söylemek isterim ki; JavaScript konusunda pek bilgili 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 Contact Me | Subscribe PDFmyURL.com

Upload: others

Post on 15-Sep-2020

33 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

D e l p h i P r o g r a m m i n gThere are only 10 types of people in the world Those who understand binary and thosewho donrsquot

Search Keywords

HomeTObjectCreate

Hakkında Ziyaretccedili Defteri

Delphi Posted by Tuğrul HELVACI - Haziran 1 2009 Comments 2

Delphi amp JavaScript Kardeşliği

Son zamanlarda bir raporlama aracının Delphirsquoye adaptasyonu ile uğraşıyorum Bu aracın adıFusion Charts Son derece şık ve yetenekli bir araccedil Arka planında Flash animasyonlarıkullanan kendisine veriyi XML uumlzerinden alabilen HTML amp JavaScript kullanarak flashnesnelerinin erişimine muumlsaade eden bir raporlama aracı Bu hali ile Fusion Charts aracıDelphi uumlzerinde TWebBrowser nesnesi vasıtası ile rahatlıkla kullanılabiliyor Yeterkiuygulamanızın ccedilalıştığı klasoumlrde ihtiyaccedil duyduğu dosyalar olsun Benim ileride yazacağımFusion Charts amp Delphi entegrasyonunda XML HTML ve JavaScript dosyalarına gerekolmayacak Ama bu raporlama aracı uumlzerinde ccedilalışırken JavaScriptrsquoe amiyane tabir ile birazbulaşmak durumunda kaldım

Meraklı bir mizacım olduğu iccedilin Delphi uumlzerinde TWebBrowser nesnesi vasıtası ile birJavaScript sınıfını yada metodunu kullanıp kullanamayacağımı araştırdım Ve goumlrduumlm ki bizim

sevgili Delphirsquomizin yapamayacağı şey yok Delphi uumlzerinden TWebBrowser nesnesivasıtası ile(daha doğru bir ifade ile COM vasıtası ile) JavaScriptrsquoe ulaşmak ve JavaScript kodlarıccedilalıştırmak muumlmkuumln Oumlncelikle soumlylemek isterim ki JavaScript konusunda pek bilgili

Plugin WP FlashTime by horoscop 2009orgrequires Flash Player 8 or better currency

converter calculatorPlugin 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 CreateMutexCreateProcess CreateRemoteThread CreateSemaphoreCreateToolHelp32SnapShot CreateWaitableTimerDeleteCriticalSection delphi 2010 DTS EnterCriticalSection

Contact Me | Subscribe

PDFmyURLcom

sayılmam Dolayısı ile yazacağım oumlrnekler sizlere basit gelirse yahut bazı hatalarım olursaşimdiden affınıza sığınırım

Herşeyden evvel TWebBrowser nesnesi kendisine yuumlkleyeceği bir HTML dosya alır Bu dosyadisk uumlzerinde yada internet uumlzerinde bir yerdedir ve TWebBrowserrsquoın Navigate metodunaparametre olarak aktarılır Navigate metodu kendisine verilen HTML dosyayı yada linkingoumlsterdiği verileri parse eder ve TWebBrowser uumlzerinde goumlsterir Buraya kadar herşey normalLacirckin ben yapım gereği disk uumlzerinde bulunan dosyalar ile ccedilalışmayı pek sevmem Budosyaların bozulabilme ihtimalleri yada silinebilme ihtimallerinin olması programınızın doğruccedilalışmasını engelleyeceği iccedilin dosya erişimli youmlntemlerden muumlmkuumln mertebe uzak kalmanızıtavsiye ederim Bu bağlamda yaptığım araştırma sonucu pek ccedilok kaynakta HTML kaynakkodlarının herhangi bir dosyaya ihtiyaccedil duymadan TWebBrowser nesnesinde goumlsterilebildiğinioumlğrendim Bulduğum metod aşağıdaki gibidir

MSDN yardım doumlkuumlmanlarından yada Microsoftrsquoun online MSDN kaynaklarındanTWebBrowser sınıfının oumlzelliklerini inceleyecek olursanız pek ccedilok interfacersquoi implementeettiğini goumlzlemlersiniz Bu interfacersquolerden bir tanesi de IPersistStreamInitlsquodirIPersistStreamInit interfacersquoi TWebBrowser tarafından implemente edildiğine goumlre buinterfacersquoin iccedilinde mevcut bulunan IsDirtyLoadSaveGetSizeMax ve InitNew metodlarının da

EnumDesktopProc EnumDesktops Flash FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoGetThreadContext GetTickCount GetTickCount64Hacking Inheritance InitializeCriticalSectionInterface InterlockedCompareExchangeInterlockedDecrement InterlockedExchangeInterlockedExchangeAdd InterlockedIncrementJavaScript LeaveCriticalSection Method PointerModule32First Module32Next MSSQL OpenDesktopOpenEvent OpenMutex OpenSemaphoreOpenWaitableTimer Operator Overloading PersistancePointer Procedure Pointer ProcessProcess32First Process32Next Query QueryInterfaceQueryPerformanceCounter Queue ReleaseMutexReleaseSemaphore Reqursion ResetEvent ResumeThreadRTTI SetEvent SetProcessWorkingSetSizeSetThreadContext SetWaitableTimer Smilarity SORT SQLSQL Server Stream SuspendThread Sw itchDesktopTDateTime TerminateProcess TerminateThread

Thread TInterfacedObject TValue UntypedParameters VirtualAllocEx VirtualFreeEx

WaitForMultipleObjects WaitForSingleObjectWeaver WriteProcessMemory _AddRef _Release

WP Cumulus Flash tag cloud by Roy Tanckrequires Flash Player 9 or better

Son Yorumlar

Yeni Veri Tipleri ve Operator Overloading iccedilinTuğrul HELVACIYeni Veri Tipleri ve Operator Overloading iccedilinZafer CcedilelenkDelphi ve Google Maps API iccedilin TuğrulHELVACIDelphi ve Google Maps API iccedilin ahmet

01

02030405060708091011121314151617

1819202122232425

procedure LoadHTML(WebBrowser TWebBrowser HTMLCodeString)

varsl TStringListms TMemoryStream

beginWebBrowserNavigate(aboutblank)

if Assigned(WebBrowserDocument) thenbegin

sl = TStringListCreatetry

ms = TMemoryStreamCreatetry

slText = HTMLCodeslSaveToStream(ms)msSeek(0 0)(WebBrowserDocument as

IPersistStreamInit)Load(TStreamAdapterCreate(ms))

finallymsFree

endfinally

slFreeend

endend

PDFmyURLcom

interfacersquoin iccedilinde mevcut bulunan IsDirtyLoadSaveGetSizeMax ve InitNew metodlarının daimplemente edilmiş olması gerekir Bizim ihtiyacımız olan Load metodu kendisine IStreamtuumlruumlnde bir parametre bekler IStream adından da anlaşılabileceği gibi bir interfacersquodirDelphirsquonin Classespas dosyasında tanımlanmış olan TStreamAdapter isimli sınıfı da IStreaminterfacersquoini implemente etmiştir ve asıl amacı Delphi TStream sınıflarının IStream bek leyenyapılarla haberleşmesini sağlamaktır Dolayısı ile IStream parametresi bekleyen Loadmetoduna TStreamAdapter sınıfından bir nesne geccedililebilir

Yukarıdaki kodumuz programımız iccedilerisinde html kodları yazabilmemizi ve bu kodları birTWebBrowser nesnesi uumlzerinde goumlzlemleyebilmemizi sağlamaktadır Şimdi ufak bir testyapalım

Ziyaretccedili Defteri iccedilin Tuğrul HELVACI

Son Yazılar

Yeni Veri Tipleri ve Operator OverloadingInterface Nedir Nerelerde ve Neden Kullanırız Derinlemesine Threading(3)SQLrsquode Benzerlik AlgoritmalarıhellipFull Text Searchinghellip

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 2010Pts Sal Ccedilar Per Cum Cts Paz

01

02030405060708091011121314151617181920212223242526

272829303132333435

wBrowser formumuz uumlzerinde bulunan TWebBrowser nesnesininadıdır

const

Enter = Char(13) + Char(10)HtmlStartSection = lthtmlgtHtmlEndSection = lthtmlgtHeadStartSection = ltheadgtHeadEndSection = ltheadgtBodyStartSection = ltbodygtBodyEndSection = ltbodygtScriptStartSection= ltscript type=textjavascriptgtScriptEndSection = ltscriptgt

HTML = HtmlStartSection + Enter +

HeadStartSection + Enter +HEADSECTION + Enter +

SCRIPTSECTION + Enter +HeadEndSection + Enter +BodyStartSection + Enter +

BODYSECTION + Enter +BodyEndSection + Enter +

HtmlEndSection const

JScriptShowMessage =function ShowMessage(Message) + Enter

+ + Enter +

alert(Message) + Enter +

procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

begin

PDFmyURLcom

Oumlrneğimiz son derece basit bir html sayfasının yapısını oluşturacak sabitlerden ve yineShowMessage isimli bir JavaScript fonksiyonundan ibaret Şu aşamada bu kodumuzTWebBrowser sınıfından tuumlremiş wBrowser isimli nesnemize belirtilen HTML kodlarınıyuumlklemekten başka bir işe yaramıyor Yukarıdaki kodda ilginccedil olabilecek tek hususTWebBrowser sınıfının ReadyState oumlzelliğinin READYSTATE_INTERACTIVE olmasınınkontroluuml olabilir Bu kontrol TWebBrowser nesnesine html kodlarının yuumlklenmesininbeklenmesi iccedilindir Peki makalemizin başlığına konu olan JavaScript metodlarının ccedilağrılmasınınasıl yapacağız diye duumlşuumlnuumlyor olabilirsiniz Sizleri daha fazla bekletmeden ShowMessageisimli JavaScript metodunu Delphirsquoden nasıl ccedilağırdığımızı goumlstermeye ccedilalışayım

Bir kaccedil paragraf oumlnce TWebBrowser sınıfının pek ccedilok interfacersquoi implemente ettiğinisoumlylemiştik Bu interfacersquolerden bir tanesi de IHTMLDocument2lsquodir IHTMLDocument2interfacersquoinin parentWindow propertyrsquosi IHTMLWindow2 tuumlruumlnden başka bir interface doumlnduumlruumlrIHTMLWindow2 interfacersquoinin execScript metodu tam da aradığımız işi yapmaktadır Sonparametresinden analayacağınız uumlzere bu interfacersquoin guumlcuuml sadece JavaScript kodlarıccedilalıştırmak ile sınırlı değildir Ancak biz oumlrneğimizde en yaygın kullanılan JavaScript olduğu iccedilinonu ele alacağız Goumlrduumlğuumlnuumlz gibi ShowMessage JavaScript metoduna Delphirsquonin TimeToStrmetodundan doumlnen değeri parametre olarak aktarıyor ve metodu ccedilalıştırıyoruz ShowMessageJavaScript metodunun iccedilinde alert komutunun olduğunu hatırlıyorsunuzdur Bu da ekranazaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirki

laquo Haz

1 2 3 45 6 7 8 9 10 1112 13 14 15 16 17 1819 20 21 22 23 24 2526 27 28 29 30 31

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 Tuumlrkccedile SevdalısıDelphi Tuumlrkiye ForumGuumlrcan OumlZTUumlRKMFatih KUumlCcedilUumlKKELEPCcedilEMemik YANIK KişiselMemik YANIKrsquoın GuumlnluumlğuumlNick HodgesSinan BARANZafer Ccedilelenk

363738394041

42

43

44454647

48

sHTML = HTMLsScript = ScriptStartSection + Enter +

JscriptShowMessage + Enter +ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION

[rfReplaceAll])sHTML = StringReplace(sHTML SCRIPTSECTION sScript

[rfReplaceAll])sHTML = StringReplace(sHTML BODYSECTION Delphi ve

JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE doApplicationProcessMessages

end

0102030405060708

09

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

zaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirkiJavaScript iccedilinde bazı nesneleri oluşturur ve kullanırız Bu nesneler bazen kendi yazdığımızJavaScript sınıfları olabileceği gibi bazen de 3primeuumlncuuml parti yazılımların ActiveX denetimleriolabilir Fusion Charts buna bir oumlrnek Yada Flash nesneleri başka bir oumlrnek

Pek i biz JavaScript iccedilinde oluşturduğumuz bu nesnelere Delphi altından nasıl erişeceğiz Delphi iccedilinde nesnelerin propertyrsquolerine erişebilsek bazı metodlarını ccedilalıştırabilsek ne guumlzelolurdu dediğinizi duyar gibiyim Onun iccedilinde aşağıdaki youmlntemi kullanacağız

Ziyaretccedili Bilgileri

Ziyaret 5 12073

Beğenilenler

Delphi 2010 (Weaver) ve TValue - 14 votesDerinlemesine Threading(3) - 13 votesDerinlemesine Threading(2) - 6 votesDerinlemesine Threading(1) - 6 votesYeni Veri Tipleri ve Operator Overloading - 4votesWin32 amp Net(Delphi-gtC) - 4 votesDelphi ve Google Maps API - 3 votesTThreadWaitFor Bug - 3 votesBITS(Background Intelligent Transfer Service)ile sessiz sedasız download ) - 3 votesBir Kiosk ve CreateDesktop macerası - 3votes

Meta

GirişYazılar RSSYorumlar RSSWordPressorg

Etiketler-Liste

010203

040506070809101112131415161718

19202122232425262728293031

32333435363738

constJScriptShowMessage =

function ShowMessage(Message) + Enter+

+ Enter +alert(Message) + Enter +

JScriptClass = function TPerson(Adi Yasi) + Enter + + Enter +

var fAdi = Adi + Enter +var fYasi = Yasi + Enter +thisSetAdi = SetAdi + Enter +thisSetYasi = SetYasi + Enter +thisToString = ToString + Enter +

function ToString() + Enter + + Enter + return fAdi + + 39 + + 39

+ + fYasi + Enter + + Enter +

function SetAdi( Value ) + Enter + + Enter +

fAdi = Value + Enter + + Enter +

function SetYasi( Value ) + Enter + + Enter +

fYasi = Value + Enter + + Enter +

+ Enter + var Person = new TPerson( + 39 +

Tuğrul HELVACI + 39 + 34) procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

beginsHTML = HTML

PDFmyURLcom

Bu oumlrneğimizin bir oumlncekinden tek farkı TPerson isminde bir JavaScript sınıfına sahip olması vebu sınıfın metodlarının ccedilalıştırılıyor olmasıdır Buradaki en can alıcı nokta TPerson isimliJavaScript sınıfının bir oumlrneğinin var Person = new TPerson() biccediliminde oluşturulması veglobal bir değişkene atanmasıdır Artık bizler Delphi tarafında TWebBrowserrsquoın IHTMLWindow2interfacersquoi uumlzerinden bu sınıf nesnesine erişebilir ve istediğimiz gibi kullanabiliriz

Goumlrduumlğuumlnuumlz gibi Delphi uumlzerinden JavaScriptrsquoe ait olan metodlara ve sınıflara erişebildikAcaba JavaScript Delphi uumlzerinde tanımlı olan sınıf ve metodlara erişebilir mi

Bu sorunun cevabı da evet Lacirckin biraz daha karmaşık bir mekanizmaya sahip MSDN helpuumlzerinden yaptığım araştırmada JavaScriptrsquoin harici dillere erişimi sağlayabilmesi iccedilinTWebBrowserrsquoın bazı interfacersquoleri implemente etmesi gerektiğini oumlğrendim Bu interfacersquolerIDocHostUIHandler IDocHostUIHandler2 interfacersquoleri Bu interfacersquolerin pek ccedilok metodumevcut Bu metodları burada paylaşmayı duumlşuumlnmuumlyorum ancak bu interfacersquolerin tanımlandığı

Absolute API Byte Arrays Class Reference

COM CreateDesktop CreateProcess

CreateRemoteThread CreateToolHelp32SnapShotDTS EnumDesktopProc EnumDesktops FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoHacking Inheritance Interface JavaScriptMethod Pointer Module32First Module32Next

OpenDesktop Persistance Pointer Procedure

Pointer Process Process32First Process32NextReqursion RTTI SetProcessWorkingSetSize SQLServer Sw itchDesktop TerminateProcess

Thread Untyped Parameters VirtualAllocEx

VirtualFreeEx WaitForSingleObjectWriteProcessMemory

Delphi About

Auto Select All The Text For TCustomEdit OnMouse Click 29 Haziran 2010Memory Leak Notification in Delphi - ReportMemory Leak on Program Exit 27 Haziran2010PCRE Workbench - Regular Expression TestTool - Source Code Delphi Application 22Haziran 2010Deleting Dataset Records In a Loop - PollResults - Why All Records Are Not Deleted 21Haziran 2010Force TListViews Edit Mode using a KeyboardShortcut 17 Haziran 2010Implementing On Item Click Double Click forDelphis TListView control 16 Haziran 2010Run Your Delphi Application in Full Screen -Implement F11 - Full Screen 14 Haziran 2010

394041424344

45

46

47484950

51525354555657585960

61

626364

65

sScript = ScriptStartSection + Enter +JscriptShowMessage+ Enter +JscriptClass + Enter +

ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION [rfReplaceAll])

sHTML = StringReplace(sHTML SCRIPTSECTION sScript [rfReplaceAll])

sHTML = StringReplace(sHTML BODYSECTION Delphive JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE do

ApplicationProcessMessagesend procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)

WinexecScript(PersonSetYasi(18) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)end

PDFmyURLcom

dosyayı makalenin sonunda indirebilmeniz accedilısından ekleyeceğim

IDocHostUIHandler ve IDocHostUIHandler2 interfacelerinin tanım dosyası hazırlandıktan sonraTWebBrowser sınıfımızın IDocHostUIHandler interfacersquoini desteklemesini sağlamamızgerekiyor Tanımlamamız aşağıdaki şekildeki gibi goumlruumlnecek

Implement F11 - Full Screen 14 Haziran 2010Displaying Enumerated Properties in aSelectable List - Run-Time Enum Selection inDelphi 10 Haziran 2010How Do You Delete Dataset Records In aLoop 08 Haziran 2010Display Custom Hints for Status Bar Panels 07Haziran 2010

Sık Ziyaret Edilenler

Sayfa Home(16059)

Delphi ve Google Maps API(4132)

Delphi ve Google Maps API(1976)

Nedir bu Threadrsquolerden ccedilektiğimiz(1444)

Delphi amp Animated Flash Charts(Fusion Charts)(1179)

Delphi amp JavaScript Kardeşliği(936)

Delphi 2010 (Weaver) ve TValue(918)

Derinlemesine Threading(1)(886)

Derinlemesine Threading(2)(695)

Win32 amp Net(Delphi-gtC)(617)

Kategori Delphi(613)

Bir Kiosk ve CreateDesktop macerası(568)

Sayfa Hakkında

01020304050607

08

09

10

11

12

1314

15

16

1718

1920

21

2223

24

2526272829

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget out

ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw UINT)

HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer) HResult

stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINT constpcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResult stdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

PDFmyURLcom

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 2: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

sayılmam Dolayısı ile yazacağım oumlrnekler sizlere basit gelirse yahut bazı hatalarım olursaşimdiden affınıza sığınırım

Herşeyden evvel TWebBrowser nesnesi kendisine yuumlkleyeceği bir HTML dosya alır Bu dosyadisk uumlzerinde yada internet uumlzerinde bir yerdedir ve TWebBrowserrsquoın Navigate metodunaparametre olarak aktarılır Navigate metodu kendisine verilen HTML dosyayı yada linkingoumlsterdiği verileri parse eder ve TWebBrowser uumlzerinde goumlsterir Buraya kadar herşey normalLacirckin ben yapım gereği disk uumlzerinde bulunan dosyalar ile ccedilalışmayı pek sevmem Budosyaların bozulabilme ihtimalleri yada silinebilme ihtimallerinin olması programınızın doğruccedilalışmasını engelleyeceği iccedilin dosya erişimli youmlntemlerden muumlmkuumln mertebe uzak kalmanızıtavsiye ederim Bu bağlamda yaptığım araştırma sonucu pek ccedilok kaynakta HTML kaynakkodlarının herhangi bir dosyaya ihtiyaccedil duymadan TWebBrowser nesnesinde goumlsterilebildiğinioumlğrendim Bulduğum metod aşağıdaki gibidir

MSDN yardım doumlkuumlmanlarından yada Microsoftrsquoun online MSDN kaynaklarındanTWebBrowser sınıfının oumlzelliklerini inceleyecek olursanız pek ccedilok interfacersquoi implementeettiğini goumlzlemlersiniz Bu interfacersquolerden bir tanesi de IPersistStreamInitlsquodirIPersistStreamInit interfacersquoi TWebBrowser tarafından implemente edildiğine goumlre buinterfacersquoin iccedilinde mevcut bulunan IsDirtyLoadSaveGetSizeMax ve InitNew metodlarının da

EnumDesktopProc EnumDesktops Flash FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoGetThreadContext GetTickCount GetTickCount64Hacking Inheritance InitializeCriticalSectionInterface InterlockedCompareExchangeInterlockedDecrement InterlockedExchangeInterlockedExchangeAdd InterlockedIncrementJavaScript LeaveCriticalSection Method PointerModule32First Module32Next MSSQL OpenDesktopOpenEvent OpenMutex OpenSemaphoreOpenWaitableTimer Operator Overloading PersistancePointer Procedure Pointer ProcessProcess32First Process32Next Query QueryInterfaceQueryPerformanceCounter Queue ReleaseMutexReleaseSemaphore Reqursion ResetEvent ResumeThreadRTTI SetEvent SetProcessWorkingSetSizeSetThreadContext SetWaitableTimer Smilarity SORT SQLSQL Server Stream SuspendThread Sw itchDesktopTDateTime TerminateProcess TerminateThread

Thread TInterfacedObject TValue UntypedParameters VirtualAllocEx VirtualFreeEx

WaitForMultipleObjects WaitForSingleObjectWeaver WriteProcessMemory _AddRef _Release

WP Cumulus Flash tag cloud by Roy Tanckrequires Flash Player 9 or better

Son Yorumlar

Yeni Veri Tipleri ve Operator Overloading iccedilinTuğrul HELVACIYeni Veri Tipleri ve Operator Overloading iccedilinZafer CcedilelenkDelphi ve Google Maps API iccedilin TuğrulHELVACIDelphi ve Google Maps API iccedilin ahmet

01

02030405060708091011121314151617

1819202122232425

procedure LoadHTML(WebBrowser TWebBrowser HTMLCodeString)

varsl TStringListms TMemoryStream

beginWebBrowserNavigate(aboutblank)

if Assigned(WebBrowserDocument) thenbegin

sl = TStringListCreatetry

ms = TMemoryStreamCreatetry

slText = HTMLCodeslSaveToStream(ms)msSeek(0 0)(WebBrowserDocument as

IPersistStreamInit)Load(TStreamAdapterCreate(ms))

finallymsFree

endfinally

slFreeend

endend

PDFmyURLcom

interfacersquoin iccedilinde mevcut bulunan IsDirtyLoadSaveGetSizeMax ve InitNew metodlarının daimplemente edilmiş olması gerekir Bizim ihtiyacımız olan Load metodu kendisine IStreamtuumlruumlnde bir parametre bekler IStream adından da anlaşılabileceği gibi bir interfacersquodirDelphirsquonin Classespas dosyasında tanımlanmış olan TStreamAdapter isimli sınıfı da IStreaminterfacersquoini implemente etmiştir ve asıl amacı Delphi TStream sınıflarının IStream bek leyenyapılarla haberleşmesini sağlamaktır Dolayısı ile IStream parametresi bekleyen Loadmetoduna TStreamAdapter sınıfından bir nesne geccedililebilir

Yukarıdaki kodumuz programımız iccedilerisinde html kodları yazabilmemizi ve bu kodları birTWebBrowser nesnesi uumlzerinde goumlzlemleyebilmemizi sağlamaktadır Şimdi ufak bir testyapalım

Ziyaretccedili Defteri iccedilin Tuğrul HELVACI

Son Yazılar

Yeni Veri Tipleri ve Operator OverloadingInterface Nedir Nerelerde ve Neden Kullanırız Derinlemesine Threading(3)SQLrsquode Benzerlik AlgoritmalarıhellipFull Text Searchinghellip

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 2010Pts Sal Ccedilar Per Cum Cts Paz

01

02030405060708091011121314151617181920212223242526

272829303132333435

wBrowser formumuz uumlzerinde bulunan TWebBrowser nesnesininadıdır

const

Enter = Char(13) + Char(10)HtmlStartSection = lthtmlgtHtmlEndSection = lthtmlgtHeadStartSection = ltheadgtHeadEndSection = ltheadgtBodyStartSection = ltbodygtBodyEndSection = ltbodygtScriptStartSection= ltscript type=textjavascriptgtScriptEndSection = ltscriptgt

HTML = HtmlStartSection + Enter +

HeadStartSection + Enter +HEADSECTION + Enter +

SCRIPTSECTION + Enter +HeadEndSection + Enter +BodyStartSection + Enter +

BODYSECTION + Enter +BodyEndSection + Enter +

HtmlEndSection const

JScriptShowMessage =function ShowMessage(Message) + Enter

+ + Enter +

alert(Message) + Enter +

procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

begin

PDFmyURLcom

Oumlrneğimiz son derece basit bir html sayfasının yapısını oluşturacak sabitlerden ve yineShowMessage isimli bir JavaScript fonksiyonundan ibaret Şu aşamada bu kodumuzTWebBrowser sınıfından tuumlremiş wBrowser isimli nesnemize belirtilen HTML kodlarınıyuumlklemekten başka bir işe yaramıyor Yukarıdaki kodda ilginccedil olabilecek tek hususTWebBrowser sınıfının ReadyState oumlzelliğinin READYSTATE_INTERACTIVE olmasınınkontroluuml olabilir Bu kontrol TWebBrowser nesnesine html kodlarının yuumlklenmesininbeklenmesi iccedilindir Peki makalemizin başlığına konu olan JavaScript metodlarının ccedilağrılmasınınasıl yapacağız diye duumlşuumlnuumlyor olabilirsiniz Sizleri daha fazla bekletmeden ShowMessageisimli JavaScript metodunu Delphirsquoden nasıl ccedilağırdığımızı goumlstermeye ccedilalışayım

Bir kaccedil paragraf oumlnce TWebBrowser sınıfının pek ccedilok interfacersquoi implemente ettiğinisoumlylemiştik Bu interfacersquolerden bir tanesi de IHTMLDocument2lsquodir IHTMLDocument2interfacersquoinin parentWindow propertyrsquosi IHTMLWindow2 tuumlruumlnden başka bir interface doumlnduumlruumlrIHTMLWindow2 interfacersquoinin execScript metodu tam da aradığımız işi yapmaktadır Sonparametresinden analayacağınız uumlzere bu interfacersquoin guumlcuuml sadece JavaScript kodlarıccedilalıştırmak ile sınırlı değildir Ancak biz oumlrneğimizde en yaygın kullanılan JavaScript olduğu iccedilinonu ele alacağız Goumlrduumlğuumlnuumlz gibi ShowMessage JavaScript metoduna Delphirsquonin TimeToStrmetodundan doumlnen değeri parametre olarak aktarıyor ve metodu ccedilalıştırıyoruz ShowMessageJavaScript metodunun iccedilinde alert komutunun olduğunu hatırlıyorsunuzdur Bu da ekranazaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirki

laquo Haz

1 2 3 45 6 7 8 9 10 1112 13 14 15 16 17 1819 20 21 22 23 24 2526 27 28 29 30 31

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 Tuumlrkccedile SevdalısıDelphi Tuumlrkiye ForumGuumlrcan OumlZTUumlRKMFatih KUumlCcedilUumlKKELEPCcedilEMemik YANIK KişiselMemik YANIKrsquoın GuumlnluumlğuumlNick HodgesSinan BARANZafer Ccedilelenk

363738394041

42

43

44454647

48

sHTML = HTMLsScript = ScriptStartSection + Enter +

JscriptShowMessage + Enter +ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION

[rfReplaceAll])sHTML = StringReplace(sHTML SCRIPTSECTION sScript

[rfReplaceAll])sHTML = StringReplace(sHTML BODYSECTION Delphi ve

JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE doApplicationProcessMessages

end

0102030405060708

09

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

zaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirkiJavaScript iccedilinde bazı nesneleri oluşturur ve kullanırız Bu nesneler bazen kendi yazdığımızJavaScript sınıfları olabileceği gibi bazen de 3primeuumlncuuml parti yazılımların ActiveX denetimleriolabilir Fusion Charts buna bir oumlrnek Yada Flash nesneleri başka bir oumlrnek

Pek i biz JavaScript iccedilinde oluşturduğumuz bu nesnelere Delphi altından nasıl erişeceğiz Delphi iccedilinde nesnelerin propertyrsquolerine erişebilsek bazı metodlarını ccedilalıştırabilsek ne guumlzelolurdu dediğinizi duyar gibiyim Onun iccedilinde aşağıdaki youmlntemi kullanacağız

Ziyaretccedili Bilgileri

Ziyaret 5 12073

Beğenilenler

Delphi 2010 (Weaver) ve TValue - 14 votesDerinlemesine Threading(3) - 13 votesDerinlemesine Threading(2) - 6 votesDerinlemesine Threading(1) - 6 votesYeni Veri Tipleri ve Operator Overloading - 4votesWin32 amp Net(Delphi-gtC) - 4 votesDelphi ve Google Maps API - 3 votesTThreadWaitFor Bug - 3 votesBITS(Background Intelligent Transfer Service)ile sessiz sedasız download ) - 3 votesBir Kiosk ve CreateDesktop macerası - 3votes

Meta

GirişYazılar RSSYorumlar RSSWordPressorg

Etiketler-Liste

010203

040506070809101112131415161718

19202122232425262728293031

32333435363738

constJScriptShowMessage =

function ShowMessage(Message) + Enter+

+ Enter +alert(Message) + Enter +

JScriptClass = function TPerson(Adi Yasi) + Enter + + Enter +

var fAdi = Adi + Enter +var fYasi = Yasi + Enter +thisSetAdi = SetAdi + Enter +thisSetYasi = SetYasi + Enter +thisToString = ToString + Enter +

function ToString() + Enter + + Enter + return fAdi + + 39 + + 39

+ + fYasi + Enter + + Enter +

function SetAdi( Value ) + Enter + + Enter +

fAdi = Value + Enter + + Enter +

function SetYasi( Value ) + Enter + + Enter +

fYasi = Value + Enter + + Enter +

+ Enter + var Person = new TPerson( + 39 +

Tuğrul HELVACI + 39 + 34) procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

beginsHTML = HTML

PDFmyURLcom

Bu oumlrneğimizin bir oumlncekinden tek farkı TPerson isminde bir JavaScript sınıfına sahip olması vebu sınıfın metodlarının ccedilalıştırılıyor olmasıdır Buradaki en can alıcı nokta TPerson isimliJavaScript sınıfının bir oumlrneğinin var Person = new TPerson() biccediliminde oluşturulması veglobal bir değişkene atanmasıdır Artık bizler Delphi tarafında TWebBrowserrsquoın IHTMLWindow2interfacersquoi uumlzerinden bu sınıf nesnesine erişebilir ve istediğimiz gibi kullanabiliriz

Goumlrduumlğuumlnuumlz gibi Delphi uumlzerinden JavaScriptrsquoe ait olan metodlara ve sınıflara erişebildikAcaba JavaScript Delphi uumlzerinde tanımlı olan sınıf ve metodlara erişebilir mi

Bu sorunun cevabı da evet Lacirckin biraz daha karmaşık bir mekanizmaya sahip MSDN helpuumlzerinden yaptığım araştırmada JavaScriptrsquoin harici dillere erişimi sağlayabilmesi iccedilinTWebBrowserrsquoın bazı interfacersquoleri implemente etmesi gerektiğini oumlğrendim Bu interfacersquolerIDocHostUIHandler IDocHostUIHandler2 interfacersquoleri Bu interfacersquolerin pek ccedilok metodumevcut Bu metodları burada paylaşmayı duumlşuumlnmuumlyorum ancak bu interfacersquolerin tanımlandığı

Absolute API Byte Arrays Class Reference

COM CreateDesktop CreateProcess

CreateRemoteThread CreateToolHelp32SnapShotDTS EnumDesktopProc EnumDesktops FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoHacking Inheritance Interface JavaScriptMethod Pointer Module32First Module32Next

OpenDesktop Persistance Pointer Procedure

Pointer Process Process32First Process32NextReqursion RTTI SetProcessWorkingSetSize SQLServer Sw itchDesktop TerminateProcess

Thread Untyped Parameters VirtualAllocEx

VirtualFreeEx WaitForSingleObjectWriteProcessMemory

Delphi About

Auto Select All The Text For TCustomEdit OnMouse Click 29 Haziran 2010Memory Leak Notification in Delphi - ReportMemory Leak on Program Exit 27 Haziran2010PCRE Workbench - Regular Expression TestTool - Source Code Delphi Application 22Haziran 2010Deleting Dataset Records In a Loop - PollResults - Why All Records Are Not Deleted 21Haziran 2010Force TListViews Edit Mode using a KeyboardShortcut 17 Haziran 2010Implementing On Item Click Double Click forDelphis TListView control 16 Haziran 2010Run Your Delphi Application in Full Screen -Implement F11 - Full Screen 14 Haziran 2010

394041424344

45

46

47484950

51525354555657585960

61

626364

65

sScript = ScriptStartSection + Enter +JscriptShowMessage+ Enter +JscriptClass + Enter +

ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION [rfReplaceAll])

sHTML = StringReplace(sHTML SCRIPTSECTION sScript [rfReplaceAll])

sHTML = StringReplace(sHTML BODYSECTION Delphive JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE do

ApplicationProcessMessagesend procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)

WinexecScript(PersonSetYasi(18) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)end

PDFmyURLcom

dosyayı makalenin sonunda indirebilmeniz accedilısından ekleyeceğim

IDocHostUIHandler ve IDocHostUIHandler2 interfacelerinin tanım dosyası hazırlandıktan sonraTWebBrowser sınıfımızın IDocHostUIHandler interfacersquoini desteklemesini sağlamamızgerekiyor Tanımlamamız aşağıdaki şekildeki gibi goumlruumlnecek

Implement F11 - Full Screen 14 Haziran 2010Displaying Enumerated Properties in aSelectable List - Run-Time Enum Selection inDelphi 10 Haziran 2010How Do You Delete Dataset Records In aLoop 08 Haziran 2010Display Custom Hints for Status Bar Panels 07Haziran 2010

Sık Ziyaret Edilenler

Sayfa Home(16059)

Delphi ve Google Maps API(4132)

Delphi ve Google Maps API(1976)

Nedir bu Threadrsquolerden ccedilektiğimiz(1444)

Delphi amp Animated Flash Charts(Fusion Charts)(1179)

Delphi amp JavaScript Kardeşliği(936)

Delphi 2010 (Weaver) ve TValue(918)

Derinlemesine Threading(1)(886)

Derinlemesine Threading(2)(695)

Win32 amp Net(Delphi-gtC)(617)

Kategori Delphi(613)

Bir Kiosk ve CreateDesktop macerası(568)

Sayfa Hakkında

01020304050607

08

09

10

11

12

1314

15

16

1718

1920

21

2223

24

2526272829

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget out

ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw UINT)

HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer) HResult

stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINT constpcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResult stdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

PDFmyURLcom

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 3: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

interfacersquoin iccedilinde mevcut bulunan IsDirtyLoadSaveGetSizeMax ve InitNew metodlarının daimplemente edilmiş olması gerekir Bizim ihtiyacımız olan Load metodu kendisine IStreamtuumlruumlnde bir parametre bekler IStream adından da anlaşılabileceği gibi bir interfacersquodirDelphirsquonin Classespas dosyasında tanımlanmış olan TStreamAdapter isimli sınıfı da IStreaminterfacersquoini implemente etmiştir ve asıl amacı Delphi TStream sınıflarının IStream bek leyenyapılarla haberleşmesini sağlamaktır Dolayısı ile IStream parametresi bekleyen Loadmetoduna TStreamAdapter sınıfından bir nesne geccedililebilir

Yukarıdaki kodumuz programımız iccedilerisinde html kodları yazabilmemizi ve bu kodları birTWebBrowser nesnesi uumlzerinde goumlzlemleyebilmemizi sağlamaktadır Şimdi ufak bir testyapalım

Ziyaretccedili Defteri iccedilin Tuğrul HELVACI

Son Yazılar

Yeni Veri Tipleri ve Operator OverloadingInterface Nedir Nerelerde ve Neden Kullanırız Derinlemesine Threading(3)SQLrsquode Benzerlik AlgoritmalarıhellipFull Text Searchinghellip

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 2010Pts Sal Ccedilar Per Cum Cts Paz

01

02030405060708091011121314151617181920212223242526

272829303132333435

wBrowser formumuz uumlzerinde bulunan TWebBrowser nesnesininadıdır

const

Enter = Char(13) + Char(10)HtmlStartSection = lthtmlgtHtmlEndSection = lthtmlgtHeadStartSection = ltheadgtHeadEndSection = ltheadgtBodyStartSection = ltbodygtBodyEndSection = ltbodygtScriptStartSection= ltscript type=textjavascriptgtScriptEndSection = ltscriptgt

HTML = HtmlStartSection + Enter +

HeadStartSection + Enter +HEADSECTION + Enter +

SCRIPTSECTION + Enter +HeadEndSection + Enter +BodyStartSection + Enter +

BODYSECTION + Enter +BodyEndSection + Enter +

HtmlEndSection const

JScriptShowMessage =function ShowMessage(Message) + Enter

+ + Enter +

alert(Message) + Enter +

procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

begin

PDFmyURLcom

Oumlrneğimiz son derece basit bir html sayfasının yapısını oluşturacak sabitlerden ve yineShowMessage isimli bir JavaScript fonksiyonundan ibaret Şu aşamada bu kodumuzTWebBrowser sınıfından tuumlremiş wBrowser isimli nesnemize belirtilen HTML kodlarınıyuumlklemekten başka bir işe yaramıyor Yukarıdaki kodda ilginccedil olabilecek tek hususTWebBrowser sınıfının ReadyState oumlzelliğinin READYSTATE_INTERACTIVE olmasınınkontroluuml olabilir Bu kontrol TWebBrowser nesnesine html kodlarının yuumlklenmesininbeklenmesi iccedilindir Peki makalemizin başlığına konu olan JavaScript metodlarının ccedilağrılmasınınasıl yapacağız diye duumlşuumlnuumlyor olabilirsiniz Sizleri daha fazla bekletmeden ShowMessageisimli JavaScript metodunu Delphirsquoden nasıl ccedilağırdığımızı goumlstermeye ccedilalışayım

Bir kaccedil paragraf oumlnce TWebBrowser sınıfının pek ccedilok interfacersquoi implemente ettiğinisoumlylemiştik Bu interfacersquolerden bir tanesi de IHTMLDocument2lsquodir IHTMLDocument2interfacersquoinin parentWindow propertyrsquosi IHTMLWindow2 tuumlruumlnden başka bir interface doumlnduumlruumlrIHTMLWindow2 interfacersquoinin execScript metodu tam da aradığımız işi yapmaktadır Sonparametresinden analayacağınız uumlzere bu interfacersquoin guumlcuuml sadece JavaScript kodlarıccedilalıştırmak ile sınırlı değildir Ancak biz oumlrneğimizde en yaygın kullanılan JavaScript olduğu iccedilinonu ele alacağız Goumlrduumlğuumlnuumlz gibi ShowMessage JavaScript metoduna Delphirsquonin TimeToStrmetodundan doumlnen değeri parametre olarak aktarıyor ve metodu ccedilalıştırıyoruz ShowMessageJavaScript metodunun iccedilinde alert komutunun olduğunu hatırlıyorsunuzdur Bu da ekranazaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirki

laquo Haz

1 2 3 45 6 7 8 9 10 1112 13 14 15 16 17 1819 20 21 22 23 24 2526 27 28 29 30 31

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 Tuumlrkccedile SevdalısıDelphi Tuumlrkiye ForumGuumlrcan OumlZTUumlRKMFatih KUumlCcedilUumlKKELEPCcedilEMemik YANIK KişiselMemik YANIKrsquoın GuumlnluumlğuumlNick HodgesSinan BARANZafer Ccedilelenk

363738394041

42

43

44454647

48

sHTML = HTMLsScript = ScriptStartSection + Enter +

JscriptShowMessage + Enter +ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION

[rfReplaceAll])sHTML = StringReplace(sHTML SCRIPTSECTION sScript

[rfReplaceAll])sHTML = StringReplace(sHTML BODYSECTION Delphi ve

JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE doApplicationProcessMessages

end

0102030405060708

09

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

zaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirkiJavaScript iccedilinde bazı nesneleri oluşturur ve kullanırız Bu nesneler bazen kendi yazdığımızJavaScript sınıfları olabileceği gibi bazen de 3primeuumlncuuml parti yazılımların ActiveX denetimleriolabilir Fusion Charts buna bir oumlrnek Yada Flash nesneleri başka bir oumlrnek

Pek i biz JavaScript iccedilinde oluşturduğumuz bu nesnelere Delphi altından nasıl erişeceğiz Delphi iccedilinde nesnelerin propertyrsquolerine erişebilsek bazı metodlarını ccedilalıştırabilsek ne guumlzelolurdu dediğinizi duyar gibiyim Onun iccedilinde aşağıdaki youmlntemi kullanacağız

Ziyaretccedili Bilgileri

Ziyaret 5 12073

Beğenilenler

Delphi 2010 (Weaver) ve TValue - 14 votesDerinlemesine Threading(3) - 13 votesDerinlemesine Threading(2) - 6 votesDerinlemesine Threading(1) - 6 votesYeni Veri Tipleri ve Operator Overloading - 4votesWin32 amp Net(Delphi-gtC) - 4 votesDelphi ve Google Maps API - 3 votesTThreadWaitFor Bug - 3 votesBITS(Background Intelligent Transfer Service)ile sessiz sedasız download ) - 3 votesBir Kiosk ve CreateDesktop macerası - 3votes

Meta

GirişYazılar RSSYorumlar RSSWordPressorg

Etiketler-Liste

010203

040506070809101112131415161718

19202122232425262728293031

32333435363738

constJScriptShowMessage =

function ShowMessage(Message) + Enter+

+ Enter +alert(Message) + Enter +

JScriptClass = function TPerson(Adi Yasi) + Enter + + Enter +

var fAdi = Adi + Enter +var fYasi = Yasi + Enter +thisSetAdi = SetAdi + Enter +thisSetYasi = SetYasi + Enter +thisToString = ToString + Enter +

function ToString() + Enter + + Enter + return fAdi + + 39 + + 39

+ + fYasi + Enter + + Enter +

function SetAdi( Value ) + Enter + + Enter +

fAdi = Value + Enter + + Enter +

function SetYasi( Value ) + Enter + + Enter +

fYasi = Value + Enter + + Enter +

+ Enter + var Person = new TPerson( + 39 +

Tuğrul HELVACI + 39 + 34) procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

beginsHTML = HTML

PDFmyURLcom

Bu oumlrneğimizin bir oumlncekinden tek farkı TPerson isminde bir JavaScript sınıfına sahip olması vebu sınıfın metodlarının ccedilalıştırılıyor olmasıdır Buradaki en can alıcı nokta TPerson isimliJavaScript sınıfının bir oumlrneğinin var Person = new TPerson() biccediliminde oluşturulması veglobal bir değişkene atanmasıdır Artık bizler Delphi tarafında TWebBrowserrsquoın IHTMLWindow2interfacersquoi uumlzerinden bu sınıf nesnesine erişebilir ve istediğimiz gibi kullanabiliriz

Goumlrduumlğuumlnuumlz gibi Delphi uumlzerinden JavaScriptrsquoe ait olan metodlara ve sınıflara erişebildikAcaba JavaScript Delphi uumlzerinde tanımlı olan sınıf ve metodlara erişebilir mi

Bu sorunun cevabı da evet Lacirckin biraz daha karmaşık bir mekanizmaya sahip MSDN helpuumlzerinden yaptığım araştırmada JavaScriptrsquoin harici dillere erişimi sağlayabilmesi iccedilinTWebBrowserrsquoın bazı interfacersquoleri implemente etmesi gerektiğini oumlğrendim Bu interfacersquolerIDocHostUIHandler IDocHostUIHandler2 interfacersquoleri Bu interfacersquolerin pek ccedilok metodumevcut Bu metodları burada paylaşmayı duumlşuumlnmuumlyorum ancak bu interfacersquolerin tanımlandığı

Absolute API Byte Arrays Class Reference

COM CreateDesktop CreateProcess

CreateRemoteThread CreateToolHelp32SnapShotDTS EnumDesktopProc EnumDesktops FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoHacking Inheritance Interface JavaScriptMethod Pointer Module32First Module32Next

OpenDesktop Persistance Pointer Procedure

Pointer Process Process32First Process32NextReqursion RTTI SetProcessWorkingSetSize SQLServer Sw itchDesktop TerminateProcess

Thread Untyped Parameters VirtualAllocEx

VirtualFreeEx WaitForSingleObjectWriteProcessMemory

Delphi About

Auto Select All The Text For TCustomEdit OnMouse Click 29 Haziran 2010Memory Leak Notification in Delphi - ReportMemory Leak on Program Exit 27 Haziran2010PCRE Workbench - Regular Expression TestTool - Source Code Delphi Application 22Haziran 2010Deleting Dataset Records In a Loop - PollResults - Why All Records Are Not Deleted 21Haziran 2010Force TListViews Edit Mode using a KeyboardShortcut 17 Haziran 2010Implementing On Item Click Double Click forDelphis TListView control 16 Haziran 2010Run Your Delphi Application in Full Screen -Implement F11 - Full Screen 14 Haziran 2010

394041424344

45

46

47484950

51525354555657585960

61

626364

65

sScript = ScriptStartSection + Enter +JscriptShowMessage+ Enter +JscriptClass + Enter +

ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION [rfReplaceAll])

sHTML = StringReplace(sHTML SCRIPTSECTION sScript [rfReplaceAll])

sHTML = StringReplace(sHTML BODYSECTION Delphive JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE do

ApplicationProcessMessagesend procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)

WinexecScript(PersonSetYasi(18) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)end

PDFmyURLcom

dosyayı makalenin sonunda indirebilmeniz accedilısından ekleyeceğim

IDocHostUIHandler ve IDocHostUIHandler2 interfacelerinin tanım dosyası hazırlandıktan sonraTWebBrowser sınıfımızın IDocHostUIHandler interfacersquoini desteklemesini sağlamamızgerekiyor Tanımlamamız aşağıdaki şekildeki gibi goumlruumlnecek

Implement F11 - Full Screen 14 Haziran 2010Displaying Enumerated Properties in aSelectable List - Run-Time Enum Selection inDelphi 10 Haziran 2010How Do You Delete Dataset Records In aLoop 08 Haziran 2010Display Custom Hints for Status Bar Panels 07Haziran 2010

Sık Ziyaret Edilenler

Sayfa Home(16059)

Delphi ve Google Maps API(4132)

Delphi ve Google Maps API(1976)

Nedir bu Threadrsquolerden ccedilektiğimiz(1444)

Delphi amp Animated Flash Charts(Fusion Charts)(1179)

Delphi amp JavaScript Kardeşliği(936)

Delphi 2010 (Weaver) ve TValue(918)

Derinlemesine Threading(1)(886)

Derinlemesine Threading(2)(695)

Win32 amp Net(Delphi-gtC)(617)

Kategori Delphi(613)

Bir Kiosk ve CreateDesktop macerası(568)

Sayfa Hakkında

01020304050607

08

09

10

11

12

1314

15

16

1718

1920

21

2223

24

2526272829

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget out

ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw UINT)

HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer) HResult

stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINT constpcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResult stdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

PDFmyURLcom

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 4: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

Oumlrneğimiz son derece basit bir html sayfasının yapısını oluşturacak sabitlerden ve yineShowMessage isimli bir JavaScript fonksiyonundan ibaret Şu aşamada bu kodumuzTWebBrowser sınıfından tuumlremiş wBrowser isimli nesnemize belirtilen HTML kodlarınıyuumlklemekten başka bir işe yaramıyor Yukarıdaki kodda ilginccedil olabilecek tek hususTWebBrowser sınıfının ReadyState oumlzelliğinin READYSTATE_INTERACTIVE olmasınınkontroluuml olabilir Bu kontrol TWebBrowser nesnesine html kodlarının yuumlklenmesininbeklenmesi iccedilindir Peki makalemizin başlığına konu olan JavaScript metodlarının ccedilağrılmasınınasıl yapacağız diye duumlşuumlnuumlyor olabilirsiniz Sizleri daha fazla bekletmeden ShowMessageisimli JavaScript metodunu Delphirsquoden nasıl ccedilağırdığımızı goumlstermeye ccedilalışayım

Bir kaccedil paragraf oumlnce TWebBrowser sınıfının pek ccedilok interfacersquoi implemente ettiğinisoumlylemiştik Bu interfacersquolerden bir tanesi de IHTMLDocument2lsquodir IHTMLDocument2interfacersquoinin parentWindow propertyrsquosi IHTMLWindow2 tuumlruumlnden başka bir interface doumlnduumlruumlrIHTMLWindow2 interfacersquoinin execScript metodu tam da aradığımız işi yapmaktadır Sonparametresinden analayacağınız uumlzere bu interfacersquoin guumlcuuml sadece JavaScript kodlarıccedilalıştırmak ile sınırlı değildir Ancak biz oumlrneğimizde en yaygın kullanılan JavaScript olduğu iccedilinonu ele alacağız Goumlrduumlğuumlnuumlz gibi ShowMessage JavaScript metoduna Delphirsquonin TimeToStrmetodundan doumlnen değeri parametre olarak aktarıyor ve metodu ccedilalıştırıyoruz ShowMessageJavaScript metodunun iccedilinde alert komutunun olduğunu hatırlıyorsunuzdur Bu da ekranazaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirki

laquo Haz

1 2 3 45 6 7 8 9 10 1112 13 14 15 16 17 1819 20 21 22 23 24 2526 27 28 29 30 31

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 Tuumlrkccedile SevdalısıDelphi Tuumlrkiye ForumGuumlrcan OumlZTUumlRKMFatih KUumlCcedilUumlKKELEPCcedilEMemik YANIK KişiselMemik YANIKrsquoın GuumlnluumlğuumlNick HodgesSinan BARANZafer Ccedilelenk

363738394041

42

43

44454647

48

sHTML = HTMLsScript = ScriptStartSection + Enter +

JscriptShowMessage + Enter +ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION

[rfReplaceAll])sHTML = StringReplace(sHTML SCRIPTSECTION sScript

[rfReplaceAll])sHTML = StringReplace(sHTML BODYSECTION Delphi ve

JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE doApplicationProcessMessages

end

0102030405060708

09

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

zaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirkiJavaScript iccedilinde bazı nesneleri oluşturur ve kullanırız Bu nesneler bazen kendi yazdığımızJavaScript sınıfları olabileceği gibi bazen de 3primeuumlncuuml parti yazılımların ActiveX denetimleriolabilir Fusion Charts buna bir oumlrnek Yada Flash nesneleri başka bir oumlrnek

Pek i biz JavaScript iccedilinde oluşturduğumuz bu nesnelere Delphi altından nasıl erişeceğiz Delphi iccedilinde nesnelerin propertyrsquolerine erişebilsek bazı metodlarını ccedilalıştırabilsek ne guumlzelolurdu dediğinizi duyar gibiyim Onun iccedilinde aşağıdaki youmlntemi kullanacağız

Ziyaretccedili Bilgileri

Ziyaret 5 12073

Beğenilenler

Delphi 2010 (Weaver) ve TValue - 14 votesDerinlemesine Threading(3) - 13 votesDerinlemesine Threading(2) - 6 votesDerinlemesine Threading(1) - 6 votesYeni Veri Tipleri ve Operator Overloading - 4votesWin32 amp Net(Delphi-gtC) - 4 votesDelphi ve Google Maps API - 3 votesTThreadWaitFor Bug - 3 votesBITS(Background Intelligent Transfer Service)ile sessiz sedasız download ) - 3 votesBir Kiosk ve CreateDesktop macerası - 3votes

Meta

GirişYazılar RSSYorumlar RSSWordPressorg

Etiketler-Liste

010203

040506070809101112131415161718

19202122232425262728293031

32333435363738

constJScriptShowMessage =

function ShowMessage(Message) + Enter+

+ Enter +alert(Message) + Enter +

JScriptClass = function TPerson(Adi Yasi) + Enter + + Enter +

var fAdi = Adi + Enter +var fYasi = Yasi + Enter +thisSetAdi = SetAdi + Enter +thisSetYasi = SetYasi + Enter +thisToString = ToString + Enter +

function ToString() + Enter + + Enter + return fAdi + + 39 + + 39

+ + fYasi + Enter + + Enter +

function SetAdi( Value ) + Enter + + Enter +

fAdi = Value + Enter + + Enter +

function SetYasi( Value ) + Enter + + Enter +

fYasi = Value + Enter + + Enter +

+ Enter + var Person = new TPerson( + 39 +

Tuğrul HELVACI + 39 + 34) procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

beginsHTML = HTML

PDFmyURLcom

Bu oumlrneğimizin bir oumlncekinden tek farkı TPerson isminde bir JavaScript sınıfına sahip olması vebu sınıfın metodlarının ccedilalıştırılıyor olmasıdır Buradaki en can alıcı nokta TPerson isimliJavaScript sınıfının bir oumlrneğinin var Person = new TPerson() biccediliminde oluşturulması veglobal bir değişkene atanmasıdır Artık bizler Delphi tarafında TWebBrowserrsquoın IHTMLWindow2interfacersquoi uumlzerinden bu sınıf nesnesine erişebilir ve istediğimiz gibi kullanabiliriz

Goumlrduumlğuumlnuumlz gibi Delphi uumlzerinden JavaScriptrsquoe ait olan metodlara ve sınıflara erişebildikAcaba JavaScript Delphi uumlzerinde tanımlı olan sınıf ve metodlara erişebilir mi

Bu sorunun cevabı da evet Lacirckin biraz daha karmaşık bir mekanizmaya sahip MSDN helpuumlzerinden yaptığım araştırmada JavaScriptrsquoin harici dillere erişimi sağlayabilmesi iccedilinTWebBrowserrsquoın bazı interfacersquoleri implemente etmesi gerektiğini oumlğrendim Bu interfacersquolerIDocHostUIHandler IDocHostUIHandler2 interfacersquoleri Bu interfacersquolerin pek ccedilok metodumevcut Bu metodları burada paylaşmayı duumlşuumlnmuumlyorum ancak bu interfacersquolerin tanımlandığı

Absolute API Byte Arrays Class Reference

COM CreateDesktop CreateProcess

CreateRemoteThread CreateToolHelp32SnapShotDTS EnumDesktopProc EnumDesktops FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoHacking Inheritance Interface JavaScriptMethod Pointer Module32First Module32Next

OpenDesktop Persistance Pointer Procedure

Pointer Process Process32First Process32NextReqursion RTTI SetProcessWorkingSetSize SQLServer Sw itchDesktop TerminateProcess

Thread Untyped Parameters VirtualAllocEx

VirtualFreeEx WaitForSingleObjectWriteProcessMemory

Delphi About

Auto Select All The Text For TCustomEdit OnMouse Click 29 Haziran 2010Memory Leak Notification in Delphi - ReportMemory Leak on Program Exit 27 Haziran2010PCRE Workbench - Regular Expression TestTool - Source Code Delphi Application 22Haziran 2010Deleting Dataset Records In a Loop - PollResults - Why All Records Are Not Deleted 21Haziran 2010Force TListViews Edit Mode using a KeyboardShortcut 17 Haziran 2010Implementing On Item Click Double Click forDelphis TListView control 16 Haziran 2010Run Your Delphi Application in Full Screen -Implement F11 - Full Screen 14 Haziran 2010

394041424344

45

46

47484950

51525354555657585960

61

626364

65

sScript = ScriptStartSection + Enter +JscriptShowMessage+ Enter +JscriptClass + Enter +

ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION [rfReplaceAll])

sHTML = StringReplace(sHTML SCRIPTSECTION sScript [rfReplaceAll])

sHTML = StringReplace(sHTML BODYSECTION Delphive JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE do

ApplicationProcessMessagesend procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)

WinexecScript(PersonSetYasi(18) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)end

PDFmyURLcom

dosyayı makalenin sonunda indirebilmeniz accedilısından ekleyeceğim

IDocHostUIHandler ve IDocHostUIHandler2 interfacelerinin tanım dosyası hazırlandıktan sonraTWebBrowser sınıfımızın IDocHostUIHandler interfacersquoini desteklemesini sağlamamızgerekiyor Tanımlamamız aşağıdaki şekildeki gibi goumlruumlnecek

Implement F11 - Full Screen 14 Haziran 2010Displaying Enumerated Properties in aSelectable List - Run-Time Enum Selection inDelphi 10 Haziran 2010How Do You Delete Dataset Records In aLoop 08 Haziran 2010Display Custom Hints for Status Bar Panels 07Haziran 2010

Sık Ziyaret Edilenler

Sayfa Home(16059)

Delphi ve Google Maps API(4132)

Delphi ve Google Maps API(1976)

Nedir bu Threadrsquolerden ccedilektiğimiz(1444)

Delphi amp Animated Flash Charts(Fusion Charts)(1179)

Delphi amp JavaScript Kardeşliği(936)

Delphi 2010 (Weaver) ve TValue(918)

Derinlemesine Threading(1)(886)

Derinlemesine Threading(2)(695)

Win32 amp Net(Delphi-gtC)(617)

Kategori Delphi(613)

Bir Kiosk ve CreateDesktop macerası(568)

Sayfa Hakkında

01020304050607

08

09

10

11

12

1314

15

16

1718

1920

21

2223

24

2526272829

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget out

ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw UINT)

HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer) HResult

stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINT constpcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResult stdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

PDFmyURLcom

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 5: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

zaman bilgisini goumlsteren kuumlccediluumlk bir dialog kutusu ccedilıkartacaktır Oumlyle zamanlar gelirkiJavaScript iccedilinde bazı nesneleri oluşturur ve kullanırız Bu nesneler bazen kendi yazdığımızJavaScript sınıfları olabileceği gibi bazen de 3primeuumlncuuml parti yazılımların ActiveX denetimleriolabilir Fusion Charts buna bir oumlrnek Yada Flash nesneleri başka bir oumlrnek

Pek i biz JavaScript iccedilinde oluşturduğumuz bu nesnelere Delphi altından nasıl erişeceğiz Delphi iccedilinde nesnelerin propertyrsquolerine erişebilsek bazı metodlarını ccedilalıştırabilsek ne guumlzelolurdu dediğinizi duyar gibiyim Onun iccedilinde aşağıdaki youmlntemi kullanacağız

Ziyaretccedili Bilgileri

Ziyaret 5 12073

Beğenilenler

Delphi 2010 (Weaver) ve TValue - 14 votesDerinlemesine Threading(3) - 13 votesDerinlemesine Threading(2) - 6 votesDerinlemesine Threading(1) - 6 votesYeni Veri Tipleri ve Operator Overloading - 4votesWin32 amp Net(Delphi-gtC) - 4 votesDelphi ve Google Maps API - 3 votesTThreadWaitFor Bug - 3 votesBITS(Background Intelligent Transfer Service)ile sessiz sedasız download ) - 3 votesBir Kiosk ve CreateDesktop macerası - 3votes

Meta

GirişYazılar RSSYorumlar RSSWordPressorg

Etiketler-Liste

010203

040506070809101112131415161718

19202122232425262728293031

32333435363738

constJScriptShowMessage =

function ShowMessage(Message) + Enter+

+ Enter +alert(Message) + Enter +

JScriptClass = function TPerson(Adi Yasi) + Enter + + Enter +

var fAdi = Adi + Enter +var fYasi = Yasi + Enter +thisSetAdi = SetAdi + Enter +thisSetYasi = SetYasi + Enter +thisToString = ToString + Enter +

function ToString() + Enter + + Enter + return fAdi + + 39 + + 39

+ + fYasi + Enter + + Enter +

function SetAdi( Value ) + Enter + + Enter +

fAdi = Value + Enter + + Enter +

function SetYasi( Value ) + Enter + + Enter +

fYasi = Value + Enter + + Enter +

+ Enter + var Person = new TPerson( + 39 +

Tuğrul HELVACI + 39 + 34) procedure TfrmJavaScriptButton1Click(Sender TObject)var

sHTMLsScript String

beginsHTML = HTML

PDFmyURLcom

Bu oumlrneğimizin bir oumlncekinden tek farkı TPerson isminde bir JavaScript sınıfına sahip olması vebu sınıfın metodlarının ccedilalıştırılıyor olmasıdır Buradaki en can alıcı nokta TPerson isimliJavaScript sınıfının bir oumlrneğinin var Person = new TPerson() biccediliminde oluşturulması veglobal bir değişkene atanmasıdır Artık bizler Delphi tarafında TWebBrowserrsquoın IHTMLWindow2interfacersquoi uumlzerinden bu sınıf nesnesine erişebilir ve istediğimiz gibi kullanabiliriz

Goumlrduumlğuumlnuumlz gibi Delphi uumlzerinden JavaScriptrsquoe ait olan metodlara ve sınıflara erişebildikAcaba JavaScript Delphi uumlzerinde tanımlı olan sınıf ve metodlara erişebilir mi

Bu sorunun cevabı da evet Lacirckin biraz daha karmaşık bir mekanizmaya sahip MSDN helpuumlzerinden yaptığım araştırmada JavaScriptrsquoin harici dillere erişimi sağlayabilmesi iccedilinTWebBrowserrsquoın bazı interfacersquoleri implemente etmesi gerektiğini oumlğrendim Bu interfacersquolerIDocHostUIHandler IDocHostUIHandler2 interfacersquoleri Bu interfacersquolerin pek ccedilok metodumevcut Bu metodları burada paylaşmayı duumlşuumlnmuumlyorum ancak bu interfacersquolerin tanımlandığı

Absolute API Byte Arrays Class Reference

COM CreateDesktop CreateProcess

CreateRemoteThread CreateToolHelp32SnapShotDTS EnumDesktopProc EnumDesktops FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoHacking Inheritance Interface JavaScriptMethod Pointer Module32First Module32Next

OpenDesktop Persistance Pointer Procedure

Pointer Process Process32First Process32NextReqursion RTTI SetProcessWorkingSetSize SQLServer Sw itchDesktop TerminateProcess

Thread Untyped Parameters VirtualAllocEx

VirtualFreeEx WaitForSingleObjectWriteProcessMemory

Delphi About

Auto Select All The Text For TCustomEdit OnMouse Click 29 Haziran 2010Memory Leak Notification in Delphi - ReportMemory Leak on Program Exit 27 Haziran2010PCRE Workbench - Regular Expression TestTool - Source Code Delphi Application 22Haziran 2010Deleting Dataset Records In a Loop - PollResults - Why All Records Are Not Deleted 21Haziran 2010Force TListViews Edit Mode using a KeyboardShortcut 17 Haziran 2010Implementing On Item Click Double Click forDelphis TListView control 16 Haziran 2010Run Your Delphi Application in Full Screen -Implement F11 - Full Screen 14 Haziran 2010

394041424344

45

46

47484950

51525354555657585960

61

626364

65

sScript = ScriptStartSection + Enter +JscriptShowMessage+ Enter +JscriptClass + Enter +

ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION [rfReplaceAll])

sHTML = StringReplace(sHTML SCRIPTSECTION sScript [rfReplaceAll])

sHTML = StringReplace(sHTML BODYSECTION Delphive JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE do

ApplicationProcessMessagesend procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)

WinexecScript(PersonSetYasi(18) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)end

PDFmyURLcom

dosyayı makalenin sonunda indirebilmeniz accedilısından ekleyeceğim

IDocHostUIHandler ve IDocHostUIHandler2 interfacelerinin tanım dosyası hazırlandıktan sonraTWebBrowser sınıfımızın IDocHostUIHandler interfacersquoini desteklemesini sağlamamızgerekiyor Tanımlamamız aşağıdaki şekildeki gibi goumlruumlnecek

Implement F11 - Full Screen 14 Haziran 2010Displaying Enumerated Properties in aSelectable List - Run-Time Enum Selection inDelphi 10 Haziran 2010How Do You Delete Dataset Records In aLoop 08 Haziran 2010Display Custom Hints for Status Bar Panels 07Haziran 2010

Sık Ziyaret Edilenler

Sayfa Home(16059)

Delphi ve Google Maps API(4132)

Delphi ve Google Maps API(1976)

Nedir bu Threadrsquolerden ccedilektiğimiz(1444)

Delphi amp Animated Flash Charts(Fusion Charts)(1179)

Delphi amp JavaScript Kardeşliği(936)

Delphi 2010 (Weaver) ve TValue(918)

Derinlemesine Threading(1)(886)

Derinlemesine Threading(2)(695)

Win32 amp Net(Delphi-gtC)(617)

Kategori Delphi(613)

Bir Kiosk ve CreateDesktop macerası(568)

Sayfa Hakkında

01020304050607

08

09

10

11

12

1314

15

16

1718

1920

21

2223

24

2526272829

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget out

ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw UINT)

HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer) HResult

stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINT constpcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResult stdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

PDFmyURLcom

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 6: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

Bu oumlrneğimizin bir oumlncekinden tek farkı TPerson isminde bir JavaScript sınıfına sahip olması vebu sınıfın metodlarının ccedilalıştırılıyor olmasıdır Buradaki en can alıcı nokta TPerson isimliJavaScript sınıfının bir oumlrneğinin var Person = new TPerson() biccediliminde oluşturulması veglobal bir değişkene atanmasıdır Artık bizler Delphi tarafında TWebBrowserrsquoın IHTMLWindow2interfacersquoi uumlzerinden bu sınıf nesnesine erişebilir ve istediğimiz gibi kullanabiliriz

Goumlrduumlğuumlnuumlz gibi Delphi uumlzerinden JavaScriptrsquoe ait olan metodlara ve sınıflara erişebildikAcaba JavaScript Delphi uumlzerinde tanımlı olan sınıf ve metodlara erişebilir mi

Bu sorunun cevabı da evet Lacirckin biraz daha karmaşık bir mekanizmaya sahip MSDN helpuumlzerinden yaptığım araştırmada JavaScriptrsquoin harici dillere erişimi sağlayabilmesi iccedilinTWebBrowserrsquoın bazı interfacersquoleri implemente etmesi gerektiğini oumlğrendim Bu interfacersquolerIDocHostUIHandler IDocHostUIHandler2 interfacersquoleri Bu interfacersquolerin pek ccedilok metodumevcut Bu metodları burada paylaşmayı duumlşuumlnmuumlyorum ancak bu interfacersquolerin tanımlandığı

Absolute API Byte Arrays Class Reference

COM CreateDesktop CreateProcess

CreateRemoteThread CreateToolHelp32SnapShotDTS EnumDesktopProc EnumDesktops FunctionPointer GetCurrentProcess GetIconInfo GetKeyStateGetLastInputInfo GetProcessMemoryInfo GetStartupInfoHacking Inheritance Interface JavaScriptMethod Pointer Module32First Module32Next

OpenDesktop Persistance Pointer Procedure

Pointer Process Process32First Process32NextReqursion RTTI SetProcessWorkingSetSize SQLServer Sw itchDesktop TerminateProcess

Thread Untyped Parameters VirtualAllocEx

VirtualFreeEx WaitForSingleObjectWriteProcessMemory

Delphi About

Auto Select All The Text For TCustomEdit OnMouse Click 29 Haziran 2010Memory Leak Notification in Delphi - ReportMemory Leak on Program Exit 27 Haziran2010PCRE Workbench - Regular Expression TestTool - Source Code Delphi Application 22Haziran 2010Deleting Dataset Records In a Loop - PollResults - Why All Records Are Not Deleted 21Haziran 2010Force TListViews Edit Mode using a KeyboardShortcut 17 Haziran 2010Implementing On Item Click Double Click forDelphis TListView control 16 Haziran 2010Run Your Delphi Application in Full Screen -Implement F11 - Full Screen 14 Haziran 2010

394041424344

45

46

47484950

51525354555657585960

61

626364

65

sScript = ScriptStartSection + Enter +JscriptShowMessage+ Enter +JscriptClass + Enter +

ScriptEndSection

sHTML = StringReplace(sHTML HEADSECTION [rfReplaceAll])

sHTML = StringReplace(sHTML SCRIPTSECTION sScript [rfReplaceAll])

sHTML = StringReplace(sHTML BODYSECTION Delphive JavaScript [rfReplaceAll])

LoadHTML(wBrowser sHTML)

while wBrowserReadyState lt READYSTATE_INTERACTIVE do

ApplicationProcessMessagesend procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)

WinexecScript(PersonSetYasi(18) JavaScript)WinexecScript(ShowMessage(PersonToString())

JavaScript)end

PDFmyURLcom

dosyayı makalenin sonunda indirebilmeniz accedilısından ekleyeceğim

IDocHostUIHandler ve IDocHostUIHandler2 interfacelerinin tanım dosyası hazırlandıktan sonraTWebBrowser sınıfımızın IDocHostUIHandler interfacersquoini desteklemesini sağlamamızgerekiyor Tanımlamamız aşağıdaki şekildeki gibi goumlruumlnecek

Implement F11 - Full Screen 14 Haziran 2010Displaying Enumerated Properties in aSelectable List - Run-Time Enum Selection inDelphi 10 Haziran 2010How Do You Delete Dataset Records In aLoop 08 Haziran 2010Display Custom Hints for Status Bar Panels 07Haziran 2010

Sık Ziyaret Edilenler

Sayfa Home(16059)

Delphi ve Google Maps API(4132)

Delphi ve Google Maps API(1976)

Nedir bu Threadrsquolerden ccedilektiğimiz(1444)

Delphi amp Animated Flash Charts(Fusion Charts)(1179)

Delphi amp JavaScript Kardeşliği(936)

Delphi 2010 (Weaver) ve TValue(918)

Derinlemesine Threading(1)(886)

Derinlemesine Threading(2)(695)

Win32 amp Net(Delphi-gtC)(617)

Kategori Delphi(613)

Bir Kiosk ve CreateDesktop macerası(568)

Sayfa Hakkında

01020304050607

08

09

10

11

12

1314

15

16

1718

1920

21

2223

24

2526272829

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget out

ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw UINT)

HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer) HResult

stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINT constpcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResult stdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

PDFmyURLcom

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 7: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

dosyayı makalenin sonunda indirebilmeniz accedilısından ekleyeceğim

IDocHostUIHandler ve IDocHostUIHandler2 interfacelerinin tanım dosyası hazırlandıktan sonraTWebBrowser sınıfımızın IDocHostUIHandler interfacersquoini desteklemesini sağlamamızgerekiyor Tanımlamamız aşağıdaki şekildeki gibi goumlruumlnecek

Implement F11 - Full Screen 14 Haziran 2010Displaying Enumerated Properties in aSelectable List - Run-Time Enum Selection inDelphi 10 Haziran 2010How Do You Delete Dataset Records In aLoop 08 Haziran 2010Display Custom Hints for Status Bar Panels 07Haziran 2010

Sık Ziyaret Edilenler

Sayfa Home(16059)

Delphi ve Google Maps API(4132)

Delphi ve Google Maps API(1976)

Nedir bu Threadrsquolerden ccedilektiğimiz(1444)

Delphi amp Animated Flash Charts(Fusion Charts)(1179)

Delphi amp JavaScript Kardeşliği(936)

Delphi 2010 (Weaver) ve TValue(918)

Derinlemesine Threading(1)(886)

Derinlemesine Threading(2)(695)

Win32 amp Net(Delphi-gtC)(617)

Kategori Delphi(613)

Bir Kiosk ve CreateDesktop macerası(568)

Sayfa Hakkında

01020304050607

08

09

10

11

12

1314

15

16

1718

1920

21

2223

24

2526272829

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget out

ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw UINT)

HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer) HResult

stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINT constpcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResult stdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

PDFmyURLcom

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 8: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

Yukarıda yeni tanımı bulunan TWebBrowser artık IDocHostUIHandler interfacersquoini implementeetmiştirNot Tanım satırımızda TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)şeklinde bir yazım tarzı goumlrmekteyiz Bu tanım tuumlruumlne interpose adı verilir Delphirsquode mevcut birsınıfın genişletilebilmesi yapısının değiştirilebilmesi adına yeniden tanımına muumlsaade edilirTıpkı Net terminolojisindeki helper sınıflar gibi

TWebBrowser sınıfımızın implemente ettiği interfacersquoin bizim iccedilin en oumlnemli metoduGetExternal metodudur Bu metod haricindeki hiccedil bir metoda şu an iccedilin ihtiyacımız yok Busebep ile tuumlm metodların iccediline E_NOTIMPL yani implemente etmeyeceğiz anlamına gelensabiti doumlnduumlrecek kodu yazıyoruz GetExternal fonksiyonu JavaScriptrsquoin harici uygulamalarlahaberleşebilmesi adına IDispatch arabirimini destekleyen bir parametre alır Bu parametreyegeccedililmesi gereken nesne sınıfının IDispatch interfacersquoini implemente etmesi gereklidir Bununiccedilib ObjComAutopas unitinde tanımlı olan TObjectDispatch sınıfı kullanılabilir

COM programlamanın karmaşıklığı benim kafamı karıştırdığı gibi eminim sizin de kafanızıkarıştırmıştır Bu sebeple biraz da kod oumlrneği goumlrerek ilerlemek sanırım hepimize biraz nefesaldıracaktır

(563)TThreadWaitFor Bug

(540)Delphi 2010 (Weaver) ve TValue

(530)

Oylama

Sitedeki makaleleri yararlı buluyor musunuz

Evet yararlı ama yetersiz

Evet son derece yararlı

Evet muumlkemmel

Hayır yararlı değil

Hayır hem yararlı değil hem de yetersiz

Hayır rezalet

Vote

View Results

Delphinin hangi suumlruumlmuumlnuuml kullanıyorsunuz

Delphi 5 yada oumlncesi

Delphi 6

Delphi 7

Delphi 8

Delphi 2005

Delphi 2006

001002003004005006007

008

009

010

011

012

013014

015

016

017018

019

TWebBrowser = class(SHDocVwTWebBrowser IDocHostUIHandler)private

function GetHTMLWindow2 IHTMLWindow2function GetDocument2 IHTMLDocument2

protected IDocHostUIHandler function EnableModeless(fEnable Integer) HResult

stdcallfunction FilterDataObject(const pDO IDataObject out

ppDORet IDataObject) HResult stdcallfunction GetDropTarget(const pDropTarget IDropTarget

out ppDropTarget IDropTarget) HResult stdcallfunction GetExternal(out ppDispatch IDispatch) HResult

stdcallfunction GetHostInfo(var pInfo _DOCHOSTUIINFO) HResult

stdcallfunction GetOptionKeyPath(out pchKey PWideChar dw

UINT) HResult stdcallfunction HideUI HResult stdcallfunction OnDocWindowActivate(fActivate Integer)

HResult stdcallfunction OnFrameWindowActivate(fActivate Integer)

HResult stdcallfunction ResizeBorder(var prcBorder tagRECT const

pUIWindow IOleInPlaceUIWindowfRameWindow Integer) HResult stdcall

function ShowContextMenu(dwID UINT ppt PtagPOINTconst pcmdtReserved IUnknownconst pdispReserved IDispatch) HResult stdcall

PDFmyURLcom

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 9: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

Delphi 2007

Delphi 2009

Delphi 2010

Vote

View Results

020

021

022023

024

025026027028029030031032033034035036037038

039040041042043044045046047048

049050051052053054055056057058059060061062

function ShowUI(dwID UINT const pActiveObjectIOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult stdcall

function TranslateAccelerator(var lpmsg tagMSG varpguidCmdGroup TGUID nCmdID UINT) HResult stdcall

function TranslateUrl(dwTranslate UINT pchURLInPWideChar out ppchURLOut PWideChar) HResultstdcall

function UpdateUI HResult stdcallpublic

property Document2 IHTMLDocument2 read GetDocument2property HTMLWindow2 IHTMLWindow2 read GetHTMLWindow2

end

TApplicationWrapper = class(TObjectWrapper)private

function GetApplication TApplicationfunction GetCaption stringprocedure SetCaption(S string)

publishedproperty Application TApplication read GetApplicationproperty Caption string read GetCaption write

SetCaptionend

TWebBrowser function TWebBrowserEnableModeless(fEnable Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserFilterDataObject(const pDO IDataObject

out ppDORet IDataObject) HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetDocument2 IHTMLDocument2begin

Supports(Document IHTMLDocument2 Result)end

PDFmyURLcom

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 10: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

063064

065066067068069070

071072073074075076077078079

080081082083084085086087088089

090091092093094095096097098099

100101102103104

105106

function TWebBrowserGetDropTarget(const pDropTarget

IDropTargetout ppDropTarget IDropTarget) HResult

beginResult = E_NOTIMPL

end function TWebBrowserGetExternal(out ppDispatch IDispatch)

HResultvar

W TApplicationWrapperbegin

W = TApplicationWrapperConnect(FormsApplication)ppDispatch = TAutoObjectDispatchCreate(W) as IDispatchResult = S_OK

end function TWebBrowserGetHostInfo(var pInfo _DOCHOSTUIINFO)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserGetHTMLWindow2 IHTMLWindow2begin

Result = Document2parentWindowend function TWebBrowserGetOptionKeyPath(out pchKey PWideChar

dw UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserHideUI HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnDocWindowActivate(fActivate Integer)

HResultbegin

Result = E_NOTIMPLend function TWebBrowserOnFrameWindowActivate(fActivate

Integer) HResultbegin

Result = E_NOTIMPL PDFmyURLcom

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 11: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

107108109110

111112113114115

116

117118119120121122123

124125126127128129130131132133134135

136137138139140141142143144145146147148149150151

end function TWebBrowserResizeBorder(var prcBorder tagRECT

const pUIWindow IOleInPlaceUIWindow fRameWindowInteger) HResult

beginResult = E_NOTIMPL

end function TWebBrowserShowContextMenu(dwID UINT ppt

PtagPOINTconst pcmdtReserved IInterface const pdispReserved

IDispatch) HResultbegin

Result = E_NOTIMPLend function TWebBrowserShowUI(dwID UINT

const pActiveObject IOleInPlaceActiveObjectconst pCommandTarget IOleCommandTarget const pFrame

IOleInPlaceFrameconst pDoc IOleInPlaceUIWindow) HResult

beginResult = E_NOTIMPL

end function TWebBrowserTranslateAccelerator(var lpmsg tagMSG

var pguidCmdGroup TGUID nCmdID UINT) HResultbegin

Result = E_NOTIMPLend function TWebBrowserTranslateUrl(dwTranslate UINT

pchURLIn PWideCharout ppchURLOut PWideChar) HResult

beginResult = E_NOTIMPL

end function TWebBrowserUpdateUI HResultbegin

Result = E_NOTIMPLend TApplicationWrapper function TApplicationWrapperGetApplication TApplicationbegin

Result = FormsApplicationend

PDFmyURLcom

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 12: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

Yukarıdaki kodda JavaScriptrsquoin ulaşmasını istediğimiz sınıfın TApplicationWrapper olduğunuTWebBrowserrsquoın GetExternal metodunda soumlyluumlyoruz Bu soumlylem bize JavaScript iccedilindeTApplicationWrapper sınıfının tuumlm public propertyrsquolerine ve metodlarına erişim hakkısağlayacaktır Artık JavaScript iccedilinde TApplicationWrapper sınıfını istediğimiz gibikullanabileceğiz Ancak sizin de goumlzlemlediğiniz gibi TAutoObjectDispatch isimli bir başkasınıf da mevcut GetExternal metodunun iccedilinde Bu sınıf Delphi sınıflarından değildir Bu vebenzer sınıfların tanımlandığı dosyayı da indirebilmeniz iccedilin makalenin en sonunaekleyeceğim

Bu sınıfın var olmasının nedeni IDispatch arabirimini destekleyen bir yapıya sahip olmamızıngerekliliğidir Hatırlarsanız bir kaccedil paragraf oumlnce ObjComAutopas dosyası iccedilindekiTObjectDispatch isimli sınıfın IDispatch arabirimini bizim iccedilin implemente ettiğini soumlylemiştikJavaScript dış duumlnyadaki(oumlrneğimizde Delphi) ortamlara erişim sağlayacağı zaman externalsoumlz dizimini kullanır Oumlrneğin externalCaption = lsquoSelamrsquo gibi external direktifi ileerişeceği nesnenin Caption isimli bir propertyrsquosinin olup olmadığının kontroluumlnuumln yapılmasıgerekir Yada externalShowMessage(lsquoSelamrsquo) ccedilağrısında olduğu gibi bir metod ccedilağrımınınDelphi tarafında bulunabiliyor olması gerekir Gerek metod gerekse de property ccedilağrımlarınınbulunamaması bir hata ile sonuccedillanacaktır

TWebBrowserrsquoın GetExternal metoduna parametre olarak geccediltiğimiz TApplicationWrapperisimli sınıfın kodlarının iccedilinde TObjectDispatchrsquoin metod ve property aramak iccedilin gerekli olanmetodlarının yazılması gerekmektedir Bu metodlar yazılsın ki JavaScript tarafında ccedilağrımıyapılan property yada metodların Delphi tarafında karşılıkları bulunabilsin ve işletilebilsinBunun iccedilin TObjectDispatch sınıfından tuumlreyen ve bu karmaşık ccedilağrımları bizden gizleyen birbaşka unit daha var Daha oumlnce dediğim gibi o unitrsquoi de sizinle paylaşacağım

Bu noktaya kadar oumlzetlememiz gerekirse eğer Delphirsquoden JavaScriptrsquoe ulaşmak ve gerek sınıfgerekse de herhangi bir metodu ccedilalıştırmak bizim iccedilin son derece kolay olmuştu AncakJavaScriptrsquoin Delphi sınıflarına erişmesi bir o kadar da zor goumlruumlnduuml Aslında kodu indiripincelediğinizde pek de zor olmadığını goumlreceksiniz lacirckin COM programlamanın karmaşıkyapısından muumltevellit anlatabilmek ve anlayabilmek haliyle biraz zor oluyor

Son kod oumlrneğimizi de verip makalemizi burada neticelendirelim

152153154155156157158159160161

function TApplicationWrapperGetCaption stringbegin

Result = frmJavaScriptCaptionend procedure TApplicationWrapperSetCaption(S string)begin

frmJavaScriptCaption = Send

010203

constJScriptShowMessage =

function ShowMessage(Message) + Enter

PDFmyURLcom

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 13: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

2 Comments

sadettinpolat on Haziran 2nd 2009 tugrul hocam hizina yetismek mumkun degil

biz bi makaleyi hazmedemeden sen bir digerini yayinliyorsun bu

Bu oumlrneğimizdeki tek fark JScriptShowMessage sabitinin iccedilinde externalCaption atamasınınyapılmasıdır Bu atama ile TWebBrowser nesnemiz kendi uumlzerinde tanımladığımızGetExternal metodunu ccedilalıştıracak boumlylece TApplicationWrapper sınıfına erişebilecek veformumuzun caption bilgisi guumlncellenecektir

Oumlrnek uygulamamızı buradan indirebilirsiniz

Not Oumlrneğimiz Delphi 2009 ile geliştirilmiştir

Saygılar sevgiler

[Translate]

040506

07080910111213141516

17

+ + Enter +

alert(Message) + Enter +externalCaption = + 39 + Selam

Delphi nasılsın ben JavaScriptltimgsrc=httpwwwtugrulhelvacicomwp-includesimagessmiliesicon_winkgif alt=) class=wp-smileygt +39 + + Enter +

procedure TfrmJavaScriptButton2Click(Sender TObject)var

Doc IHTMLDocument2Win IHTMLWindow2

beginDoc = wBrowserDocument as IHTMLDocument2Win = DocparentWindowWinexecScript(ShowMessage( + 39+ TimeToStr(Time) + 39

+ ) JavaScript)end

PDFmyURLcom

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 14: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

teknikle biz google mapse programimiz icinden takla bile attiririz

valla tesekkurlerhellip

Tuğrul HELVACI on Haziran 2nd 2009 Rica ederim uumlstadım vazifemiz Google Maps konusunda

haklısın yakın bir zamanda onunla ilgili de makale yazmayıduumlşuumlnuumlyordum O yuumlzden JavaScript Delphi entegrasyonuna

girmiştim

Senden de bir şey kaccedilmıyor maaşallah

Name (required)

Mail (required)

Website

Share your comment

PDFmyURLcom

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom

Page 15: Delphi & JavaScript Kardeşliği | Delphi Programming · 2010. 7. 1. · Delphi Programming There are only 10 types of people in the world: Those who understand binary, and those

Son YorumlarYorumunuza teşekkuumlrler Aslında operatoumlr aşırıyuumlklemenin sınıf larda pek bir avantaj by TuğrulHELVACI

Merhaba Ben ilk olarak merakımdan dolayı uğraştığımC++ dilinde goumlrmuumlştuumlm Operatoumlr by Zafer Ccedilelenk

Merhaba makaleyi yazdığım zaman kodlarda bir sorunyoktu Belki Google Mapsde bir şeyler by TuğrulHELVACI

Merhaba Kodlarda bir sorun mu var yoksa ggogle buhizmeti durdurdu mu Sadece boş bir by ahmet

Programcı arkadaşların daha fazla takıldığı bir yerdeyazsa idiniz mesajınızı daha by Tuğrul HELVACI

Tuğrul Bey Yeri Burasımıdır Bilmiyorum O nedenlehata ediyorsam oumlzuumlr dilerm bir iş ilanı by geyikben

Teşekkuumlrler ) by Tuğrul HELVACI

Yeni EklenenlerYeni Veri Tipleri ve Operator Overloading

Interface Nedir Nerelerde ve Neden Kullanırız

Derinlemesine Threading(3)

SQLrsquode Benzerlik Algoritmalarıhellip

Full Text Searchinghellip

Delphi 2010 (Weaver) ve TValue

Derinlemesine Threading(2)

LinklerBir Tuumlrkccedile Sevdalısı - Taha EKREM

Delphi Tuumlrkiye Forum

Guumlrcan OumlZTUumlRK - Guumlrcan OumlZTUumlRK

MFatih KUumlCcedilUumlKKELEPCcedilE

Memik YANIK Kişisel

Memik YANIKrsquoın Guumlnluumlğuuml

Nick Hodges

Sinan BARAN

Copyright copy 2009 Delphi Programming Pow ered by WordPress | Increase Traff ic w ith Traff icWhirl

PDFmyURLcom