Web sayfasındaki VB scriptini execute etme üzerine..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Web sayfasındaki VB scriptini execute etme üzerine..

Mesaj gönderen aLonE CoDeR »

Selamlar.

aspx uzantılı bir adreste verileri uygulamadan kodla girerek (webbrowser nesnesinin document kütüphanesini kullanarak..) post işlemi yapıyoruz. Ancak kaydetme işlemini butona değil imageye bağlamışlar. Biz de tuttuk scripti execute ettik fakat stabil çalışmıyor kimi zaman access violation hatası veriyor kimi zaman da kısır döngüye giriyor. Öncelikle image nesnesine tıklama imkanımız varsa nasıl yapabiliriz?Yoksa script nasıl sorunsuz çalıştırılır?Şimdiden teşekkürler..
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

kodu yapıştırma imkanınız varmı
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba..

- Sayfa tamamen navigate edilmedenscript çalıştırırsanız hata ile karşılaşabilirsiniz. Bu normaldir.

- Image halindeki butonlara dilersen ekrandan mouse pozisyonu vererek click yaptırabilirsin ama bunu önermiyorum. Çünkü yapılan işlemlerin ekrandan görüntülenmesi hoş durmuyor.

- Javascript çalıştırmak en makulu ki bununla ilgili forumda defaten örnek verdik. bkz. viewtopic.php?t=19058#109375 dediğim gibi navigate işlemi bitmeden bu şekilde çalıştırdığınızda sorun çıkabilir. Bunu bu şekilde değerlendirin.
Resim
Resim ....Resim
Kullanıcı avatarı
Z.D.
Üye
Mesajlar: 104
Kayıt: 01 Nis 2006 01:48
Konum: İstanbul

Mesaj gönderen Z.D. »

TWebbrowser yerine normal "internet explorer" oleobject yaratıp denediniz mi?

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1:   TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }

  public
    { Public declarations }
    IExplore: variant;
    IEHandle: HWnd;
    ExitThr:  boolean;
    function QuickIESearch(pUrl: string; pFormname, pObjectname: string; pObjectValue: string): boolean;
  end;

var
  Form1: TForm1;



implementation

uses ComObj;

{$R *.dfm}


{-------------------------------------------------------------------------------
 ***** ReadyState *****
  0=Loading
  1=Uninitialized
  2=Loaded
  3=Interactive
  4=Complete
 **********************
-------------------------------------------------------------------------------}
function TForm1.QuickIESearch(pUrl: string; pFormname, pObjectname: string; pObjectValue: string): boolean;
var
  ovElements: olevariant;
  i, j:       Integer;
  lResult:    boolean;
begin
  lResult := False;
  ExitThr := False;
  try
    if (VarIsEmpty(IExplore)) or (FindWIndow('IEFrame', nil) = 0) then
    begin
      IExplore         := CreateOleObject('InternetExplorer.Application');
      IExplore.Visible := True;
    end
    else
    begin
      IEHandle := FindWIndow('IEFrame', nil);
      SetForegroundWindow(IEHandle);
    end;

    IExplore.Navigate(pUrl);
    while (Cardinal(IExplore.ReadyState) <> 4) and (ExitThr = False) do
    begin
      Application.ProcessMessages;
      Sleep(100);
    end;

    for i := 0 to IExplore.Document.Forms.Length - 1 do
      if IExplore.Document.Forms.Item(i).Name = pFormname then
      begin
        ovElements := IExplore.Document.Forms.Item(i).Elements;
        for j := 0 to ovElements.Length - 1 do
          if (CompareText(ovElements.Item(j).Name, pObjectname) = 0) then
            ovElements.item(j).Value := pObjectValue;
        IExplore.Document.Forms.Item(0).Submit;
        while (Cardinal(IExplore.ReadyState) <> 4) and (ExitThr = False) do
        begin
          Application.ProcessMessages;
          Sleep(100);
        end;
      end;
    lResult := True;
  except
    lResult := False;
  end;
  Result := lResult;
end;

{-------------------------------------------------------------------------------
-------------------------------------------------------------------------------}

procedure TForm1.Button1Click(Sender: TObject);
begin
  QuickIESearch('http://divxplanet.com/sub/src/',
    'Arama', 'ad', Edit1.Text);
end;

{-------------------------------------------------------------------------------
-------------------------------------------------------------------------------}
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ExitThr := True;
end;

end.

TWebbrowser veya indy kullanmadan da yukarıdaki şekilde post yapabilirsiniz. Yukarıdaki örnek divxplanette altyazı aramak için, isterseniz kodu biraz optimize edip deneyebilirsiniz.
aLonE CoDeR
Kıdemli Üye
Mesajlar: 1223
Kayıt: 26 Nis 2005 04:08

Mesaj gönderen aLonE CoDeR »

Öncelikle ilginiz için teşekkürler.Image nesnesine tıklama yöntemiyle çözdüm fırsat bulunca derleyip buraya atarım kodu.

@mrmarman;

Sorunun navigate işleminden kaynaklandığını anlamıştım ama asıl konu webbrowser nesnesinin navigate durumunu tam olarak verebildiği bir property yok, readystate tutarsız çalışıyor keza ondocumentcmoplete yordamı da.

@Z.D.

Bu örneği en kısa zamanda deneyip sonucu değerlendireceğim. Stabil olarak çalışırsa projeye bunu monte edebiliriz ilerde şu an aciliyetten ötürü pek mümkün olmadı :oops:

Tekrar teşekkür ediyorum, 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 »

@Z.D.

- Koda dikkat edersen TWebBrowser ile aynı özellikte. Yani fark yok. Sadece proje dahilinden değil de haricen müstakil bir Explorer açmış oluyorsun. ReadyState özelliği de READYSTATE_COMPLETE değeri aslında ( 4 ) dür. Yani JavaScript çalıştırdığında aynı sonucu elde edersiniz.
Resim
Resim ....Resim
Cevapla