Hi Tom,
erstelle OBJ mit
Code: Alles auswählen
cFeld:="KD_BEZ"
aData := kundeneingabe->(RecordAllData(cFeld))
bData :={|x| IIf( x==NIL ,oCombo:Xbplistbox:getitem(1),;
oCombo:Xbplistbox:getitem(len(oCombo:XbpListbox:getdata()))) }
bAction := {|mp1,mp2,obj,self| ComboAction(mp1,mp2,obj,self)}
oCombo := XbpCombobox():new( drawingArea, , {8,352}, {184,168}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD }, { XBP_PP_FGCLR, GRA_CLR_BLACK } } )
oCombo:tabstop := .T.
oCombo:type := XBPCOMBO_DROPDOWN
oCombo:create()
ArrayToComboBox( oCombo, aData )
oCombo:XbpSLE:dataLink := bData
oCombo:XbpSLE:setData()
oCombo:ItemMarked := bAction
oCombo:ItemSelected := bAction
oCombo:killInputFocus := ;
{ |x,y,obj| kundenarray:=kundeneingabe->(Comboende(obj)) }
aadd(aCombo,oCombo)
mit cFeld bennen ich das Feld, wo die Daten ins aData reinsollen, aData benutze ich dann für die Auswahl.
Durch RecordAllData(cFeld) wird die Bezeichnung und die Recno() in das aData übernommen
Code: Alles auswählen
FUNCTION RecordAllData(cFeld)
// Komplette DBF einlesen
aAllData := {}
dbgotop()
Do While !Eof()
aAdd(aAllData,RecordData(cFeld))
DbSKip()
ENDDO
RETURN aAllData
und
Code: Alles auswählen
FUNCTION RecordData(cFeld)
LOCAL n ,aData
//:= Array( FCount() )
if isnull(cFeld)
aData:= Array( FCount() )
FOR n:=1 TO FCount()
aData[ n ] := FieldGet(n)
NEXT
else
aData:={}
aadd(aData,fieldget(fieldpos(cFeld))+" "+strzero(recno(),4))
//aData:={alltrim(fieldget(fieldpos(cFeld))),recno()}
endif
RETURN aData
das sieht dann in der Liste etwa so aus "Name 0004". Mit bDAta sorge ich dafür, das Listeneintrag 1 im SLE Feld steht. Hier ArraytoComboBox
Code: Alles auswählen
FUNCTION ArrayToComboBox( oCombo, aArray )
LOCAL i:=0, imax := Len(aArray)
IF Valtype( aArray[1] ) = "A" // 2-dim Array
DO WHILE ++i <= imax // Erste Spalte übertragen
oCombo:addItem( aArray[i,1] )
ENDDO
ELSE // 1-dim Array
DO WHILE ++i <= imax // Arrayelemente übertragen
oCombo:addItem( aArray[i] )
ENDDO
ENDIF
RETURN oCombo
FUNCTION ComboAction(mp1,mp2,obj,oWin)
local cTemp, aAuswahl,abc
zzz:=obj:XbpSle:editbuffer()
abc:=LastAppEvent()
cTemp := obj:XbpSle:getdata()
aAuswahl := obj:XbpListbox:getdata()
if len(aAuswahl)=0
obj:listBoxFocus(.T.)
PostAppEvent(abc)
else
obj:XbpSle:setdata(obj:XbpListbox:getitem(obj:XbpListbox:editbuffer();
[len(obj:XbpListbox:getdata())]))
ENDIF
RETURN NIL
Function Comboende(obj)
local aArray,nData
nData:=val(right(obj:getData(),4),4)
if(nData=0,dbgotop(),dbgoto(ndata))
aArray:=scatter()
// aArray:=recorddata()
return aArray
, Das ist alles für die Combobox. Mit AAdd(aCombo,oCombo) füge ich den Eintrag ins Array a Combo. Der Aufbau des Array ist dem des Editcontrol gleich, nur das ich die Comboboxen halt in aCombo eingetragen hab. Alle vier Comboboxen benutzen den selben Block bei
Code: Alles auswählen
aData := kundeneingabe->(RecordAllData(cFeld))
bData :={|x| IIf( x==NIL ,oCombo:Xbplistbox:getitem(1),;
oCombo:Xbplistbox:getitem(len(oCombo:XbpListbox:getdata()))) }
bAction := {|mp1,mp2,obj,self| ComboAction(mp1,mp2,obj,self)}
Nur aData und killinputfocus verändert sich, da es vier DBF sind "Kunde, Transart,Kennzeichen,Fahrer". Ich benutze aData nur zum füllen der Combobox:XbpListbox und killinputfocus für das holen der Daten aus der DBF
Code: Alles auswählen
oCombo:killInputFocus := ;
{ |x,y,obj| kundenarray:=kundeneingabe->(Comboende(obj)) }
.ist geändert auf transarray,kfzarray und fahrerarray.
Ich hoffe, die Erklärung reicht, um zu verdeutlichen wie aCombo aussieht.