Webbrowser'da ki Enter Tuşu Olayı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 08:42

Webbrowser'da ki Enter Tuşu Olayı

Mesaj gönderen destiny24 » 25 Kas 2013 11:08

Arkadaşlar Merhaba,

EmbeddedWebbrowser kullanarak yaptığım bir uygulama var. Bu Browser'ın OnNewWindows3 olayında aynı formu tekrar crate ediyorum ve doğal olarak açılan tüm popup pencereleri aynı browser üzerinden yönetiyorum.
Tüm browserlarda olduğu gibi embeddedwebbrowser da da enter tuşunu gönderme olayında sorun yaşıyorum. Şöyle bir durum var. Enter tuşunu gönderebilmek için Application.OnMessage metoduna özel olarak yazılmış aşağıdaki metod atanıyor. Ancak webbrowser'ın OnCloseQuery olayı gerçekleştiğinde bu OnMessage olayındaki IsDialogMessage metodu yine bir Message gönderdiği için metod rekürsif olarak kendini çağırıyor ve sonsuz döngüye giriyor program. Verilen örnek sanırım tek browser için düşünülmüş. Bu konudaki sıkıntıyı nasıl aşabileceğim konusunda fikri olan var mı?

Kod: Tümünü seç


Application.OnMessage := MsgHandler; // Create de çalışıyor

procedure TfrmWebBrowser2.MsgHandler(var Msg: TMsg; var Handled: Boolean);
const
  StdKeys = [VK_BACK, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT];
var
  IOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
  success: boolean;

begin

  if (ebwebBrowser = nil) then
  begin
    Handled := False;
    Exit;
  end;
  
  success := IsDialogMessage(ebwebBrowser.Handle, Msg);
  Handled := (Success);
  if (Handled) and (not ebwebBrowser.Busy) then
  begin
    if FOleInPlaceActiveObject = nil then
    begin
      Dispatch := ebwebBrowser.Application;
      if Dispatch <> nil then
      begin
        Dispatch.QueryInterface(IOleInPlaceActiveObject, IOIPAO);
        if IOIPAO <> nil then FOleInPlaceActiveObject := IOIPAO;
      end;
    end;
    if FOleInPlaceActiveObject <> nil then
      if ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) and
        (Msg.wParam in StdKeys) then
        //nothing  -  do not pass on Backspace, Left, Right, Up, Down arrows
      else FOleInPlaceActiveObject.TranslateAccelerator(Msg);
  end;
end;

Kullanıcı avatarı
SimaWB
Üye
Mesajlar: 1299
Kayıt: 07 May 2009 09:42
Konum: İstanbul
İletişim:

Re: Webbrowser'da ki Enter Tuşu Olayı

Mesaj gönderen SimaWB » 25 Kas 2013 02:36

Ben ne yapmak istediğinizi tam anlayamadım ama geçici süreliğine Application.OnMessage'ı serbest bırakırsanız sorununuz hallolur gibi geldi bana.

Kod: Tümünü seç

Application.OnMessage := nil;
success := IsDialogMessage(ebwebBrowser.Handle, Msg);
Application.OnMessage := MsgHandler;
There's no place like 127.0.0.1

destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 08:42

Re: Webbrowser'da ki Enter Tuşu Olayı

Mesaj gönderen destiny24 » 25 Kas 2013 06:07

Aslında şöyle. Bir tane webbrowser formum var. burada ki webbrowser'ın onnewwindow2 ve 3 olayında yine bu webbrowser formdan bir tane create ediyorum ve onu kullanıyorum.
Program ilk açıldığında 3 tane webbrowser formu create ediyorum ve program kapanana kadar bunlar açık kalıyor. Bunun haricinde de popup olarak açtığım formlar var. Şimdi MsgHandler da bunu yaptığımda ilk form açılıyor orada enter tuşuna basabiliyorum. bu sefer popup olarak bir form açtığımda orada enter kullanabiliyorum ancak daha önce açmış olduğum ekranda bu sefer kullanamıyorum.

Bir de şöyle bir durum var. Açmış olduğum web sayfalarında memo'lar var. içerisinde enter'a bastığımda alt satıra falan iniyor. Yeni bir proje başlatıp yeni bir webbrowser atıyorum sayfa açılıyor ve ben o memo içersinde iken enter'a basabiliyorum. Alt satıra geçiyor. Ancak şuan üzerinde çalışmış olduğum projede ise aynı sayfada aynı memo'da enter kullanamıyorum. Application a özel bir şey sanırım yada proje bazlı bir ayardan. Bulamadım neden olduğunu

Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4717
Kayıt: 09 Ara 2003 08:13
Konum: Ankara
İletişim:

Re: Webbrowser'da ki Enter Tuşu Olayı

Mesaj gönderen mrmarman » 25 Kas 2013 09:01

@destiny24 yazdı:Ancak webbrowser'ın OnCloseQuery olayı gerçekleştiğinde bu OnMessage olayındaki IsDialogMessage metodu yine bir Message gönderdiği için metod rekürsif olarak kendini çağırıyor ve sonsuz döngüye giriyor program. Verilen örnek sanırım tek browser için düşünülmüş. Bu konudaki sıkıntıyı nasıl aşabileceğim konusunda fikri olan var mı?
Merhaba..
- Şu an deneme fırsatım yok ama aklıma geleni paylaşayım... :idea:
- Düşündüm ki, eğer sonsuz döngüye giren noktada, mesajın nereden geldiğini bilinirse basit bir IF THEN ile edilip sorun bypass edilebilir gibi geldi.
- Bunun için Global bir değişken kurulursa..
Örneğin :

Kod: Tümünü seç

Var 
  xKontrolNoktasi : Boolean = False;
gibi olduğunu varsayalım...

OnCloseQuery'ye veya bu mesajı ürettiğini değerlendirdiğiniz yerler aynı aşağıdaki satırı serpiştirin...

Kod: Tümünü seç

  xKontrolNoktasi := True;
MessageHandler bloğunda da şu olsun...

Kod: Tümünü seç

procedure TfrmWebBrowser2.MsgHandler(var Msg: TMsg; var Handled: Boolean);
const
  StdKeys = [VK_BACK, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT];
var
  IOIPAO: IOleInPlaceActiveObject;
  Dispatch: IDispatch;
  success: boolean;
begin
  if (ebwebBrowser = nil) 
     OR xKontrolNoktasi // burada OnCloseQuery'den veya TRUE yaptırdığınız başka yerler varsa oralardan geldiğini anlamış oluruz gibisinden...
  then
  begin
    Handled := False;
     xKontrolNoktasi := False; // değişkeni geri iade ettik.
    Exit;
  end;

  ... kod devamı ...
end;
Resim Resim

destiny24
Üye
Mesajlar: 131
Kayıt: 22 Tem 2010 08:42

Re: Webbrowser'da ki Enter Tuşu Olayı

Mesaj gönderen destiny24 » 26 Kas 2013 09:29

iki tane webbrowser formu show ettiğimi düşünün. İlk açtığımda çalışıyor enter. Sonra diğerini açıyorum. İlk formda çalışmamaya başlıyor yeni açtığım formda çalışıyor. Webbrowser tarafına enter tuşunu göndermenin başka bir yolu olmalı.

Cevapla