Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
WebBrowser-Javascript değişkeni delphi değişkenine atama
#1
Ben FNC Webbrowser kullanıyorum ama normal webbrowser da da mantık aynıdır herhalde.
Javascript içinde elde ettiğim bir değişken değerini Delphi içindeki bir değişkene nasıl aktarabilirim?

procedure TfMain.btnClick(Sender: TObject);
var js:string;
 begin;

 js := 'javascript: var simge=$("span[class*='+'''title-ZJX9Rmzv'''+']").text();'; 
 wb1.ExecuteJavaScript(js);

 end;

Buradaki javascript içindeki "simge" değişkeninin değerini Delphi içinde kullanmak istiyorum.
Cevapla
#2
(28-07-2024, Saat: 10:47)nehirnnn Adlı Kullanıcıdan Alıntı: Ben FNC Webbrowser kullanıyorum ama normal webbrowser da da mantık aynıdır herhalde.
Javascript içinde elde ettiğim bir değişken değerini Delphi içindeki bir değişkene nasıl aktarabilirim?

procedure TfMain.btnClick(Sender: TObject);
var js:string;
 begin;

 js := 'javascript: var simge=$("span[class*='+'''title-ZJX9Rmzv'''+']").text();'; 
 wb1.ExecuteJavaScript(js);

 end;

Buradaki javascript içindeki "simge" değişkeninin değerini Delphi içinde kullanmak istiyorum.

Merhabalar,

procedure TfMain.btnClick(Sender: TObject);
var
 js: string;
begin
 js := 'var simge=document.querySelector("span[class*=\'title-ZJX9Rmzv\']").textContent; simge;';
 wb1.ExecuteJavaScript(js,
   procedure(const AResult: string)
   var
     simge: string;
   begin
     simge := AResult;
     ShowMessage('JavaScript Değeri: ' + simge);
   end
 );
end;
gibi bir yaklaşım yardımcı olabilir sanırım. Kodları test etmedim bilginiz olsun.

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#3
Yöntem doğru gibi, ama ne denediysem "null" değeri alıyorum. Javascript içinde hangi komut AResult a yansıyor, onu bulamadım.
document.write ve jquery komutlarını denedim ama hep null değeri alıyorum.
Cevapla
#4
Merhaba, window.chrome.webview.postMessage yöntemini incelemenizi tavsiye edebilirim.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#5
(29-07-2024, Saat: 12:10)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Merhaba, window.chrome.webview.postMessage yöntemini incelemenizi tavsiye edebilirim.

Maalesef yine "null" dönüyor. "simge" değişkenini javascript içinde alert ile kontrol ediyorum, olması gereken değeri görüyorum. Yani javascript içinde null değil.

Ancak aşağıdaki kod içinde AResult null çıkıyor.

wb1.ExecuteJavaScript(js,procedure(const AResult: string)
   var
    simge: string;
  begin
    simge := AResult;
    ShowMessage('JavaScript Değeri: ' + simge);
  end
);
Cevapla
#6
(29-07-2024, Saat: 12:33)nehirnnn Adlı Kullanıcıdan Alıntı:
(29-07-2024, Saat: 12:10)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Merhaba, window.chrome.webview.postMessage yöntemini incelemenizi tavsiye edebilirim.

Maalesef yine "null" dönüyor. "simge" değişkenini javascript içinde alert ile kontrol ediyorum, olması gereken değeri görüyorum. Yani javascript içinde null değil.

Ancak aşağıdaki kod içinde AResult null çıkıyor.

wb1.ExecuteJavaScript(js,procedure(const AResult: string)
   var
    simge: string;
  begin
    simge := AResult;
    ShowMessage('JavaScript Değeri: ' + simge);
  end
);

Benim bahsettiğim yöntemi izlemediğinizi görüyorum verdiğiniz örnekten. Ayrıca; verdiğim linki inceleyip okumadığınızı da anlıyorum. Okumuş olsa idiniz; OnWebMessageReceived olay yöneticisinin etrafında biraz dolaşmak durumunda kalırdınız. Ayrıca herhangi bir Javascript kodu (bahsettiğim postMessage metodunu kullanmadığınız durum için) asenkron olarak çalışacaktır. Bu kodun Javascript tarafında Execute edilmesinin Delphi tarafında beklenilmesi gerekir. Bunun içinde OnExecuteScript olaylarını incelemeniz gerekir. Tabii ben bunları TEdgeBrowser için söylüyorum. Denemelerinizi onun üstünde yapabilirsiniz.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#7
Mesajınızın "Bu kodun Javascript tarafında Execute edilmesinin Delphi tarafında beklenilmesi gerekir. Bunun içinde OnExecuteScript olaylarını incelemeniz gerekir. Tabii ben bunları TEdgeBrowser için söylüyorum. Denemelerinizi onun üstünde yapabilirsiniz." kısmı da yeterli olacakmış.
FNC Browser kullandığım için bulduğum örneklerden ancak deneme yanılma yöntemiyle ilerliyorum. Yazılanları okumadığım için değil.

FNC Browser için problemi şu şekilde çözdüm. Javascript içinde bir fonksiyon tanımladım. Return ile delphiye aktarmak istediğim değişken değerini gönderdim. Bu şekilde delphi tarafından gönderdiğim değeri okuyabildim. İhtiyaç duyacaklar için örnek aşağıdaki gibi:

procedure TfMain.btnRefreshHisseListClick(Sender: TObject);
var js:string;
begin
 //
 js := 'javascript: var simge=$("span[class*='+'''title-ZJX9Rmzv'''+']").text(); function sonuc(param){ return param;} sonuc(simge);';
 wb1.ExecuteJavaScript(js,procedure(const AResult: string)
  var
    simge: string;
  begin
    simge := AResult;
    ShowMessage('JavaScript Değeri: ' + simge);
  end
);
end;
Cevapla
#8
Ben de EdgeBrowser yakasında benzer bir yaklaşımı örneklemek için bir kod hazırlamıştım.. Üçüncü parti bileşenler için de bazen onun atasından yola çıkarak çözüm üretilebiliyor.

Buradan paylaşayım farklı bir örnek.

   + sLineBreak + '    <script>'
   + sLineBreak + '      document.getElementById(''DigerVar'').value     = TestVar'
   + sLineBreak + '    </script>'

şeklinde ne zaman bir script çalıştırsanız o anki web yakasındaki TestVar içeriği veya başka bir değişkeni statik sizin kontrolünüzdeki bir "DigerVar" isimli değişkenine taşır ve JS event ile okursunuz. 

Bunu yapabilmek için INJECTION metodu ile bilinen bir HTML element içeriğine bu scripti dahil edip işlevsel hale getirmelisiniz. Detayları için bu DelphiCan linkinde bir örnek bırakmıştım.


var
  FInProgress : boolean = false;

procedure TForm1.BitBtn1Click(Sender: TObject);
const
  LDefHtml = ''
    + sLineBreak + '<html>'
    + sLineBreak + '  <head>'
    + sLineBreak + '    <script>'
    + sLineBreak + '      var TestVar="Bu ''TestVar'' değişkeni içeriği, ''DigerVar'' değişkenine aktarılmış olmalı...";'
    + sLineBreak + '    </script>'
    + sLineBreak + '  </head>'
    + sLineBreak + '  <body>'
    + sLineBreak + '    <a id="DigerVar" value="henüz boş">DigerVar</a>'
    + sLineBreak + '    <script>'
    + sLineBreak + '      document.getElementById(''DigerVar'').value     = TestVar'
    + sLineBreak + '      document.getElementById(''DigerVar'').innerHTML = TestVar'
    + sLineBreak + '    </script>'
    + sLineBreak + '  </body>'
    + sLineBreak + '</html>'
    ;
begin
  FInProgress := true;

  EdgeBrowser1.Navigate( 'about:blank' );

  while FInProgress do
  begin
    Application.ProcessMessages;
    Sleep(60);
  end;

  EdgeBrowser1.NavigateToString( LDefHtml );

  EdgeBrowser1.ExecuteScript( 'window.document.getElementById(''DigerVar'').value' );

end;

procedure TForm1.EdgeBrowser1NavigationCompleted(Sender: TCustomEdgeBrowser;
  IsSuccess: Boolean; WebErrorStatus: TOleEnum);
begin
  FInProgress := false;
end;

procedure TForm1.EdgeBrowser1ExecuteScript(Sender: TCustomEdgeBrowser;
  AResult: HRESULT; const AResultObjectAsJson: string);
begin
  showmessage( 'Okunan Değer : ' + AResultObjectAsJson );
end;


Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  yapay zeka delphi kl007 9 977 26-02-2026, Saat: 09:12
Son Yorum: mrmarman
  Win 11 ve Delphi 7 Minimize sorunu. enigma 7 790 11-02-2026, Saat: 10:27
Son Yorum: RAD Coder
Question Delphi formunu nasıl otomatik tam ekran yapabilirim ? erdemklt0 2 540 23-01-2026, Saat: 10:02
Son Yorum: csunguray
  Delphi SLL kullanım sorunu Bay_Y 12 1.740 22-12-2025, Saat: 18:11
Son Yorum: Bay_Y
  Delphi ile SQL server bağlantı hatası yakalama Under 20 2.445 21-11-2025, Saat: 15:24
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi