1

Konu: Çok sütünlu Listbox nasıl mümkün?

Yine bir sorunum var. Bana iki ya da 3 sütunlu listbox gerekiyor. Listbox'ta Column sayısını artırmak işe yaramıyor. Çünkü kolonlar aynı satırda çıkıyor. Benim istediğim Windows Explorer'da list konumunda dosyaların listesi nasıl görünüyorsa öyle bir listbox. Listbox'da 20-30 elementli bir array değişken kullanmak istiyorum. Birçok bakımdan, Grid de çözüm değil.

Teşekkürler...

2 Son düzenleyen, cetinbasoz (09.05.2007 16:00:50)

Re: Çok sütünlu Listbox nasıl mümkün?

Grid her bakimdan cozum hem de listbox'in olamayacagi kadar ya hadi neyse:)

Visual Fox Pro
Public oForm

oForm = Createobject('myForm')
oForm.Show
 
Define Class myForm As Form
  DataSession = 2
  Height=400
  Width =720
 
  Add Object myListBox As ListBox With ;
    Top=10,Left=10,Height=380,Width=700
 
  Procedure myListBox.Init
    WITH this
      .Addproperty('aCustomers[1]')
      SELECT Company,Contact,Title,cust_id ;
        FROM customer INTO ARRAY .aCustomers
      .RowSourceType=5
      .RowSource='this.aCustomers'
      .ColumnCount = 3
      .ColumnWidths='250,250,200'
    endwith
  Endproc
Enddefine

Bu arada array lafi ettigin icin arrayli.

3

Re: Çok sütünlu Listbox nasıl mümkün?

Kod için teşekkürler.
Listboxta sorun şu benim için: Her kolonu ayrı ayrı seçemiyorum yani "cell" kavramı yok sadece row var. Seçildiğinde row seçilebiliyor hücre seçilemiyor. O yüzden çok kolonlu olmasının hiçbir yararı yok bana.
Grid bu bakımdan bana çok uygun ama grid'de sorun RowSourceType array olamıyor. Windows Dosya gezginindeki (View/List konumunda) listeleme çok uygun bana, ama bunu VFP'ye uygulamak olası değil galiba.

Bu bakımlardan gereksinimime uyan bir çözüm zor görünüyor sanırım.

4

Re: Çok sütünlu Listbox nasıl mümkün?

Array neden sart? Cursor kullan.

5

Re: Çok sütünlu Listbox nasıl mümkün?

thisform.list1.list(thisform.list1.Listindex,x)     ile listbox ın x inci sütunundaki değeri alabilirsin.

6

Re: Çok sütünlu Listbox nasıl mümkün?

Ercan,
List() bir yol ve ne yazik ki hep orneklerde gosterilen yol. Ancak list/combonun bagli oldugu kaynakta:
1) List ile ulasmak icin gerekenden daha uzun kod yazman ve kolon pozisyonunu bilmen gerekebilir (genelde ne yazik ki oyle). Mesela rowsourcetype=3-SQL ve SQL "select * from customer into cursor crsCustomer" ise sen country bilgisini alabilmek icin onun kolon pozsiyonunu blip soyle birsey yazacaksin:

with thisform.myListbox
lcCountry = .List(.ListIndex, kolonNo)
endwith

Oysa kisa ve basit yolu:
lcCountry = crsCustomer.country

2) List ile sorgularsan data tipi karakter. Kaynakta numeric, date vs ise cevrim gerekiyor

7

Re: Çok sütünlu Listbox nasıl mümkün?

Benim uygulamamdaki gereksinimim şu; kullanıcı, biyopsinin alındığı vücut bölgelerini seçecek bir listeden. Bunun için TOPOS.DBF dosyası var. Burada toplam 350 civarında yerleşim bölgesi var. Bu çok uzun bir liste onun için ana yerleşim menüsünden dallanarak vücut sistemlerine göre daha kısa listeler görüntülecek. Örneğin deriden alındıysa en az 20-30 deri bölgesi listelenecek (ki deri bölgelerinin kodu 1 ile başlıyor, gastrointestinal sistemde ise 5 ile başlıyor v.b.).

Benim anlamadığım listbox'ta hücre (cell selection) seçemiyoruz değil mi? Sadece row var, bu multicolumn olsa bile row var cell yok.
Çetin Bey'in dediği gibi cursor ve grid çözüm olabilir mi diye düşündüm. TOPOS.DBF'den sadece deri bölgelerini seçtirerek bir cursor yarattım ve gride uyguladım. Burada da sorun şu oldu; fareyle bir hücreyi tek tıkladığımda o hücre selection'a geçmiyor. Sanki edit edecekmişim gibi duruyor (set cursor off da yaptım). Ama klavye ile dolaşırken sorun yok. Bu arada hücre üzerinde tıkladığım zaman mouse pointer'ı da ince edit moddaki gibi çıkıyor. Herhalde grid temelde edit üzerine düşünülmüş bir kontrol olduğu için sanırım.

8

Re: Çok sütünlu Listbox nasıl mümkün?

Listboxta cell selection yok, dogru. Listbox readonly bir kontrol.

Grid ile listboxla yapilan herseyi ve daha fazlasini yaparsin. Grid ile listbox oylesine taklit edilebilir ki bir sayfaya 5 kontrol koyarak, 1 i grid digerleri listbox, "bul karayi al parayi" gibi bir oyunla kose olunur. Tek yapacagin oyunlar arasinda formu bir an gizleyip yerlerini degistirmek:) Bilmem anlatabildim mi. Listbox taklit etmenin otesinde editable o kadar cok sey yapilabiliyor ki, bilmesen o sayfada o isi yapanin grid oldugunu soyleyemezsin. VFPciler arasinda biraz grid manyagi gibi taninmama sasmamali ben hakikaten bayiliyorum gridlere. Foxpronun en guclu komutu "browse" idi, simdi de en guclu kontrolu grid. Nasil 70'lerin teknolojisi olmasina ragmen SR71'e rakip ucak uretilemediyse, gride rakip kontrol de henuz yok. Nasil olsun gridin icinde kullanamadigi tek kontrol belki de "form", hos baseclassi form olmasa da baska kontrollerle onu bile icerebiliyor.

Set cursor off'un bir esprisi yok orada. O sadece gorsel olarak cursor'u kaldirmak icin. Senin demek istedigini tam anlamadim ama galiba sundan bahsediyorsun:

* text1.click
this.setfocus()
vaya:
keyboard "{Ctrl+A}"

Cursorun seklini istedigin sey yapabilirsin.

Ayrica kullanilan baska bir hile de gridin onune bir container (veya shape ama container tercih) yerlestirip, backstyle'ini transparent ayarlamak ve tum mouse hareketlerini kontrol edip gerektiginde gride gondermek.

Gridin gucu cok fazla, ancak genellikle o gucu kontrol etmek de zor oldugundan UT gibi bir forumda sorsan edit islerinde gridden uzak dur derler.

Eger grid isini gormuyorsa o  zaman dogrudan foxpronun icinde kullanabilecegin ve hemen hemen herseyi yapabilecegin bir diger kontrol web browser. Yani mesela bu fox4um tarzi bir arayuzu VFP formunun icinde yaratip kontrol edebilirsin. Hatta .Net kontrollerini bile kullanabilirsin (ki onlarin gorselligi cok - ornek icin www.etechnoligia.net).

Sorunun ne oldugunu tam anlamadigimdan gridin gucllu oldugunu anlattim kusura bakma. Yine de ornek bir kod gondericem basitce gridin cursoru nasil farkli kullanabilecegini gosteren.

9

Re: Çok sütünlu Listbox nasıl mümkün?

İlginize teşekkür ederim. Aslında bir önceki mesajımdaki sorunumu  çözdüm. Grid'imin default olmayan property'leri şöyle:

ReadOnly = .T.   && Edit istemiyorum kullanıcı sadece seçsin
Thisform.grid1.RecordSource = "YERYER"
Thisform.grid1.RecordSourceType= 0
AllowCellSelection = .F.   && Sorunumu çözen özellik
DeleteMark = .F.
GridLines = 0 -none
HeaderHeight=0
HighlightRow = .F.
RecordMark=.F.
ScrollBars = 0 -none
ColumnCount = 2

Aslında tam bir listbox gibi davranıyor. Güzel ama; buradaki kolon sayısı 2 olmasına karşın tek kolonda gösteriyor. Onun da nedenini buldum ama çaresini bulamadım. Benim datam yani cursorum tek field içeriyor. Onun için tek kolon gösteriyor.

Cursor'um şöyle (basit ve kısa hali):

CREATE CURSOR YER (YERAD C(30))
INSERT INTO YERYER (YERAD) VALUES ("Yüz derisi")
INSERT INTO YERYER (YERAD) VALUES ("Alın derisi")
INSERT INTO YERYER (YERAD) VALUES ("Kol derisi")
INSERT INTO YERYER (YERAD) VALUES ("Saçlı deri")
INSERT INTO YERYER (YERAD) VALUES ("Boyun derisi")
INSERT INTO YERYER (YERAD) VALUES ("bu altıncı seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu yediic seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu 8inci seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu 9'uncu seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu 10'uncu seçenek")
Benim istediğim şu; Örneğin 5 satırlı 2 kolon halinde listelesin. Çünkü aynı ekranda kullanıcı scroll etmeden 2 kolon halinde bunlar gösterilebilir.
Ama grid illaki iki field istiyor.

Umarım anlatabilmişimdir.

10

Re: Çok sütünlu Listbox nasıl mümkün?

Visual Fox Pro
public oForm

oForm  = createobject('myForm')
oForm.show
 
define class myForm as form
  height = 400
  width = 300
  datasession=2
 
  add object myGrid as myGrid
 
  procedure init
    with this.myGrid
      .columncount = -1
      .addcolumn(1, 'clmFName', 'employee.First_Name', 'First Name')
      .addcolumn(2, 'clmLName', 'employee.Last_Name', 'Last Name')
      .addcolumn(3, 'clmTitle', 'employee.Title', 'Title')
      .width  = this.width
      .height = this.height
      .autofit()
      .headerheight=0
    endwith
    this.setall('Visible',.t.)
    this.setall('Enabled',.f.,'Textbox')
    this.setall('MousePointer',99)
    this.setall('MouseIcon',home()+'Graphics\Cursors\h_point.cur')
  endproc
 
  procedure load
    use employee in 0
  endproc
 
  procedure queryunload
    select * from (this.myGrid.SelectionCursor) where !deleted()
  endproc
enddefine
 
define class myGrid as grid
  deletemark = .f.
  recordmark = .f.
  gridlines  = 2
  scrollbars = 2
  highlight = .f.
  highlightrow = .f.
  SelectionCursor = sys(2015)
 
  procedure init
    create cursor (this.SelectionCursor) (rcno i, ctrlSource c(50))
    index on padl(rcno,10,'0')+ctrlSource tag selTag
  endproc
 
  procedure addcolumn
    lparameters nIndex, cName, cControlSource, cCaption
    nodefault
    this.addobject(cName,'myColumn',nIndex, cControlSource, cCaption)
    with getpem(this,m.cName)
      .visible = .t.
      .dynamicbackcolor = ;
        [IIF(SEEK(padl(recno(),10,'0')+']+lower(.controlsource)+;
        [',']+this.SelectionCursor+[','selTag') and !DELETED(']+this.SelectionCursor+['),]+;
        str(.Text1.selectedbackcolor)+','+str(.Text1.backcolor)+')'
      .dynamicforecolor = ;
        [IIF(SEEK(padl(recno(),10,'0')+']+lower(.controlsource)+;
        [',']+this.SelectionCursor+[','selTag') and !DELETED(']+this.SelectionCursor+['),]+;
        str(.Text1.selectedforecolor)+','+str(.Text1.forecolor)+')'
    endwith
  endproc
 
  procedure SelectedCell(tcControlSource)
    local lcSelectedCellIndex
    lcSelectedCellIndex = padl(recno(),10,'0')+lower(m.tcControlSource)
    if !seek(m.lcSelectedCellIndex,this.SelectionCursor,'selTag')
      lnSelectedRow = recno()
      insert into (this.SelectionCursor) values (m.lnSelectedRow,lower(m.tcControlSource))
    else
      if deleted(this.SelectionCursor)
        recall in (this.SelectionCursor)
      else
        delete in (this.SelectionCursor)
      endif
    endif
    this.refresh
  endproc
enddefine
 
define class myColumn as column
  procedure init
    lparameters nIndex,cControlSource, cCaption
    with this
      .controlsource = m.cControlSource
      .columnorder = m.nIndex
      .Header1.caption = cCaption
      .addobject("myText","myGridTxtBox")
      .currentcontrol = "myText"
      .sparse = .f.
    endwith
  endproc
enddefine
 
define class myGridTxtBox as textbox
  borderstyle = 0
  procedure click
    this.parent.parent.SelectedCell(this.controlsource)
  endproc
enddefine

11 Son düzenleyen, cetinbasoz (12.05.2007 13:29:06)

Re: Çok sütünlu Listbox nasıl mümkün?

kandilzade yazdı:

İlginize teşekkür ederim. Aslında bir önceki mesajımdaki sorunumu  çözdüm. Grid'imin default olmayan property'leri şöyle:

ReadOnly = .T.   && Edit istemiyorum kullanıcı sadece seçsin
Thisform.grid1.RecordSource = "YERYER"
Thisform.grid1.RecordSourceType= 0
AllowCellSelection = .F.   && Sorunumu çözen özellik
DeleteMark = .F.
GridLines = 0 -none
HeaderHeight=0
HighlightRow = .F.
RecordMark=.F.
ScrollBars = 0 -none
ColumnCount = 2

Aslında tam bir listbox gibi davranıyor. Güzel ama; buradaki kolon sayısı 2 olmasına karşın tek kolonda gösteriyor. Onun da nedenini buldum ama çaresini bulamadım. Benim datam yani cursorum tek field içeriyor. Onun için tek kolon gösteriyor.

Cursor'um şöyle (basit ve kısa hali):

CREATE CURSOR YER (YERAD C(30))
INSERT INTO YERYER (YERAD) VALUES ("Yüz derisi")
INSERT INTO YERYER (YERAD) VALUES ("Alın derisi")
INSERT INTO YERYER (YERAD) VALUES ("Kol derisi")
INSERT INTO YERYER (YERAD) VALUES ("Saçlı deri")
INSERT INTO YERYER (YERAD) VALUES ("Boyun derisi")
INSERT INTO YERYER (YERAD) VALUES ("bu altıncı seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu yediic seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu 8inci seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu 9'uncu seçenek")
INSERT INTO YERYER (YERAD) VALUES ("bu 10'uncu seçenek")
Benim istediğim şu; Örneğin 5 satırlı 2 kolon halinde listelesin. Çünkü aynı ekranda kullanıcı scroll etmeden 2 kolon halinde bunlar gösterilebilir.
Ama grid illaki iki field istiyor.

Umarım anlatabilmişimdir.


Seninki ben postaladiktan sonra gorundu. AllowCellSelection = .f. nasil cozuyor anlamadim. Sanirim senin istedigin benim dusundugum degil (gonderdigimi calistir benim ne anladigim belli).

Grid tabii ki iki field isteyecek iki kolonda listelenecekse. Bunu iki kolonlu yapmanin neresi zor ki.

select * from yeryer into array aHepsi
dimension aHepsi[ceiling(alen(aHepsi,1)/2),2]
create cursor ikikolon (yerad1 c(30), yerad2 c(30))
append from array aHepsi

Bunu gorunce acaba aslinda senin aradigin bir grid,listbox degil de bir dizi checkbox mi, bir optiongroup mu diye dusunuyorum:)

12

Re: Çok sütünlu Listbox nasıl mümkün?

Aslında durum, deneyimli ve bilgili biri ile dışarıdan bakan ve biraz da cahil birinin bir konu üzerindeki iletişim sorunu.

Benim istediğim, sizin son mesajınızdaki yargınız gibi özel bir şey değil. Şimdi anladığım şu:
1. Benim gereksinimim ya grid ile çözülecek ya da VFP'nin kendinde varolan kontrolleriyle çözülmesi mümkün değil. Üçüncü parti (vcx,ocx v.b.) bir çözüm bulunabilir belki.
  2. Grid'e gelirsek son gönderdiğiniz
      select * from yeryer into array aHepsi
      dimension aHepsi[ceiling(alen(aHepsi,1)/2),2]
      create cursor ikikolon (yerad1 c(30), yerad2 c(30))
      append from array aHepsi
kodu ile gerçekten iki kolonlu grid yaptım ve istediklerimin çoğunu elde ettim.
İlk sorunum: Burada birinci kolonda dizideki tek sayılı elementler yer alıyor. Benim istediğim ise ilk kolonda yukarıdan aşağıya sırayla gitsin, kolon bitince ikinci kolonun 1. satırından devam etsin. Yani:
   1. seçenek    4. seçenek
   2. seçenek    5. seçenek
   3. seçenek   

Çözümü buldum: Array'i doldurma yöntemini değiştirmek. Yani;
      select * from yeryer into array aHepsi
      BOYUT = ceiling(alen(aHepsi,1)/2)
      dimension aHepsi(BOYUT,2)
      create cursor ikikolon (yerad1 c(45), yerad2 c(45))
      FOR iGENE= 1 TO BOYUT
         INSERT INTO ikikolon (yerad1,yerad2) VALUES (aHepsi[iGENE], aHepsi[iGENE+BOYUT])
      NEXT
Yeni sorun : Dizideki element sayısı tek sayı ise sorun çıkıyor. Yukarıdaki döngü, sona gelince (örneğin 5 seçenek varsa 6. seçeneği de doldurmaya çalışıyor) olmayan bir elementi doldurmaya çalışıyor.
  Çözümü ?
Yeni sorun : Yukarıdaki sorunu çözdüğümüzü varsaysak bile, diyelim 5 seçenek var ve 3 row var. Kullanıcının var olmayan 6. seçeneği seçmesine nasıl engel olabilirim. Çünkü grid 6. seçeneği boş olarak gösterse bile kullanıcı onu yanlışlıkla seçebilir. Bu seçeneği seçtiğinde uyarıcı mesaj konabilir belki ama bu da hoş değil işi baştan çözümlemek gerek bence.

Aslında daha önce yazdığım bir sorun yine de var ama yukarıdakileri çözümleyebilirsek ondan yeniden söz edeceğim.

Biraz sıktım galiba.
Teşekkürler.

13

Re: Çok sütünlu Listbox nasıl mümkün?

En basit olaylarda takılmıssın.
İki degisik yol:

Visual Fox Pro
LOCAL ARRAY aHepsi[1]

local lcTemp,ix
SELECT yerad,"" FROM yeryer INTO ARRAY aHepsi
FOR ix = CEILING(ALEN(aHepsi,1)/2)+1 TO ALEN(aHepsi,1)
    ahepsi[m.ix - CEILING(ALEN(aHepsi,1)/2),2] = aHepsi[m.ix,1]
ENDFOR
DIMENSION aHepsi[CEILING(ALEN(aHepsi,1)/2),2]
Create Cursor ikikolon (yerad1 C(45), yerad2 C(45))
APPEND FROM ARRAY aHepsi

Visual Fox Pro
Create Cursor ikikolon (yerad1 C(45), yerad2 C(45))

Use Dbf("yeryer") In 0 Again Alias kolon2
Select YERYER
Set Relation To Recno()+Ceiling(Reccount()/2) Into kolon2
Locate
Scan While Recno() <= Ceiling(Reccount()/2)
  Insert Into ikikolon Values (YERYER.YERAD, kolon2.YERAD)
Endscan
SELECT ikikolon

Nodefault, enabled gibi seylere bak.

Yine de istedigin optiongroup bence.

14

Re: Çok sütünlu Listbox nasıl mümkün?

grid'de bir hücre üzerinde iken keypress ile tuşları yakalayamıyorum. Benzer biçimde hücreye click yaptığımda bir şey yakalayamıyorum.
Örneğin Enter'a basıldığında selection diğer kolona geçiyor. Ben ise örneğin bu hücrenin value'sini alıp formdan çıkmak istiyorum.
Nasıl yapabilirim. Nodefault olmadı.

15

Re: Çok sütünlu Listbox nasıl mümkün?

kandilzade yazdı:

grid'de bir hücre üzerinde iken keypress ile tuşları yakalayamıyorum. Benzer biçimde hücreye click yaptığımda bir şey yakalayamıyorum.
Örneğin Enter'a basıldığında selection diğer kolona geçiyor. Ben ise örneğin bu hücrenin value'sini alıp formdan çıkmak istiyorum.
Nasıl yapabilirim. Nodefault olmadı.


eğer allowcellselection=.t. ise grid'in değil tek tek hücrelerin click ve keypress eventlarını kontrol etmen lazım.

Haksızlıklar karşısında susanlar, dilsiz şeytanlardır!
www.metinemre.com

16

Re: Çok sütünlu Listbox nasıl mümkün?

FoxyClasses orneklerine bak istersen, oluyor.

17

Re: Çok sütünlu Listbox nasıl mümkün?

Teşekkürler.