Delphi Tip Dönüşümü Operatörü "as"

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen vkamadan »

Merhaba değerli üyeler ,
bugün bir sorunla karşılaştım ve doğru bildiğimi düşündüğüm bir konuda kendimi sorguladım beni aydınlatırsanız sevinirim.

ben aşağıdaki 2 farklı ifadenin de aynı anlamı taşıdığını düşünüyordum

Kod: Tümünü seç

IHtmlElement3( Element ).FireEvent('onchange',a);

Kod: Tümünü seç

( Element as IHtmlElement3).FireEvent('onchange',a);
kullanımı bana daha pratik geldiği için AS kullanmak gerine parantez kullanarak tip dönüşümü yapıyordum bugüne kadar bir sorun yaşamadım yukarıdaki kod örneklerinden alttaki çalışıyor üstteki uygulamanın geçersiz bir işlem yürütüp kapanmasına neden oluyor değerli yorumlarınızı bekliyorum.

iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen mrmarman »

Hiç sizin üstteki şekilde düşünmemiştim. Bir deneme yaptım çalıştı. Siz de deneyin...OleVariant olarak CAST edip oradan Fire ettim çalıştı. Ben checkbox koyduğumdan IHtmlElement olarak denedim.

Örnek :

Kod: Tümünü seç

OleVariant(IHtmlElement3(Element)).FireEvent('onchange');
Uyguladığım kod :

Kod: Tümünü seç

Var
  Doc     : IHtmlDocument3;
  Element : IHtmlElement;
begin
  Doc     := WebBrowser1.Document as IHTMLDocument3;
  Doc.QueryInterface(IHtmlDocument2, Element);
  Element := Doc.getElementById('change');
  if Element <> Nil then
  begin
    OleVariant(IHTMLElement(Element)).FireEvent('onchange');
  end;
Test için aşağıdaki HTML'yi oluşturup hostuma koyup denedim.

Kod: Tümünü seç

 <p> 
	<input type="checkbox" 
	onchange="document.getElementById('spDegistir').innerHTML = 'isaret Durumu: ' + this.checked;
	" id="change"> 
	<label for="change">OnChange olayi tetiklenecektir...</label> 
	<span id="spDegistir"></span>
</p>
Resim
Resim ....Resim
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen Lord_Ares »

Belki yeri değil ama , şu htmelement,IHtmlDocument3 gibi konularda türkçe kaynak hiç bulamadım. Her defasında yeni bir özelliğini görüyorum.İmkanı olan arkadaşlar varsa htmlparse işlemleri bu kadar revaçtayken forumda bunla ilgili makale paylaşırsalar çok yararlı olacağını düşünüyorum. Mesela yeni bir kullanım şekli daha görmüş oldum kodunuz da, ne işe yaradığını merak ettim araştırıyorum. Anlayışınız için teşekkür ediyorum
Buradaki FireEvent gibi :))

Kod: Tümünü seç

OleVariant(IHtmlElement3(Element)).FireEvent('onchange');
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen mrmarman »

Microsoft'un yaptıklarına akıl sır ermiyor ki, optimizasyon adına farklı seviyelerde DOM ( Document Object Model ) ile sayfa içerisindeki herhangi bir nesnenin özelliklerine (property) erişebilmek ve müdahale edebilmek (method) için birbiriyle örtüşen veya birbirinden taban tabana farklı olabilen tanımlar yapmışlar.

Örneğin şimdi baktım IHTMLElement'den kendisi dahil (8) tane var. Şöyle düşünüldüğünü hissediyorum;

- Birisiyle property'lere erişerek bilgi alabilmek ağırlıklı iken bir diğerinde bu property'lerin değerlerini durumlarını değiştirmeye yarıyor ya, işte iki işlem yapmayalım diye bazılarında ( her metodu veya property'yi içermemekle birlikte ) paket halinde sunmuşlar. Cep telefonu tarifesi çeşitlendirmesi gibi. Geliştirmeye çalıştıklarını görüyorum ama her yeni eklentiyi bir öncekine değil yeni bir oluşum olarak sunmuşlar. Yanındaki rakamı bir arttırmışlar. bkz. MSDN

- Tümüyle kendi fikrimdir, genellemek istemiyorum ama bunlarla ilgili makaleye gerek yok hocam, bulduğun yerde google edip kullanabilirsin. Öğrenilecek daha bir sürü şey var. :roll: Zaten matbu işlem bunlar. Çok kullandığım halde sorsan hangisi ne işe yarıyor MSDN'den bakmadan ezbere söyleyemem. Göz aşinalığı yetiyor inan ki... :oops:
Resim
Resim ....Resim
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen vkamadan »

Muharrem bey merhaba ,
cevabınız için teşekkürler ,
aslında sorun şuradan türedi ,
i.e 9 ve öncesinde sayfa içindeki framelerde yer alan "Document" OLeObject üzerinden erişildiğinde ana "Document" nesnesi ile aynı property ve metodlara sahip bir şekilde çalışabiliyordu, örn ;

Kod: Tümünü seç

WebBrowser.OleObject.Document.Frames.item(0).Document.GetElementById('id_Edit1').value:='abc';
Fakat i.e 10 ve üzerinde

Kod: Tümünü seç

WebBrowser.OleObject.Document.Frames.item(0).Document
frame içinde Document var ama OleVariant halindeyken örn GetElementById gibi temel bir metodu dahi destekmeyerek böyle bir fonksiyon yoktur şeklinde kırılmalar meydana getiriyordu, buna bağlı olarak doğrudan WebBrowser.OleObject üzerinden gitmeyerek MSHTML içindeki IHTMLDocument vb arayüzlerle ilerleyerek Frame lerin içinde yer alan elemanlara ulaşıp işlemleri browser sürümü gözetmeksizin sorunsuzca yapmayı düşündük, pekte sorun olmadı, sonra bir noktada Frame içindeki Frame de yer alan document e erişmek gerekti bu yöntemle eriştik diğer herşey sorunsuz çalışabilirken FireEvent in ilk mesajımda belirttiğim ilk kullanım şekilnde cast ederek kullandığımda program sonlandırılma düzeyinde patladı, 2nci kullanım şeklinde hiç sorun çıkmadı, mutlaka bir farklılık var sonucuna vardım sizlere tescilletmek istedim.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1316
Kayıt: 07 May 2009 10:42
Konum: İstanbul
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen SimaWB »

vkamadan yazdı:

Kod: Tümünü seç

IHtmlElement3( Element ).FireEvent('onchange',a);

Kod: Tümünü seç

( Element as IHtmlElement3).FireEvent('onchange',a);
İkincide bazen sorun yaşanması şöyle mantıklı olabilir:
İlk kullanımda Element'in tipi IHtmlElement3 olmasa bile, FireEvent fonksiyonuna sahipse uygulama sorunsuz çalışır.
Ama ikinci kullanımda Element'in tipi muhakkak IHtmlElement3 olmalıdır. Aksi durumda program "Invalid Type Cast" hatası verir.
There's no place like 127.0.0.1
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen vkamadan »

@SimaWb teşekkürler cevabın için ,
mesajınız bilgimi arttırdı fakat yaşadığım durum böyle bir şey değil, çünkü eğer yapı uymasa ilkinde patlama olurken 2nci de Type Cast hatasını almalıydım oysaki çalışıyor ilk kullanım şeklide 1nci seviye bir Frame içinde sorunsuz çalışıyor iç içe 2 frame olunca ilgili sorunu çıkartıyor. neyse en azından sayenizde 2nci yöntemin daha güvenilir olduğunu anlamış oldum.
iyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen esistem »

Acaba benmi yanlış düşünüyorum ama şöle bir durum var sanırım.
İlkinde ; IHtmlElement3 eğer Element ten türemiş ise FireEvent ı tetikle
ikincisinde ; eğer Element IHtmlElement3 tipindeyse FireEvent ı tetikle.
şu durumda eğer işlem doğru yapılmak isteniyorsa mecburen 2. şekilde kullanmak gerekir ki seçilen Element, IHtmlElement3 tipindeyse çalışmayı sürdürebilsin.
buda sanırım @simaWB nin açıklamasına uyuyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen mrmarman »

Delphi'deki mantıkla yaklaşınca Label olduğu halde Edit olarak cast edilen bir eşitlikte ola ki edit ise label'in text property'si şu olsun gibisinden; (ki label'in textni yok caption'u var)

Kod: Tümünü seç

TEdit(Label1). Text :=  'test' ;
dediğimizde çalışmaması ama hata da vermemesi gibi bir durumdan yola çıkarak burada altı çizilen buradaki konuda hata veriyor olmasıydı anladığım o.
Yoksa güvenli ya da değil, iş gören hangisi ise doğal olarak seçilecek teknik çalışanın lehine olacaktır illa ki.
Resim
Resim ....Resim
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen thelvaci »

Volkan bey, ilk kullanımınızda hard casting yapıyorsunuz. Bu durumda, Element isimli değişkeniniz casting yaptığınız interface'i implemente etmiyor olsa da siz öyleymiş gibi davranmasını istiyorsunuz. İkinci kullanımınızda ise, gizli bir Supports metodu ile Element isimli değişkenin ilgili interface'i implemente edip etmediği test edilir, etmiyor ise nil döner.
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen vkamadan »

thelvaci yazdı:Volkan bey, ilk kullanımınızda hard casting yapıyorsunuz. Bu durumda, Element isimli değişkeniniz casting yaptığınız interface'i implemente etmiyor olsa da siz öyleymiş gibi davranmasını istiyorsunuz. İkinci kullanımınızda ise, gizli bir Supports metodu ile Element isimli değişkenin ilgili interface'i implemente edip etmediği test edilir, etmiyor ise nil döner.
Tuğrul bey cevabınız için teşekkürler ,
evet çok önemli bir detaymış , fakat benim yaşadığım soruna dayanarak sanki "AS" yapısının sizin ifadenizle hard casting şeklinde kullandığında yapılar birbirine tam olarak uysa da farklı davranmasına sebep olabilecek farklılıkları da var gibi çünkü ilk mesajımda belirttiğim gibi aynı nesneyi aynı interface e hard cast ettiğimde çalışmazken "AS" ile cast ettiğimde çalışıyor galiba AS uymayan bazı şeyleri de uygunlaştırıyor gibi :)
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen mrmarman »

@vkamadan

Hata vermiyor veya çalışıyor derken, sonuç da alabiliyor musunuz? Yani atama sonucu değer yüklemesi yapıyor veya okuması yapıyor mu?

Nil dönüyor muymuş merak ettim.
Resim
Resim ....Resim
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen vkamadan »

Muammer bey merhaba ,
IHtmlElement3( Element ).FireEvent('onchange',a); dediğimde program çöküyor, windows tarafından sonlandırılıyor. AS ile kullandığımda ise sorunsuz çalışıyor, fakat ilk kullanım ilgili web sayfasının farklı seviyelerinde farklı nesneler için sorunsuz çalışıyor.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen mrmarman »

İfade edemedim sanırım.

Sayfadaki elementlerden atıyorum 3 nolu olanda çöktü diyelim, bu elemente odaklanıp diğer metodla işlem yaptığınızda bahsi geçen 3 nolu elementte bir değişiklik gözlemleyebiliyor musunuz? Yani diğer metod nil algılıyor ise hata vermiyor ama işlem de yapmayacaktır mihmalinde.
Resim
Resim ....Resim
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Re: Delphi Tip Dönüşümü Operatörü "as"

Mesaj gönderen vkamadan »

mrmarman yazdı:İfade edemedim sanırım.

Sayfadaki elementlerden atıyorum 3 nolu olanda çöktü diyelim, bu elemente odaklanıp diğer metodla işlem yaptığınızda bahsi geçen 3 nolu elementte bir değişiklik gözlemleyebiliyor musunuz? Yani diğer metod nil algılıyor ise hata vermiyor ama işlem de yapmayacaktır mihmalinde.
şöyle ifade etmeye çalışayım ,

sayfada id si "edtKimlikNo" olan bir INPUT tipinde element mevcut , IHTMLElement3(Element).Value := '2312312' dediğimde hatasız atamayı yapıyor hemen ardından IHTMLElement3(Element).FireEvent('onchange',a) diyerek olayını çağırdığımda program çöküyor, NIL olmuş olsa VALUE özelliğine değeri atamayacaktı bildiğiniz gibi, sonra aynı ID li element için AS operatörüyle atama yapıp FireEvent dediğimde hiç bir sorun çıkmadan hem atama hemde olayı çalıştırıyor. ayrıca IHTMLElement3 tipinde ara bir değişken tanımlayıp 2 türlü CAST işlemiyle aynıu ID li element için DEBUG modda NİL olmadığını gözlemledim.
Volkan KAMADAN
www.polisoft.com.tr
Cevapla