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.

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...

İ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;
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;

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...

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;

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;

Daha fazla koda gerek yok, code kendini satıyor..

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

Çalışmalarınızda başarılar dilerim...