Donnerstag, 22. November 2007

So finden wir das aktuelle Objekt innerhalb eines Grids / How to find the current object within a grid

Klar, das aktuelle Control einer Form ist schnell gefunden:
 
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