Hallo,
nur über die Koordinaten der Elemente wird das schwierig bis unmöglich eine exakte Steuerung hinzubekommen.
Ich denke das das Element wissen muss welches Element(z.B. ComponentIndex) bei welcher Taste angesteuert werden muss.
Um bei diesen Spielplänen eine exakte Steuerung zu realisieren würde ich:
Entweder
dazu ein Referenz-Array benutzen, in dem der jeweilige ComponentIndex des Elements vorbelegt wird, zu dem gewechselt werden soll. Das Array muss dann zum einen die Dimension der Summe der Elemente und in der zweiten Dimension für jede Richtung ein Feld enthalten.
Code:
Beispiel -------
-Spielplan: | 0 |
------- const REF : Array [0..8,0..3] of Integer =
------- ------- ((1,-1,2,4), //0
| 1 | | 2 | (3,-1,0,6), //1
------- ------- (1,-1,5,7), //2
------- ------- ------- (-1,-1,1,-1), //3
| 3 | | 4 | | 5 | (1,0,2,8), //4
------- ------- ------- (,,,),
------- ------- (,,,),
| 6 | | 7 | (,,,),
------- ------- (,,,))
-------
| 8 |
-------
Der Zugriff vereinfacht:
Delphi-Quellcode:
i := ComponentIndex;
case Key of
VK_LEFT : TGameElem(TGame.Components[REF[i,0]]).SetFocus;
VK_UP : TGameElem(TGame.Components[REF[i,1]]).SetFocus;
Bzgl. Enabled etc. kannst Du ja prüfen und gegebenenfalls über das Referenz-Array das nächste anzusteuernde Element ermitteln,
oder bis es auf einen Index -1 trifft und dann den Focus nicht setzt.
Angenommen Element 0 hat den Focus, Key ist VK_DOWN und Element 4 ist disabled.
=> Im Feld [0,3] ist der Hinweis auf den Index 4
=> Element 4 ist disabled
=> im Feld [4,3] ist der Hinweis auf den Index 8
=> prüfen, Focus auf Element 8 setzen.
oder
die Elemente bekommen direkt einen (Index)Zeiger auf die jeweiligen Richtungs-Elemente mit
z.B. bei Element 0
Delphi-Quellcode:
Elem.ElemIndexLeft := 1;
Elem.ElemIndexUp := -1;
Elem.ElemIndexRight := 2;
Elem.ElemIndexDown := 4;