Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
WebBrowserda yeni eklenen nesnenin Click eventini çalıştırma
#1
Selamlar

DocumentComplete içerisinde bir table'a yeni bir kolon eklemek ve kolon içeriğinede bir button eklemek istiyorum
Ekleme sırasında butona bir deger atanacak ve butona tıklandığında ise bu değere göre yeni delphi tarafında bir form açılıp bazı bilgiler gösterilecek.

bazı örneklere bakarak aşağıdaki gibi butona basılınca script ile işlem yapabildim.
Fakat script değilde Browserın "WBBeforeNavigate" özelliğinden yararlanarak basılan butonu bulmaya kalkınca event hiç bir şekilde tetiklenmiyor
Acaba bu işi nasıl çözebilirim.

Teşekkürler


procedure TfrmWeb.WBDocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
var
 ovTable, ovTableDty: OleVariant;
 I, R, C : Integer;
begin
   Table := nil;
   Table := fn_HtmlFindTable( WebBrowser, 'TableX');
   ovTable := Table;
   if Table <> nil then
   begin
       for R := 1 to (ovTable.Rows.Length - 1) do
       begin
           ovTable.Rows.Item ( R ).InsertCell(10);
           ovTable.Rows.Item ( R ).Cells.Item(10).InnerHTML := '<TD><SPAN id=Button_' + IntToStr ( R ) + '</SPAN>'+
                                                                           '<input type="button" onmouseover="myFunction()" ' +
                                                                                 ' onclick="alert(' + #39 + 'clicked' + #39 + ')">'+
                                                                           '<script>'+
                                                                               'function myFunction() {document.getElementById("Button_' + XXXXXXXX + '").click();}'+
                                                                           '</script>'+
                                                                        '</TD>';
       end;
   end;
end;

Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#2
Çalışmama sebebi duruma göre değişir. Referans vermediğiniz için test edemeyiz belki ama ;

Aşağıda DelphiCan sitesine navigate edip, her tablo ilk stünuna bir ekleme yaparak buraya button kodu inject eden bir örnek yazıyorum. Site üzerinde eklenen butonlara basınca da görev yaptığını göreceksiniz.

Örnekte göreceğiniz gibi buton tıklamasını talebinizdeki gibi OnDocumentComplete'e koydum ki, tıklama otomatik gerçekleşsin. Bildiğiniz üzere bu kodu butona değil de direkt OnDocumentComplete de veya BitBtn değil de bir procedure / function olarak yazabilirsiniz ama tetiklendiği zamanı yakalayın diye bunu ayırdım. Gerektiğinde bir While döngüsü ile sayfanın tamamlandığını bekleyip öyle çalıştırırsanız sorun çözülecektir diye değerlendiriyorum. TABİ SORUYU DOĞRU ALGILAYABİLMİŞ İSEM..   Huh


Sorununuz aslında kod ekleyememe değil de henüz tablolar olgunlaşmadan eklemeye çalışmak olabilir ( dinamik web tabloları OnDocumentComplete'den biraz daha geç tamamlanır ).

procedure TForm1.BitBtn_DelphiCanClick(Sender: TObject);
begin
 WebBrowser1.Navigate( 'http://www.delphican.com/index.php');
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; const URL: OleVariant);
begin
 BitBtn_ButtonSutunEkleClick( BitBtn_ButtonSutunEkle );
end;

procedure TForm1.BitBtn_ButtonSutunEkleClick(Sender: TObject);
var
 ovTable,
 ovTableDty : OleVariant;
 j, R : Integer;
begin
 for j := 1 to WebBrowser1.OleObject.Document.all.tags('table').length-1 do
 begin
   ovTable   := WebBrowser1.OleObject.Document.all.tags('table').item(j);
   for R := 1 to (ovTable.Rows.Length - 1) do
   begin
     ovTable.Rows.Item ( R ).InsertCell(0);
     ovTable.Rows.Item ( R ).Cells.Item(0).InnerHTML := '<TD><SPAN id=Button_' + IntToStr ( R ) + '</SPAN>'+
                                                       '<input type="button" value="TIKLAYINIZ" onmouseover="myFunction()" ' +
                                                       ' onclick="alert(' + #39 + 'Butona Tıklandı!' + #39 + ')">'+
                                                       '<script>'+
                                                       'function myFunction() {document.getElementById("Button_' + 'ARMAN' + '").click();}'+
                                                       '</script>'+
                                                       '</TD>';
   end;
 end;
end;

Ekran_Al_nt_s_Delphi_Can.png
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#3
Mrmarman hocam emeğine sağlık, sizi tekrar görmek ne güzel . Pazar günüme ayrıca bir keyif kattıSmile)))
Cevapla
#4
Mrmarman hocam teşekkürler,
Bir kaç gündür projeden uzak kalmıştım, hafta sonu yeniden uğraşıyorum,
Sormak istediğim OnClick işleminde benim delphi içerisinde tanımladığım bir procedure'ü nasıl çağırabiliirm.
Click yapılan satırı bulup procedure parametre gönderip içinde bazı şeyler yapmaya çalışıyorum.
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#5
Merhaba.

WEB programcılığı hakkında yeterli bilgiye sahip olduğunuzu değerlendirerek :  Idea
Bir PHP hazırlayın, dilediğiniz ekstra fonksiyonları barındırsın. Bunu bir WEB server ortamına yerleştirin. 
VEYA  Delphi ile yazacağınız bir Win32 uygulamasını bir WEBServer haline dönüştürün, cevap direkt projenizden dönsün. (bkz. buraya örnek hazırlamıştım

WebBrowser ile navigate işleminizi yaptığınız sitenin HTML kodlarına bu başlıktaki gibi INJECT işlemini yaparken 
(a) Daha önce hazırladığını fonksiyonları barındıran PHP'yi gerekli parametreler ile değerlendirin.
(b) WebServer olarak çalışan EXE projenizin olduğu IP adresini referans alacak parametrleri barındıran şekilde değerlendirin.

şeklinde bir çözüm işinizi fazlasıyla görecek, baş vurduğunuz HTML sayfanın içeriği kullanıcılarınızın kendi verileriyle zenginleşecektir.

Başarılar.

Örnek :
procedure TForm1.BitBtn_DelphiCanClick(Sender: TObject);
var
 ovTable,
 ovTableDty : OleVariant;
 j, R : Integer;
begin
 WebBrowser1.Navigate( 'http://www.delphican.com/index.php');
 while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do begin
   Sleep(10);
   Application.ProcessMessages;
 end;

 j :=1;
 //for j := 1 to WebBrowser1.OleObject.Document.all.tags('table').length-1 do
 begin
   ovTable   := WebBrowser1.OleObject.Document.all.tags('table').item(j);
   r := 1;
   //for R := 1 to (ovTable.Rows.Length - 1) do
   begin
     ovTable.Rows.Item ( R ).InsertCell(0);
     ovTable.Rows.Item ( R ).Cells.Item(0).InnerHTML := '<iframe id="frame" src="http://armanlab.com/delphican/ip.php" scrolling="no"></iframe>';
   end;
 end;
end;

PHP Dosyası 
PHP Kod: (Select All)
<?php
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
 
   $ip $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
 
   $ip $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
 
   $ip $_SERVER['REMOTE_ADDR'];
}
 
 echo "IP Adresiniz :" $ip "<br />";
?>

rwbgeomewn1cel7aew5t.png
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  DBGRID yeni sütun ekle veri gir diğer sütundaki veriyi değiştir stevenskat 8 751 08-09-2023, Saat: 22:47
Son Yorum: m_ekici
  Yeni Bir Dil için Tavsiye KUNTAY 24 3.736 04-08-2023, Saat: 13:54
Son Yorum: Halil Han BADEM
  yeni kayıtta bildirim alma ercanskose 5 1.108 26-06-2023, Saat: 13:04
Son Yorum: ercanskose
  Yeni üye stevenskat 2 577 09-06-2023, Saat: 09:42
Son Yorum: RAD Coder
  Yeni Component Oluşturma yhackup 2 750 20-04-2023, Saat: 11:39
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi