web sayfası bileşenlerini kodla doldururken...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Misafir

web sayfası bileşenlerini kodla doldururken...

Mesaj gönderen Misafir »

merhaba.
bir web sayfasına delphi içinden browser bileşeni ile bağlanıyorum ve sayfadaki bileşenleri kodla dolduruyorum.ancak explorer sayfa hatası veriyor ve devam etmek istiyor musunuz diye soruyor.işin garip tarafı evet dersem işlemi yapıyor.işin ikinci garip tarafı, bilgileri ie'den doldurursam bu hatayı almıyorum.sendkey apisiyle bişeyler yapmayı düşünüyorum ama ilk olarak hatanın neden kaynaklandığını tam olarak öğrenme gereği duydum.bileşenleri doldurmak için;

Kod: Tümünü seç

var i : integer;
element : olevariant;
begin
 Element := w1.OleObject.Document.forms.item(0).elements;
 for i := 0 to (Element.Length - 1) do
  begin
   tedit(findcomponent(element.item(i).value)).Text;

komutlarını kullanıyorum.
konu hakkında görüşlerinizi bildirirseniz sevinirim.şimdiden teşekkürler.[/code]
Kullanıcı avatarı
warder
Üye
Mesajlar: 255
Kayıt: 10 Mar 2004 04:59

Mesaj gönderen warder »

Bahsettiğiniz "bir web sayfası" https ise ondan kaynaklanıyordur. Öyle ise kodunuza değil bu konuya yoğunlaşmanız probleminizin boyutunu değiştirebilir.
... Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!
Mustafa Kemal Atatürk...
Misafir

Mesaj gönderen Misafir »

tekrar merhaba.
warder yazdı:Bahsettiğiniz "bir web sayfası" https ise...
soruda "sayfa hatası alıyorum" diye yazmıştım. "Bu sayfadaki komut dizisinde bir hata oluştu.. Hata : alant tanımsız" diye uyarı mesajı veriyor ve devam etmek istiyor musunuz diye soruyor.Evet dersem işlemi yapıyor.İşin diğer garip tarafı, internet explorer'da aynı işlemi yapınca hiçbi hata almıyorum.

ilginç için teşekkür ederim.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

HTML in tamamen yüklenmesini beklemelisiniz. open der demez ardından bu kodlar çalışırsa sayfa daha gelmeden doldurmaya çalışıyor olabilirsiniz. Mesaj ekranda göründüğü süre içinde sayfa yüklendiğinden devam deyince kalan taraf çalışıyor olabilir.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Misafir

Mesaj gönderen Misafir »

doğan hocam teşekkür ederim olay söylediğiniz gibiymiş.ben documentcomplete eventine yazmıştım kodları (daha önceki uygulamarda kullandığım yöntem). daha önceki projelerde hata almıyordum bunu da öğrenmiş olduk.
tekrar teşekkür ederim, kolay gelsin.
Misafir

asıl sorun browser bileşeninden kaynaklanıyormuş...

Mesaj gönderen Misafir »

merhaba ya cemaat-ül delphi..
daha önce çıkan ie sayfa hatası daha farklı bi şekilde çıktı karşımıza.bunun bizim kodlardan kaynaklandığını düşünerek tüm uniti baştan aşağı (kontroller eşliğinde) elden geçirdik.sorunun webbrowser bileşeninden kaynaklandığını gördük böylece..ortada bir java script hatası var ve bu Microsoft Internet Explorer'da (hatasız) stabil çalışıyor.ancak her ne hikmetse webbrowser bileşeniyle bu işlemi yaptığımızda " 'document.sorgu.soyadi', null veya bir nesne değil " sayfa hatasını veriyor.demo olarak gelen webbrows projesinde de aynı hatayı aldık.ortada herhangi bir ataç olmadığı için sendkey metodunu da kullanamıyoruz...
önerilerinizi bekliyoruz..

Admine özel not : Forumda search yapıldı.. :)

iyi çalışmalar...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhabalar...

- Şahsen; bilgi alınıp gönderilen siteyi yazarsanız inceler yorum yapmaya çalışırım.

- GET methodu kullanılabilecek bir sitede POST metodu ile sorgu yapmaya çalışmak hatalı sonuçlar ortaya koyabilmekte.

- Delphi sürümünüz dahilinde NMHttp veya Indy Bileşenlerinden hangisi mevcut onu da bildirirseniz faydalı olacaktır.

- Bugüne kadar AMAZON.COM DVD Cover Image, IMDb.COM, TürkTelekom Rehber, Sinema.Com, MovieMeter.NL, TJK (jokey klübü) gibi gerek ASP gerek PHP gerekse HTML hepsinde sorunsuz çalışan HTML parse ve sorgu çeşitliliği içerisinde yeni bir örnek olabileceğini düşünerek ilgimi çekti.
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhabalar...

- Gönderdiğiniz özel mesajdan anlaşıldığı özere konumuz TTRehber... Bu sayfayı etüd ederseniz, aslında webBrowser ile bu sayfayı çağırmak zorunda olmadığınız göreceksiniz.

- Daha önce, CallerID (arayan numarayı gösteren) bir programla uğraşırken neden olmasın deyip ADSL avantajını da içine alan bir proje(cik) oluşturdum. Size de tavsiye ederim faydalı bir eser oldu. Kim, hangi tarihte ve saatte aradı ve kaç defa çaldırdı :) projesi.

- Veritabanında ismi olmayan bir telefon numara aramışsa; kaydı gizli değilse, telekomdan sorgulanıp veritabanına ekleyerek öğrenme özelliği olan bir proje. Eşimin bürosu için yapmıştım. :) Neyse konumuza dönelim.

- WebBrowser ile ilgili anlatacak fazla bişi yok, direkt kod vericem.

- :arrow: Telefon numarasından Aramak için kullanılacak ASP linki aşağıdaki gibi...

Kod: Tümünü seç

http://ttrehber.gov.tr/rehber_webtech/tel.asp
- :arrow: Post edilecek iki adet alanımız ve iki adet anahtarımız var...

Kod: Tümünü seç

bolge, tel, sorgula, stat

Kod: Tümünü seç

bolge=312&tel=4255677&sorgula=Bul&stat=1


gibi kullanılacak...

- :arrow: Daha önce forumda WebBrowser ile nasıl post ettiğiniz bilemiyorum ama aşağıdaki fonksiyon şeklinde olmalı...

- Forma 1 Adet TBrowser ile 2 Adet TEdit koyun. TEdit'lerden ilki alan kodu, ikincisi telefon numarası olarak kullanılacak. Koyacağınız butona da sadece ARA; fonksiyon çalıştırma komutunu ekleyin.

Kod: Tümünü seç

Procedure TForm1.Ara();
var
  EncodedDataString: string;
  PostData         : OleVariant;
  Headers          : OleVariant;
  I                : Integer;
begin
  WebBrowser1.Navigate('', EmptyParam, EmptyParam, EmptyParam, EmptyParam );
  Application.ProcessMessages;

  EncodedDataString := Format('bolge=%s&tel=%s&sorgula=Bul&stat=1', [Edit1.Text, Edit2.Text]);
  PostData := VarArrayCreate([0, Length(EncodedDataString) - 1], varByte);
  for I := 1 to Length(EncodedDataString) do
  PostData[I-1] := Ord(EncodedDataString[I]);
  Headers := 'Content-Type: application/x-www-form-urlencoded' + #10#13;
  WebBrowser1.Navigate('http://ttrehber.gov.tr/rehber_webtech/tel.asp',
                        EmptyParam,
                        EmptyParam,
                        PostData,
                        Headers);
end;
- Çalışmalarınızda başarılar...
Resim
Resim ....Resim
Misafir

Mesaj gönderen Misafir »

sevgili muharrem abi;
ilgin için teşekkür ederim öncelikle.ttrehber safyasında, numara ile aramada herhangi bir problem yaşamıyoruz.aslında isim ile arama yaparken de ilk aşamada problem yok.ancak;örneğin İSTANBUL'da KAYA soyismiyle başlayan bi sorgulama kriteri oluşturduğunuzda haliyle birçok kayıt listeleniyor.sayfada 'bir sayfada görüntülenecek kayıt sayısı' olayı var ve bunu da 50 olarak veriyoruz.tabi yine de birçok sayfa çıkıyor karşımıza.toplam kaç sayfa olduğunu html sourceleri içinden öğreniyoruz ve diğer sayfalara yönlenmek için gerekli linkleri browser nesnesinin navigate propertysine parametre olarak verip post ediyoruz.sorun da tam burda çıkıyor işte.bu işlemi delphinin demo browser projesinde aynı işlem manuel olarak yapılınca da aynı hatayla karşılaşıyoruz.
karışık mı oldu :)
saygılar..
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...

- MSN ve mail ile irtibat kurmayı tasvip etmemekle birlikte, @delphi_coder'le bu sefere mahsus olmak kaydıyla görüştük.

- Bu sorunsalı tartışıp, asıl sorunun ne olduğunu bu sayede öğrenmiş olduk. Ben de bir örnek hazırlayıp kendisine sunarken, forumda direkt benzeri olmadığını gördüğüm aynı kodları bir de olarak forum sakinleriyle paylaşayım dedim. :wink:

:arrow: Arkadaşımız WebBrowser navigate edilmiş bir sayfayı;

Kod: Tümünü seç

TWebBrowser.OleObject.Document.forms.item(O).elements;
satırındaki gibi her bir elemana erişip, boşluğu doldurup, aynı formu HTML üzerinden geldiği gibi post etmek şeklinde bir metodu benimseyip kullanmış.

- Ben de bu bilgileri parametre olarak direkt post etmenin daha mantıklı bir uygulama olacağını savunduğumu dile getirerek örneklemek istedim. Şöyle ki...

:arrow: İlk vereceğim fonksiyon POST işlemlerimizde kullancağımız dinamik bir fonksiyondur. xIptal isminde Boolean bir Global Değişken tanımı var ki bu bize navigasyonun herhangi bir aşamasında araya girip durdurmamıza yardımcı olan bir değişkendir. Yani Form üzerinde bir button koyup buna basıldığında aşağıdaki;

Kod: Tümünü seç

xIptal := True;
değeri atandığında döngü anında duracak ve arama işlemi sonlanacaktır.

- PostEt fonksiyonu; Adres, Parametre, Dosya parametreleriyle gelen html veriyi Dosya isminde bir Text dosya haline getirecektir.

Kod: Tümünü seç

Function TForm1.PostEt(Adres, Parametre, Dosya : String):Boolean;
Var
  PostData         : OleVariant;
  Headers          : OleVariant;
  I : Integer;
  Liste            : TStringList;
begin
  WebBrowser1.Navigate('',
                        EmptyParam,
                        EmptyParam,
                        EmptyParam,
                        EmptyParam );
  Result := true;
    WebBrowser1.Width  := 1;
    WebBrowser1.Height := 1;
    WebBrowser1.ParentWindow := Form1.Handle;
    WebBrowser1.SendToBack;

    PostData := VarArrayCreate([0, Length(Parametre) - 1], varByte);
    for I := 1 to Length(Parametre)
      do PostData[I-1] := Ord(Parametre[I]);
    Headers  := 'Content-Type: application/x-www-form-urlencoded' + #10#13;
    WebBrowser1.Navigate( Adres,
                          EmptyParam,
                          EmptyParam,
                          PostData,
                          Headers);
    xIptal := False;
    repeat
       Application.ProcessMessages;
       // ZZZZzzzz
    until ( WebBrowser1.ReadyState = READYSTATE_COMPLETE )
       or ( xIptal );

    If xIptal
      then
        begin
          WebBrowser1.Navigate('', EmptyParam, EmptyParam, EmptyParam, EmptyParam );
          Result := False;
        end
      else
        begin
          Liste := TStringList.Create;
          Liste.Text   := WebBrowser1.OleObject.Document.Body.InnerHTML;
          Liste.SaveToFile(Dosya);
          Liste.Free;
        end;
end;

:arrow: Artık yukardaki POST işlemini dilediğimiz şekilde nasıl kullanacağımızı anlatayım.

- Örneğimizde TTRehber sitesinden bilgi sorgulaması yapıcaz... Aşağıdaki Procedure ile bunun nasıl yapıldığını göreceksiniz...

Kod: Tümünü seç

Procedure TForm1.IsimAra(WebBrowser : TWebBrowser; AlanKodu, Ad, Soyad, Sayfa : String);
Var
  Url, Param, Dosya : String;
begin
  Url := 'http://ttrehber.gov.tr/rehber_webtech/isim.asp';
  Param := Format('tur1=ON&tur2=ON&tur3=ON&bolge=%s&ilce=&soyadi=%s&semt=&adi=%s&mah=&meslek=&cad=&adet=3&sorgula=Bul&stat=1&whichpage=%s', [AlanKodu, Soyad, Ad, Sayfa]);
  Dosya := ExtractFilePath(Application.Exename)+'Gelen.TXT';
  PostEt(URL, Param, Dosya);
end;

Kod: Tümünü seç

IsimAra( WebBrowser1, '312', '', 'ARMAN' );

.. dediğinizde Ankara'daki tüm ARMAN'lar listelenecektir.

- Burada sihirbazlık isteyen şey, kaç sayfa varsa onun tespit edilmesidir. Çünkü tüm veriler bir sayfada bulunmuyor...

:arrow: Forma koyacağınız bir COMBOBOX ile sayfa sayısı kadar numara 1, 2, 3, ... ,n şeklinde liste oluşturalım.

Kod: Tümünü seç

Procedure TForm1.SayfaSayisiBul();
Var
  Liste  : TStringList;
  Bas, Adet,
  Bulundu,
  Sayac  : Integer;
  Satir,
  Aranan : String;
begin
  Liste := TStringList.Create;
  Liste.LoadFromFile(ExtractFilePath(Application.Exename)+'Gelen.TXT');
  Aranan := '[>>]';
  Sayac   := (-1);
  Bulundu := (-1);
  Repeat
    Inc(Sayac);
    If Pos(Aranan, Liste[Sayac]) > 0 then Bulundu := Sayac;
  Until (Bulundu >= 0) or (Sayac = Liste.Count-1);

  If (Bulundu >= 0) then
  begin
    Satir := UpperCase(Copy(Liste[Bulundu], Pos(Aranan, Liste[Bulundu])-20, 30));
    Bas  := Pos('WHICHPAGE', Satir) + Length(Aranan);
    Adet := Pos(#34, Satir)-Bas;
    Satir := Copy(Satir, Bas, Adet);
    For Sayac := 1 to StrToInt(Satir) do ComboBox1.Items.Add(IntToStr(Sayac));
  end;
  Liste.Free;
end;
:arrow: Buraya kadar; isim aradık, kaç sayfa dolusu bu isimden var onu tespit edip bir combobox'a sayfa numaralarını listeledik.

- Şimdi ise bu ComboBox'un OnChange olayında, listeden hangi sayfa seçilmişse o sayfanın navigasyonu yapılmasını sağlayalım.

Kod: Tümünü seç

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  IsimAra(WebBrowser1,Edit1.Text, Edit3.text, Edit4.Text, ComboBox1.Text);
  SayfaSayisiBul();
end;
:arrow: Daha fazla koda gerek yok, code kendini satıyor.. :lol:

:idea: Biraz uzun oldu ama eğitici olacağını değerlendiriyorum.

:idea: Çalışmalarınızda başarılar dilerim...
Resim
Resim ....Resim
Kullanıcı avatarı
webaytek
Üye
Mesajlar: 377
Kayıt: 23 Haz 2004 10:58

Mesaj gönderen webaytek »

benim sıkıntım şu : sitemdeki ipsay.php script ini sitenin anasayfasına include ettirdiğim gibi programlarıma da eklemek istedim. sonuçları > http://www.site.com/ipsay_goster.php adresinden görüyorum. Ekleme işlemi şu şekilde oluyor > http://www.site.com/ipsay.php ye gidildiğinde ipsay.php dosyası kayıdı mySQL veritabanına ID si x olarak ekliyor. ben de kayıtları ipsay_goster.php adresinden görüyorum. Sorum şu > programı açan kişi siteye gidecek http://www.site.com/ipsay.php zaten bu script e ulaşınca kayıt yeni bir ID alarak DB ye ekleniyor. benim sıkıntım bu noktada başlıyor. ip adresi bilgisayardan script yoluyla alınarak yazılıyo ancak ID ise veritabanı ile alakalı. ben Exe üzerinde o tıklama sonucunda alınacak yeni ID yi nasıl bulabilirim. Not : IP adresi siteye kaç kere girerse ID o kadar artıyo o yüzden sadece "şu ip yi oku - karşılığı olan ID nedir onu da oku" mantığı benim aklıma yatmadı. yazma sırasında alınan yeni ID yi nasıl exe ye geri gönderebilirim?
Cevapla