Konu: ActiveCell'in sütun numarası
Merhaba,
Grid'de ActiveCell'in sütün numarasını nasıl öğrenebilirim?
Not: ActiveColumn, sütun sıra numarasını veriyor. Benim istediğim gerçek sütun numarası.
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
fox4um » Gridler ve Diğer Kontroller » ActiveCell'in sütun numarası
Merhaba,
Grid'de ActiveCell'in sütün numarasını nasıl öğrenebilirim?
Not: ActiveColumn, sütun sıra numarasını veriyor. Benim istediğim gerçek sütun numarası.
sys(1272,oobjectname) işine yarar mı?
sys(1272,oobjectname) işine yarar mı?
İşime yaramıyor çünkü; bunu kullanabilmem için ThisForm.ActiveControl'u kullanmak gerekiyor ki bu da sadece gridin adresini veriyor.
ActiveColumn
ActiveColumn, sütun sıra numarasını veriyor. Benim istediğim gerçek sütun numarası.
Aşağıdaki kod bir command button un içinde çalışıyor, setfocus yapmazsan activecolumn değerini alamıyorsun. Denemedim ama belki bir obje içinden activecolumn değeri alınabiliyordur.
Eğer gridi dizayn ettikten sonra kolonları kaydırmışsan gerçek kolon numarasını almak için aşağıdaki kod işe yarayabilir.
thisform.grid1.SetFocus
colnumber =thisform.grid1.ActiveColumn
colname =thisform.grid1.columns(colnumber).name
realcolnumber=thisform.grid1.&colname..ColumnOrder
*?colnumber,colname,realcolnumber
thisform.command1.SetFocus
Aradigin bu mu acaba:
* gridClass::findcolumn
lparameters nColIndex
local ix
with this
for ix = 1 to .columncount
if .columns(m.ix).ColumnOrder = m.nColIndex
return m.ix
endif
endfor
endwith
Herkese teşekkürler
Çetin'in yaptığı gibi yapmıştım ama belki bilmediğin bir activecontrol vardır diye düşünmüştüm.
Not: Bence Grid foxpronun en güçlü nesnesi. Bu güçlü nesnede active kontrolün adına belki hızlı bir şekilde erişebilirim diye düşünmüştüm.
Evet browse en gucluydu, grid yerini aldı:)
Tarkan,
Acaba demek istedigin varread() mi diye dusunmeye basladım. Hic dolasmadan field adini almak icin?
Hayır field'in adı değil de sütun numarası lazım. Aslında sütun da değil ilgili sütundaki currentcontrol lazım.
Yavas yavas FoxyClasses'in kodlarini yaziyorum:)
Yukaridaki gridin findcolumn() metodu idi.
* BeforeRCC, AfterRcc
lparameters nColIndex
with this
*...
oColumn = .columns(.FindColumn(nColIndex))
*...
oCurrentControl = evaluate("oColumn."+;
iif( !empty(oColumn.dynamiccurrentcontrol), ;
eval(oColumn.dynamiccurrentcontrol),;
oColumn.currentcontrol) )
*...
FindColumn yazısını görünce FoxyClasses'dan olduğunu anlamıştım zaten
Çetin aslında olay tam olarak şu.
Seninle daha önceden de konuşmuştuk hatırlarsan.
Örneğin formunda 3 textbox 1 grid 2 command olsun. Command'lerden biri kaydet düğmesi olsun. grid'in içine ise kullanıcı bilgileri giriyor. textboxlarından birinde tarih sorulsun.
Formun KeyPress'i .T. olsun ve F2 tuşuna basıldığında kaydet düğmesine çalışıyor.
1. Durum
Kullanıcı F2 tuşuna basıldığında formun KeyPress'inde şunu yapıyorum.
With ThisForm
Do Case
Case nKeyCode = -1 && F2
NoDefault
If .cmdKaydet.Enabled
.cmdKaydet.SetFocus
.cmdKaydet.Click
EndIf
...
2. Durum
Tarihi girişi yapılan textbox'a kullanıcı hatalı bir tarih girişi yapsın ve textbox'ın içinden çıkmadan F2 düğmesine bassın. Bu durumda TextBox'un çıkışında VFP hata mesajı verse de kaydet methodu çalışıyor ve hatalı sonuçlar oluyor bunu engellemek için şunu yazdım.
If InList(nKeyCode, -1, -4, -5, -6, -7) And ;
Type("ThisForm.ActiveControl.Value") = "D" And ;
Empty(ThisForm.ActiveControl.Value) And ;
!Empty(StrTran(ThisForm.ActiveControl.Text, Set("Mark"), ""))
MessageBox(TARIH_HATALI, 48, UYARI)
Return .F.
EndIf
With ThisForm
Do Case
Case nKeyCode = -1 && F2
NoDefault
If .cntUst.cmdKaydet.Enabled
.cntUst.cmdKaydet.SetFocus
.cntUst.cmdKaydet.Click
EndIf
...
3. Durum
Ancak kullanıcı grid içindeki bir sahaya hatalı tarih yazdığında yukarıdaki kontrol yeterli olmuyor.
ThisForm.ActiveControl.Text kısmında hata oluyor çünkü activecontro'ün text yok. Bu durumda grid'in ilgili sütunun ilgili controlünün text'i bilmem gerekiyor. İşte bu yüzden sordum bu soruyu. If kontrolüne direk yazabilir miyim diye. Ancak anladım ki olmuyormuş
Çetin,
Formun keypress olayını çözdüm ancak enteresan bir şey var.
Grid'de tarih sahasına geçersiz bir bir tarih yazıyorum Enter ya da Tab yapmadan fare ile bir düğmeye basıyorum ve o düğmenin Click metodu çalışıyor. Bu da işlemine göre hatalı sonuçlar doğurabiliyor.
Wait Window'da "invalid date" hatası vermesine karşın clik çalışıyor.
Calisir, gridin duzeltilmeyen bugi:)
Tarkan,
Olayi daha basit yapsana. Clickte tarih gecerlimi diye bak - gridsource.tarih.
Bu olay tek bir form olsa dediğin kolay. O kadar farklı formlar var ki hangi bir click'e hangi kontrolleri yazayım
Artık uğraşacağız bir şekilde
İlgin için teşekkürler
değişkeni ctod() fonsiyonuyla tarih tipine değiştirdikten sonra textbox da yanlış ya da geçersiz tarih girildiğinde ingilizce olarak uyarı mesajı verip textbox tan çıkmıyor.Ta ki geçerli bir tarih girilene dek.
boş bir formda boş bir textbox için
init
-------
this.value=CTOD(this.value)
dateformat=3-british
datemark="/"
inputmask="99/99/9999"
olarak denediğimde ve geçersiz tarih girildiğinde ingilizce olarak "invalid date" mesajı çıkıyor.
Ercan,
Sorun grid'de herhangi bir tarih sahasına geçersiz tarih yazıp fare ile bir düğmeye bastığında o düğmenin click event'inin çalışması. Foxpro geçersiz tarih uyarı vermesine karşın düğmenin click event'ini çalıştırıyor. Oysa ki çalışmaması lazım.
Tarkan şöyle bir yol olabilir mi acaba?
cursor , gridin tarih alanına girdiğinde gotfocus methodunda tüm command buttonlar ın enabled propertyilerine .f. atarsın. lostfocus eventte ise tüm command buttonlar ın enabled propertyilerine .t. atarsın. aklıma gelen tek çözüm bu maalesef.
Bence ActiveControl'ü kontrol etmek daha pratik
fox4um » Gridler ve Diğer Kontroller » ActiveCell'in sütun numarası