Tüm Platformlar için Hızlı Uygulama Geliştirme Kitabı... Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
webbrowser element erişim sorunu
#1
Merhaba arkadaşlar webbrowser sayesinde bir web sitesini dolduruyorum.
WebBrowser.Document.QueryInterface(IHTMLDocument3,doc) ;
  marka := doc.getElementById('Markalar');

      if marka <> nil then begin
        (marka as IHTMLSelectElement).value := '29';
        (marka as IHTMLElement3).FireEvent('onchange', v);
      end;
WebBrowser.OleObject.Document.getElementById('modeller').value:= '369';  //modeller
yukarıdaki kodda olduğu gibi markalar selected box ına ait onchange eventini tetkiliyorum. 
hemen bir altındaki modeller selected boxının içi seçilen markanın modelleri ile doluyor. 

Fakat ben model selected boxına içindeki değerlerden birini yukarıdaki kodun çalışırken atayamıyorum. 
Sayfa yüklemesini bitirdikten sonra baska bir butona aşağıdaki kodu yazdığımda atama yapıyor.
WebBrowser1.OleObject.Document.getElementById('modeller').value:= '369';
model selected boxı markalara bağlı dolduğundan yakalam işlemini yapamıyorum sanırım. Bir çözüm yolu gösterecek arkadaşların yardımını bekliyorum.
Cevapla
#2
Tahminim; siz marka'nın OnChange olayını tetikleyince, sayfada AJAX ile yükleme yapılıyor ve modeller dolduruluyor. Sizin bu doldurma olayının bitişini yakalamanız gerekiyor.
AJAX sorgusu sonucunda WebBrowser'ın OnDocumentComplete olayı tetiklenir. Bunu kontrol edebilirsiniz.
There's no place like 127.0.0.1
WWW
Cevapla
#3
benim konuya yakın bir durum bahsedilmiş Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol fakat ben neden yakalayamıyorum. 
Sizin dediğiniz gibi OnDocumentComplete olayına bakacağım. teşekkürler cevap için.

WebBrowser.ReadyState <> READYSTATE_COMPLETE do begin
kodlar bundan sonra çalışıyor. sayfa yüklendikten sonra alanlar doluyor. bu nedenle dediğiniz şekilde yakalayamam sanırım.
Cevapla
#4
hala bir sonuca ulaşamadım
Cevapla
#5
(19-09-2017, Saat: 16:51)CumaParlak Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olyukarıdaki kodda olduğu gibi markalar selected box ına ait onchange eventini tetkiliyorum. 
hemen bir altındaki modeller selected boxının içi seçilen markanın modelleri ile doluyor. 

Merhaba, Peki modeller dolarken ekranda bir bekliyor işareti, barı vs çıkıyor mu ?
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#6
Aşağıdaki linki inceler misin,

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Ayrıca aşağıdaki linkte de istemediğin kadar kaynak bulabilirsin;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Bununla birlikte şurada da pratik örnekler yer alıyor;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Mutlaka birisi işini görecektir.
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
Cevapla
#7
(20-09-2017, Saat: 09:20)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(19-09-2017, Saat: 16:51)CumaParlak Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Olyukarıdaki kodda olduğu gibi markalar selected box ına ait onchange eventini tetkiliyorum. 
hemen bir altındaki modeller selected boxının içi seçilen markanın modelleri ile doluyor. 

Merhaba, Peki modeller dolarken ekranda bir bekliyor işareti, barı vs çıkıyor mu ?

yok hayır anında alt kutucuk doluyor.

(20-09-2017, Saat: 10:45)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlAşağıdaki linki inceler misin,

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Ayrıca aşağıdaki linkte de istemediğin kadar kaynak bulabilirsin;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Bununla birlikte şurada da pratik örnekler yer alıyor;

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Mutlaka birisi işini görecektir.

evet inceledim ve incelemeye devam edeceğim.
Cevapla
#8
unit Unit5;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw;

type
 TForm5 = class(TForm)
   WebBrowser1: TWebBrowser;
   procedure waitTillLoad1;
   procedure waitTillLoad2;
   procedure WebBrowser1DocumentComplete(ASender: TObject;
     const pDisp: IDispatch; const URL: OleVariant);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form5: TForm5;
 load: boolean;

implementation

{$R *.dfm}

procedure TForm5.waitTillLoad1;
var
 waittime, counter: integer;
 loadStatus: cardinal;
begin

 waittime := 9999999;
 counter := 0;
 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if ((counter > waittime) or (loadStatus = READYSTATE_UNINITIALIZED) or
     (loadStatus = READYSTATE_LOADING) or
     (loadStatus = READYSTATE_UNINITIALIZED)) then
   begin
     break;
   end;
   inc(counter);
 end;

 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if (loadStatus = READYSTATE_COMPLETE) then
   begin
     break
   end;

 end;

end;

procedure TForm5.waitTillLoad2;
var
 waittime, counter: integer;
begin
 load := false;
 waittime := 1000000;
 counter := 0;
 while (true) do
 begin
   Application.ProcessMessages;

   if (counter > waittime) or (load) then
   begin
     break;
   end;
   inc(counter);
 end ;
 while (not load ) do
 begin
   Application.ProcessMessages;
 end;
end;

 procedure TForm5.WebBrowser1DocumentComplete(ASender: TObject;
   const pDisp: IDispatch; const URL: OleVariant);
 begin
load:=true;
 end;

end.

Hocam yukarıdaki prosedürlerden biri işini görür.ReadyState sağlık çalışmayabiliyor bence  bu yüzden waitTillLoad2 ikiyi kullan daha iyi sonuç veriyor.Sadece waittime süresince beklemek istiyorsan alttaki while'lari yorum satırı haline getirebilirsin yada hep beklemek istiyorsan üsttekileri.

Ayrıca selected boxın değerini şu şekilde  değiştirmelisin.
void __fastcall TForm7::setselectedbox(_di_IHTMLElement element,String model)
{
_di_IHTMLSelectElement  pSelectElement=NULL;
element->QueryInterface(IID_IHTMLSelectElement, (void**)&pSelectElement);
int ElementCount = 0;
pSelectElement->Get_length(ElementCount);
OleVariant idx;

for (long ic=0; ic <ElementCount; ic ++)
{

idx.intVal=ic;
idx.VType=VT_I4;
_di_IDispatch pElementDisp = NULL;
pSelectElement->item(idx,idx,pElementDisp);
IHTMLOptionElement *pElement = NULL;
pElementDisp-> QueryInterface (IID_IHTMLOptionElement, (void **) &pElement);
WideString ws;
ws=pElement->text;

if(ws==model){
pSelectElement->Set_selectedIndex(ic);
break;
  }



}

}

Ben bunu delphiye çevirecek kadar delphi bilmiyorum yada çok uğraşmalıyım ama kavramlar tanıdık geleceği için bence sizler çevirebilirsiniz.

procedure TForm5.setselectedbox(element: IHTMLElement; model: String);
var
 ic, ElementCount: integer;
 pSelectElement: IHTMLSelectElement;
 idx: OleVariant;
 pElementDisp: IDispatch;
 pElement: IHTMLOptionElement;
Begin
 pSelectElement := nil;
 element.QueryInterface(IID_IHTMLSelectElement, pSelectElement);
 ElementCount := 0;
 ElementCount := pSelectElement.length;;
 for ic := 0 to ElementCount - 1 do
 begin

   idx.intVal := ic;
   idx.VType := varInteger;
   pElementDisp := nil;
   pElementDisp := pSelectElement.item(idx, idx);
   pElement := nil;
   pElementDisp.QueryInterface(IID_IHTMLOptionElement, pElement);

   if (pElement.text = model) then
   begin
     pSelectElement.selectedIndex := ic;
     break;
   end;

 end;

end;
waitTillLoad2 ;
setselectedbox(WebBrowser.OleObject.Document.getElementById('modeller'),'369');
Uğraştım çevirdim şunu dener misin hocam?
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#9
(20-09-2017, Saat: 18:31)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
unit Unit5;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.OleCtrls, SHDocVw;

type
 TForm5 = class(TForm)
   WebBrowser1: TWebBrowser;
   procedure waitTillLoad1;
   procedure waitTillLoad2;
   procedure WebBrowser1DocumentComplete(ASender: TObject;
     const pDisp: IDispatch; const URL: OleVariant);

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form5: TForm5;
 load: boolean;

implementation

{$R *.dfm}

procedure TForm5.waitTillLoad1;
var
 waittime, counter: integer;
 loadStatus: cardinal;
begin

 waittime := 9999999;
 counter := 0;
 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if ((counter > waittime) or (loadStatus = READYSTATE_UNINITIALIZED) or
     (loadStatus = READYSTATE_LOADING) or
     (loadStatus = READYSTATE_UNINITIALIZED)) then
   begin
     break;
   end;
   inc(counter);
 end;

 while (true) do
 begin
   loadStatus := WebBrowser1.ReadyState;
   Application.ProcessMessages;

   if (loadStatus = READYSTATE_COMPLETE) then
   begin
     break
   end;

 end;

end;

procedure TForm5.waitTillLoad2;
var
 waittime, counter: integer;
begin
 load := false;
 waittime := 1000000;
 counter := 0;
 while (true) do
 begin
   Application.ProcessMessages;

   if (counter > waittime) or (load) then
   begin
     break;
   end;
   inc(counter);
 end ;
 while (not load ) do
 begin
   Application.ProcessMessages;
 end;
end;

 procedure TForm5.WebBrowser1DocumentComplete(ASender: TObject;
   const pDisp: IDispatch; const URL: OleVariant);
 begin
load:=true;
 end;

end.

Hocam yukarıdaki prosedürlerden biri işini görür.ReadyState sağlık çalışmayabiliyor bence  bu yüzden waitTillLoad2 ikiyi kullan daha iyi sonuç veriyor.Sadece waittime süresince beklemek istiyorsan alttaki while'lari yorum satırı haline getirebilirsin yada hep beklemek istiyorsan üsttekileri.

Ayrıca selected boxın değerini şu şekilde  değiştirmelisin.
void __fastcall TForm7::setselectedbox(_di_IHTMLElement element,String model)
{
_di_IHTMLSelectElement  pSelectElement=NULL;
element->QueryInterface(IID_IHTMLSelectElement, (void**)&pSelectElement);
int ElementCount = 0;
pSelectElement->Get_length(ElementCount);
OleVariant idx;

for (long ic=0; ic <ElementCount; ic ++)
{

idx.intVal=ic;
idx.VType=VT_I4;
_di_IDispatch pElementDisp = NULL;
pSelectElement->item(idx,idx,pElementDisp);
IHTMLOptionElement *pElement = NULL;
pElementDisp-> QueryInterface (IID_IHTMLOptionElement, (void **) &pElement);
WideString ws;
ws=pElement->text;

if(ws==model){
pSelectElement->Set_selectedIndex(ic);
break;
  }



}

}

Ben bunu delphiye çevirecek kadar delphi bilmiyorum yada çok uğraşmalıyım ama kavramlar tanıdık geleceği için bence sizler çevirebilirsiniz.

procedure TForm5.setselectedbox(element: IHTMLElement; model: String);
var
 ic, ElementCount: integer;
 pSelectElement: IHTMLSelectElement;
 idx: OleVariant;
 pElementDisp: IDispatch;
 pElement: IHTMLOptionElement;
Begin
 pSelectElement := nil;
 element.QueryInterface(IID_IHTMLSelectElement, pSelectElement);
 ElementCount := 0;
 ElementCount := pSelectElement.length;;
 for ic := 0 to ElementCount - 1 do
 begin

   idx.intVal := ic;
   idx.VType := varInteger;
   pElementDisp := nil;
   pElementDisp := pSelectElement.item(idx, idx);
   pElement := nil;
   pElementDisp.QueryInterface(IID_IHTMLOptionElement, pElement);

   if (pElement.text = model) then
   begin
     pSelectElement.selectedIndex := ic;
     break;
   end;

 end;

end;
waitTillLoad2 ;
setselectedbox(WebBrowser.OleObject.Document.getElementById('modeller'),'369');
Uğraştım çevirdim şunu dener misin hocam?
öncelikle yardımlarınız için teşekkür ederim. Kodu denedim fakat değişen bir şey yok seçmiyor.
Cevapla
#10
waitTillLoad2 bu prosedürü de kullandın mı hocam?
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi 10.2 Aes sorunu seci20 2 63 17-10-2018, Saat: 12:41
Son Yorum: seci20
  salt okunur fonksiyon sorunu codder71 3 180 09-10-2018, Saat: 16:38
Son Yorum: codder71
  ADOConnection Conneted 'da Sql Stop Sorunu emrahgs 8 180 09-10-2018, Saat: 14:38
Son Yorum: emrahgs
  WebBrowser'dan html kaynağını çekme burakb44 15 565 17-09-2018, Saat: 23:10
Son Yorum: burakb44
Question OpenSSL .dll sorunu delphi 10.2 Mr.Developer 5 454 12-09-2018, Saat: 17:08
Son Yorum: uparlayan



Konuyu Okuyanlar: 1 Ziyaretçi