Konu: Grid te işaretleme yaparken numaratörü arttırma
Form da grid de checkbox ları işaretlerken kaç tane checkbox ı işaretlediğimizi nasıl bulabiliriz ?
Teşekkürler
Giriş yapmadınız. Lütfen giriş yapın yada kayıt olun.
Form da grid de checkbox ları işaretlerken kaç tane checkbox ı işaretlediğimizi nasıl bulabiliriz ?
Teşekkürler
* myform.mygrid.afterRowColChange
* grid.RecordSource="gridtable" olduğunu varsayıyoruz
* gridtable (alan1 C(10), alanchk L) gibi olsun
DECLARE kaçtane(1)
kaçtane[1]=0
SELECT COUNT(alan1) FROM gridtable WHERE alanchk INTO ARRAY kaçtane
Myform.Textalansay.Value=NVL(kaçtane[1],0) && NVL gerekmiyebilir, ne olur ne olmaz diye
2. Yöntem;
Formuna bir tana Property ekle GridCheckBoxCount gibi
Checkbox için bir sınıf oluştur; ve her tıklandığında sayacını bir artır yada azalt.
Uğurlu,
Kodla örnek verebilirmisin ?
Teşekkürler
* Author : Sergey Berezniker
* I was have a small revised for CheckBoxCounterX . Ugur
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN
DEFINE CLASS form1 AS form
Top = 0
Left = 0
Height = 276
Width = 504
DoCreate = .T.
Caption = "Form1"
ngridx = 0
ngridy = 0
Name = "Form1"
CheckBoxCounterX = 0
ADD OBJECT grid1 AS grid WITH ;
ColumnCount = 3, ;
HeaderHeight = 39, ;
Height = 216, ;
Left = 12, ;
Panel = 1, ;
Top = 24, ;
Width = 456, ;
AllowCellSelection = .F., ;
Name = "Grid1", ;
Column1.Width = 134, ;
Column1.Name = "Column1", ;
Column2.Width = 111, ;
Column2.Name = "Column2", ;
Column3.Width = 62, ;
Column3.Sparse = .F., ;
Column3.Name = "Column3"
PROCEDURE grid1.Init
WITH This.Column3
.Header1.Caption = "Checkbox"
.AddObject("Check1","CheckBox")
.Sparse = .F.
.CurrentControl = "Check1"
WITH .Check1
.Alignment = 2
.Caption = ""
.Name = "Check1"
.Visible = .T.
ENDWITH
.RemoveObject("text1")
ENDWITH
ENDPROC
PROCEDURE Load
CREATE CURSOR Test ( t1 C(10), t2 C(10), l1 L)
INSERT INTO Test VALUES ( "Test 1 ", "Str 1", .F.)
INSERT INTO Test VALUES ( "Test 2 ", "Str 2", .F.)
INSERT INTO Test VALUES ( "Test 3 ", "Str 3", .F.)
INSERT INTO Test VALUES ( "Test 4 ", "Str 4", .F.)
GO TOP
ENDPROC
PROCEDURE grid1.Click
LOCAL lnRelCol, lnRelRow, lnWhere
STORE 0 TO lnWhere, lnRelRow, lnRelCol
This.GridHitTest(Thisform.nGridX, Thisform.nGridY, @lnWhere, @lnRelRow, @lnRelCol)
IF lnWhere = 3 && Cell
IF lnRelCol = 3 && column 3
This.Columns(lnRelCol).check1.Value = NOT This.Columns(lnRelCol).check1.Value
IF This.Columns(lnRelCol).check1.value = .T.
ThisForm.CheckBoxCounterX = ThisForm.CheckBoxCounterX + 1
ELSE
ThisForm.CheckBoxCounterX = ThisForm.CheckBoxCounterX - 1
ENDIF
WAIT Window STR(ThisForm.CheckBoxCounterX) NoWait
ENDIF
ENDIF
ENDPROC
PROCEDURE grid1.MouseDown
LPARAMETERS nButton, nShift, nXCoord, nYCoord
&& Save mouse position to use in Grid.Click
Thisform.nGridX = nXCoord
Thisform.nGridY = nYCoord
ENDPROC
ENDDEFINE
Define Class myGrid as Grid
******************************************************************
PROCEDURE Click
******************************************************************
sele 4
sakla2=RECNO()
GO TOP
COUNT TO .txt2topyazdir.Value FOR yazici=.T.
GO sakla2
ENDPROC
EndDefine
KODUNDA
PROCEDURE Click
çalışmadı ?
Neden olabilir ?
Teşekkürler.
Procedure Click ; bir form içinde GUI ile mi tanımlı yoksa kendin KOD ile mi oluşturdun? Eğer Form nesnesi ile menüler den oluşturduysan kodunun çalışması lazım. KOD yazarak oluşturduysan; öncelikle From nesnesinin içerisinde ADD OBJECT ile grid nesnesini forma eklemen gerekiyor; devamında da myGrid.Click() olarak kodlama yaparsan sonuç alırsın.
Kişisel birkaç öneri :
Select 4 yerine Select 'BenimTablom' şeklinde kullan. Hataya yer vermemiş olursun.
Değişken tanımlamalarında, yerel değişkenler için LOCAL kullanımını alıskanlık haline getir.
"m." önekini değişkenlerinde mutlaka belirt. Aynı isimli fieldlar kullandığında ( ki bir gün mutlaka çakışıyor ) hatalara karşı önlem almış olursun.
Değişkenleri "m.lcbenimdegiskenim" şeklinde kullan. Kullandığın değişkenin LOCAL olduğunu hatırlamak için "l"; değişkenin tipini hatırlamak için "c" türünde prefixler kullan.
Daha önce TARKAN 'ın bu konuda yazdığı 10-20 sayfalık bir döküman vardı. İşe onu okuyarak başlayabilirsin . Linkini forumdan bulabilirsin.
http://rapidshare.com/files/423206318/V … um_R10.pdf
http://rapidshare.com/files/423209401/I … amming.pdf
Grid.Click sadece kolon ve satirlarin bos oldugu alanda calisir. Diger yerlerde oradaki kontrol click'i calisir.
Kod ekte :
Procedure AfterRowColChange
sorunsuz çalışıyor.
Amacım, Column1 de bulunan check boxı tıkladığımda check işateti (.T.) yaptıysam
COUNT TO .txt2topyazdir.Value FOR yazici=.T.
da bulunan .txt2topyazdir.Value yi 1 attırmak, check işatetini kaldırdıysam (.F.) .txt2topyazdir.Value yi 1 azaltmak.
**************
sele 4
sakla2=RECNO()
GO TOP
COUNT TO .txt2topyazdir.Value FOR yazici=.T.
GO sakla2
**************
kodunu Procedure AfterRowColChange içine koyduğumda bu işlemi yapıyor ama KOLON DEĞİŞTİRMEMİ BEKLİYOR.
Bense mouse ile tikleme esnasında yapmak istiyorum. Bunun için PROCEDURE Click yaratıp içine koydum ama çalışmadı.
Teşekkürler
******************************************************************
Define Class myGrid as Grid
******************************************************************
* Top = 62
Top = 335
Left = 2
Height = 310
Width = 1335
ColumnCount = 20
DeleteMark = .t.
RecordMark = .t.
ReadOnly = .T.
RecordSource = "kon9"
ScrollBars = 3
GridLineColor = Rgb(192,192,192)
* BackColor = 255
Procedure Init
With this
* Scatter Name This.oRecord Memo
.Column1.Header1.Caption = 'Yazdır'
.Column1.Width = 50
.Column1.ControlSource = "kon9.yazici"
.Column1.AddObject("chk1", ;
"checkbox")
.Column1.CurrentControl = ;
"chk1"
.Column1.chk1.Visible = .T.
.Column1.chk1.Caption = ""
.Column1.sparse=.f.
.Column1.Chk1.Enabled=.t.
.Column2.Header1.Caption = 'Sıra'
.Column2.Width = 35
.Column2.ControlSource = "kon9.sno"
* .Column2.BackColor = 255
EndWith
this.SetAll('Enabled',.F.,'textbox')
* this.SetAll('Enabled',.F.,'CheckBox')
this.SetAll('DisabledForeColor',0,'textbox')
EndProc
Procedure AfterRowColChange
Lparameters nColIndex
DoDefault(nColIndex)
With oForm
SELE 4
* gkod=.txtNo.Value
* BROWSE
.txt2Sno.Value = Sno
EndWith
Thisform.Refresh()
EndProc
******************************************************************
PROCEDURE Click
******************************************************************
sele 4
sakla2=RECNO()
GO TOP
COUNT TO .txt2topyazdir.Value FOR yazici=.T.
GO sakla2
ENDPROC
EndDefine
Kodu myform.mygrid.column1.check1.InteractiveChange içine yazarsan olur.
Myform.textCheckSay.Value = Myform.textCheckSay.Value + IIF(This.Value,1,-1)
Konuka,
Koda nasıl ekleyeceğim konusunda yardımcı olabilirmisin ?
Bazı konuları adım adım gidiyorum.
Teşekkürler.
PROCEDURE check1.InteractiveChange
ThisForm.textCheckSay.Value = ThisForm.textCheckSay.Value + IIF(This.Value,1,-1)
ENDPROC
kod yazınca BINDEVENT gerekti, diğer soruna bak
Diğer sorundaki kod a baktım. sadece ilk yüklemede checklenmiş adedi buluyor. sonra işaretlemelerde sayıyı arttırıp azaltmıyor.. ?
Diğer sorundaki kod a baktım. sadece ilk yüklemede checklenmiş adedi buluyor. sonra işaretlemelerde sayıyı arttırıp azaltmıyor.. ?
bizdeki vfp 9. SP 2 - ayrıca Visual-- kodla yazmaktansa direk işleyen bir formun olabiliyor.
yolladığım kodları modi comm komutu ile açılan pencereye yapıştırıp, tamamını seç, sağ tıkla, execute selection yapınca hem sayıcı çalışıyor, hem de diğer sorudaki 3 özellik!
acaba Bindevent mi çalışmıyor ?
bende vfp 6.0 var.
yolladığım kodları modi comm komutu ile açılan pencereye yapıştırıp (formları kodla yazıyorum. )