loObj = Thisform.ActiveControl
Wenn es jedoch um eine Text-, Edit- oder Checkbox eines Grids geht, dann funktioniert dies leider nicht, denn VFP liefert uns anstelle von Column und Row nur das Gridobjekt selbst. Das ist aber bei weitem kein Beinbruch. Das Grid verfügt über eine ähnliche Funktion, mit deren Hilfe sich die aktuelle Spalte herausfinden lässt.
loObj = Thisform.ActiveControl
IF loObj.Baseclass = [grid]
liCol = loObj.ActiveColumn
ENDIF
Damit haben wir jedoch nur die Spaltennummer und wissen noch nicht, welches das Ein-/Ausgabecontrol ist. Die Column hat jedoch eine abfragbare Eigenschaft namens CurrentControl. Diese leistet uns in diesem Fall gute Dienste. Im Zusammenspiel mit dem Controls()-Array des Grids können wir uns den Namen des Objektes zusammenbauen und evaluieren.
loObj = Thisform.ActiveControl
IF loObj.Baseclass = [grid]
liCol = loObj.ActiveColumn
loObj = EVALUATE([loObj.Columns(liCol).] + loObj.Columns(liCol).CurrentControl
ENDIF
Jetzt müssen wir nur noch eines Bedenken. Was passiert, wenn der Anwender die Reihenfolge der Spalten verändert? In diesem Fall erhalten wir bei der Abfrage über ActiveColumn dummerweise nicht mehr die korrekte Spaltenummer. Genau genommen haben wir sie auch vorher nicht bekommen. Da die Spalten jedoch noch in ihrer ursprünglichen Reihenfolge waren stimmten einfach nur die Werte überein.
ActiveColumn liefert also nicht die Column-Nummer sondern die ColumnOrder zurück. Um nun den Verweis auf die richtige Spalte zu erhalten müssen wir in einer Schleife den Columns()-Array solange durchlaufen bis der Wert aus ActiveColumn und ColumnOrder übereinstimmt. Auf dieser Basis kann dann die richtige Objektreferenz erzeugt werden.
loObj = Thisform.ActiveControl
IF loObj.Baseclass = [grid]
liCol = loObj.ActiveColumn
FOR i = 1 TO loObj.ColumnCount
IF loObj.Columns(i).ColumnOrder = liCol
liCol = i
EXIT
ENDIF
ENDFOR
loObj = EVALUATE([loObj.Columns(liCol).] + loObj.Columns(liCol).CurrentControl)
ENDIF
Keine Kommentare:
Kommentar veröffentlichen