Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      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.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol,Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol / Neyi bilmediğimiz hakkında hiçbir fikrimiz yok (EM)
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
  Datasnap Türkçe karakter sorunu [Çözüldü] hakanharbeli 4 106 11-02-2018, Saat: 03:29
Son Yorum: hakanharbeli
  Program Files Yetki Sorunu narkotik 9 229 18-01-2018, Saat: 17:45
Son Yorum: SimaWB
  Webbrowser form element item adları bkantur 3 108 16-12-2017, Saat: 22:30
Son Yorum: SimaWB
  ios uygulama vmware bağlantı sorunu erdogan 2 169 02-10-2017, Saat: 09:38
Son Yorum: frmman
  Devexpress Richedit Image ekleme sorunu kasparov58 0 220 08-09-2017, Saat: 20:14
Son Yorum: kasparov58



Konuyu Okuyanlar: 1 Ziyaretçi