1

Konu: Formda foküsü eski kontrole döndürmek

Merhaba,
Bir türlü çözemediğim bir sorunum var.
Üzerinde birçok kontrol yanı sıra iki adet Pageframe'in olduğu bir formum var.  Formun bazı property leri şöyle:

Keypreview=.T.
WindowType=Modal
ShowWindow=1 (In Top-Level Form)

Yapmak istedeğim şey şu. Bir tuşa (F12) basıldığında ya da aynı işlevi olan bir command butona tıklatıldığında bir iş (örneğin kaydetme) yapmasını, sonra da odak (foküs) neredeyse oraya dönmesini istiyorum. Örneğin odak, PageFrame1.Makro.Edit1'de ise oraya dönsün. Ancak her kontrolün kendi Lostfocus eventindeki kodu çalıştırıp (çünkü burada kontrolün değeri ile ilgili bilgiler işleniyor) sonra da Formun KeyPress eventindeki kodu ( IF nKeyCode=134) çalıştırsın. Her kontrole ayrı Keypress eventi yazmamak için formda  Keypreview=.T.. Yapamadım şey foküsün eski yerine dönmesini sağlamak.

Bunu başaramadım bir türlü.

Yardımlarınız için şimdiden teşekkürler.

2 Son düzenleyen, Mehmet K (24.01.2014 00:19:26)

Re: Formda foküsü eski kontrole döndürmek

Hazır bir cavabım yok.
Kendim böyle bir problem ile karşı karşıya kalmış olsaydım sanırım Control'ların TAG larını kullanırdım.
Yani GOTFOCUS event'e THIS.TAG = "1" ve LOSTFOCUS event'e THIS.TAG = "" yazardım.
Kayıt işlemini yaptıkdan sonra, tüm control'ları tarıyarak TAG == "1" olanı bulurdum.

Bu tarama işini ben control'ları reset etmek için şöyle bir yönteme başvuruyorum. Burda TAG == "1" olan control'lar resetlenmiyorlar.

Visual Fox Pro
FOR nPg = 1 TO THISFORM.PgFrame1.PAGECOUNT

  cTxt = "THISFORM.PgFrame1.Pg0" + STR(nPg,1)
 
  WITH &cTxt
    FOR nCnt = 1 TO .CONTROLCOUNT
      IF .CONTROLS[nCnt].BASECLASS ==  "Textbox" AND .CONTROLS[nCnt].TAG != "1"
        DO CASE
          CASE TYPE(".CONTROLS[nCnt].VALUE") == "N"
            .CONTROLS[nCnt].VALUE = 0
          CASE TYPE(".CONTROLS[nCnt].VALUE") == "D"
            .CONTROLS[nCnt].VALUE = {..}
          OTHERWISE
            .CONTROLS[nCnt].VALUE = ""
        ENDCASE
      ENDIF
    ENDFOR
  ENDWITH
ENDFOR
Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

3

Re: Formda foküsü eski kontrole döndürmek

işlemi başlatmadan önce ilgili page için activecontrol özelliğini bir değişkene at işlem sonunda buna setfocus yap.

4 Son düzenleyen, ugurlu2001 (24.01.2014 09:30:19)

Re: Formda foküsü eski kontrole döndürmek

http://www.fox4um.com/topic/2298/imlec-kayboluyor/

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

5

Re: Formda foküsü eski kontrole döndürmek

Yukarda belirtiğim yöntemde tabii bir düşünce hatası var.
LostFocus event'da elbette TAG resetlenmiyecek.
Kayıt yapıldıkdan sonra hangi TAG == "1" olduğu bulundukdan sonra, o an TAG resetlenecek.

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

6

Re: Formda foküsü eski kontrole döndürmek

Yanıtlar için teşekkürler.

Sorunuma en uyan çözüm activecontrol property'si gibi.

thisform.activecontrol'ü bir değişkene atayıp daha sonra işlem bitince bu kontrole setfocus yaptırmak en uygun çözüm gibi. Ancak bu da çok kolay değil. Çünkü thisform.activecontrol yalnızca kontrolün adını veriyor. Bana tam adı gerek yani Thisform'dan başlayarak.

Çözüm kolay görünmüyor. Formdaki her kontrolün (yaklaşık 40 adet!, 2 pageframe ve birçok textbox ve editbox var) onun yerine her kontrolün lostfocus eventine o kontrolün tam adını (Thisform.Pageframe1.Makro.Edit_makro gibi) bir değişkene atamak. Sonra da foküsü oraya yönlendirmek.

@uğurlu, verdiğiniz linkteki sorun formun foküs kaybetmesi bende ise aynı formdaki kontroller arasında foküs sorunu var. Yine de denedim olmadı.
teşekkür ederim.

7

Re: Formda foküsü eski kontrole döndürmek

hiç zorluğu yok
formuna bir property ekle örnek = ak olsun

thisform.ak=thisform.activecontrol
işlemlerin...
thisform.ak.setfocus()

8

Re: Formda foküsü eski kontrole döndürmek

Dediğiniz gibi yaptım, oldu. Sanırım activecontrol aktif objenin referansını alıyor. Onun için setfocus yapabiliyor.

Çok teşekkürler.

9

Re: Formda foküsü eski kontrole döndürmek

kandilzade yazdı:

Çok teşekkürler.

Biz teşekkür ederiz, şu ara forumda soru soran sıkıntısı yaşanıyor.

VFP9 SP2

10

Re: Formda foküsü eski kontrole döndürmek

kandilzade yazdı:

Yanıtlar için teşekkürler.

Sorunuma en uyan çözüm activecontrol property'si gibi.

thisform.activecontrol'ü bir değişkene atayıp daha sonra işlem bitince bu kontrole setfocus yaptırmak en uygun çözüm gibi. Ancak bu da çok kolay değil. Çünkü thisform.activecontrol yalnızca kontrolün adını veriyor. Bana tam adı gerek yani Thisform'dan başlayarak.

Çözüm kolay görünmüyor. Formdaki her kontrolün (yaklaşık 40 adet!, 2 pageframe ve birçok textbox ve editbox var) onun yerine her kontrolün lostfocus eventine o kontrolün tam adını (Thisform.Pageframe1.Makro.Edit_makro gibi) bir değişkene atamak. Sonra da foküsü oraya yönlendirmek.

@uğurlu, verdiğiniz linkteki sorun formun foküs kaybetmesi bende ise aynı formdaki kontroller arasında foküs sorunu var. Yine de denedim olmadı.
teşekkür ederim.


thisform.activecontrol ismini vermiyor, objenin kendisini veriyor. Sen tam olarak ismini saklamak istersen:

Visual Fox Pro
lcName  = stuff( sys(1272, thisform.ActiveControl), 1, len( thisform.Name ), 'thisform' )


Simdi senin orijinal soruna bakarsak, her kontrolun Lostfocus kodunun calismasina gerek yok. ActiveControl disindakilerin Lostfocus kodu zaten calisti (hic focus olmadiysa calismadi ama sanirim o kadar da bagimli kod yazmamissindir). Calismasi gereken sadece activecontrol icin. O zaman soyle olabilir kod:

Visual Fox Pro
local loControl

loControl = thisform.ActiveControl
loControl.LostFocus()
* Keypress kodu
loControl.SetFocus()

Eger gercekten bir grup kontrole birseyler yaptirmak istiyorsan, o zaman bunun icin FoxyClasses'ta hazir kod var. FoxyClasses'i:

http://www.medikosoft.com/cetin/FoxyClasses.zip

adresine giderek indirebilirsin. udfObjCollector classina bak ve onun ornegini incele. Istersen form seviyesinde, istersen daha alt seviyedeki (thisform.pageframe, thisform.container1 ... gibi) , istedigin kontrollerde bir metodu cagirabiliyorsun ( metodlar icin SetAll diye dusun ).

Bir baska yontem benim "yayin" ya da "anons" yontemi dedigim yontem. Bunu uygulayabilmek icin sana "cevap vermesini" istedigin tum nesnelerin belli bir propertysi oluyor ve bu propertynin _Assign metodu kullaniliyor. Soyle:

Visual Fox Pro
define class myTextBox as Textbox

   AnonsDinle = .F.
 
    procedure AnonsDinle_Assign
    lparameters vNewVal
 
    do case
         case  m.vNewVal = 'VeriKontrol'
       * birseyler yap
         case m.vNewVal = 'Reset'
        * baska birsey yap
          otherwise
         endcase
    endif   
 
endproc
enddefine

Temel olarak tum classlarinda bu oluyor. O zaman senin tum yapman gereken:

Visual Fox Pro
thisform.SetAll( 'AnonsDinle', 'VeriKontrol' )

gibi kodlarla her kontrolun, kendi kendine ilgili islemi yapmasini saglamak (bu islem kendisinin Lostfocusunu cagirmak da olabilirdi).

11

Re: Formda foküsü eski kontrole döndürmek

cetinbasoz yazdı:
kandilzade yazdı:

Yanıtlar için teşekkürler.

Sorunuma en uyan çözüm activecontrol property'si gibi.

thisform.activecontrol'ü bir değişkene atayıp daha sonra işlem bitince bu kontrole setfocus yaptırmak en uygun çözüm gibi. Ancak bu da çok kolay değil. Çünkü thisform.activecontrol yalnızca kontrolün adını veriyor. Bana tam adı gerek yani Thisform'dan başlayarak.

Çözüm kolay görünmüyor. Formdaki her kontrolün (yaklaşık 40 adet!, 2 pageframe ve birçok textbox ve editbox var) onun yerine her kontrolün lostfocus eventine o kontrolün tam adını (Thisform.Pageframe1.Makro.Edit_makro gibi) bir değişkene atamak. Sonra da foküsü oraya yönlendirmek.

@uğurlu, verdiğiniz linkteki sorun formun foküs kaybetmesi bende ise aynı formdaki kontroller arasında foküs sorunu var. Yine de denedim olmadı.
teşekkür ederim.


thisform.activecontrol ismini vermiyor, objenin kendisini veriyor. Sen tam olarak ismini saklamak istersen:

Visual Fox Pro
lcName  = stuff( sys(1272, thisform.ActiveControl), 1, len( thisform.Name ), 'thisform' )


Simdi senin orijinal soruna bakarsak, her kontrolun Lostfocus kodunun calismasina gerek yok. ActiveControl disindakilerin Lostfocus kodu zaten calisti (hic focus olmadiysa calismadi ama sanirim o kadar da bagimli kod yazmamissindir). Calismasi gereken sadece activecontrol icin. O zaman soyle olabilir kod:

Visual Fox Pro
local loControl

loControl = thisform.ActiveControl
loControl.LostFocus()
* Keypress kodu
loControl.SetFocus()

Eger gercekten bir grup kontrole birseyler yaptirmak istiyorsan, o zaman bunun icin FoxyClasses'ta hazir kod var. FoxyClasses'i:

http://www.medikosoft.com/cetin/FoxyClasses.zip

adresine giderek indirebilirsin. udfObjCollector classina bak ve onun ornegini incele. Istersen form seviyesinde, istersen daha alt seviyedeki (thisform.pageframe, thisform.container1 ... gibi) , istedigin kontrollerde bir metodu cagirabiliyorsun ( metodlar icin SetAll diye dusun ).

Bir baska yontem benim "yayin" ya da "anons" yontemi dedigim yontem. Bunu uygulayabilmek icin sana "cevap vermesini" istedigin tum nesnelerin belli bir propertysi oluyor ve bu propertynin _Assign metodu kullaniliyor. Soyle:

Visual Fox Pro
define class myTextBox as Textbox

   AnonsDinle = .F.
 
    procedure AnonsDinle_Assign
    lparameters vNewVal
 
    do case
         case  m.vNewVal = 'VeriKontrol'
       * birseyler yap
         case m.vNewVal = 'Reset'
        * baska birsey yap
          otherwise
         endcase
    endif   
 
endproc
enddefine

Temel olarak tum classlarinda bu oluyor. O zaman senin tum yapman gereken:

Visual Fox Pro
thisform.SetAll( 'AnonsDinle', 'VeriKontrol' )

gibi kodlarla her kontrolun, kendi kendine ilgili islemi yapmasini saglamak (bu islem kendisinin Lostfocusunu cagirmak da olabilirdi).

Çetin Bey,

Bu ayrıntılı açıklama için çok teşekkürler. Her zamanki gibi çok öğretici.

Visual Fox Pro
local loControl

loControl = thisform.ActiveControl
loControl.LostFocus()
* Keypress kodu
loControl.SetFocus()

Yukarıdaki kod işimi gördü.
Lostfokus'ün kimi kontollerde illa ki çalışması gerek (valid yerine lostfokus kullanılması gerektiğini bu forumda öğrenmiştim). Çünkü burada örn. Editbox'ın değeri üzerinde işlemler yapıyorum (örn. empty değilse ise ya da belli bir karakter sayısını geçti ise bazı değişkenlerin değeri değişiyor v.b.).

Fozyclassess'ı da deneyeceğim.