Eventuell wäre eine Visualisierung hilfreich.
Das du nur auf die obersten Komponente des Planes springst kommt daher, das du dem Parent den Fokus gibst. Du müsstest dann innerhalb des nächsten TPlanGame das gewünschte Unterelement noch direkt anvisieren.
Wenn ich mich nicht vertan habe, ist das hier selbiger Code wie oben nur etwas übersichtlicher. Auch nutze ich eine andere Technik der Einrückung.
Delphi-Quellcode:
var
i: Integer;
TmpObj, TPGObj : TPlanGame;
begin
TmpObj := nil;
for i := 0 to Parent.ComponentCount - 1 do
if Parent.Components[i].ClassType = TPlanGame then
begin
TPGObj := Parent.Components[i];
if TPGObj.Enabled and TPGObj.Visible then
case Key of
VK_RIGHT :
begin
if TPGObj.Left > Self.Left then
if Obj = nil then
TmpObj := TPGObj
else
begin
if TPGObj.Left < TmpObj.Left then
TmpObj := TPGObj
else
if TPGObj.Left = TmpObj.Left then
if TPGObj.Top < TmpObj.Top then
TmpObj := TPGObj;
end;
end;
VK_LEFT :
begin
if TPGObj.Left < Self.Left then
if TmpObj = nil then
TmpObj := TPGObj
else
begin
if TPGObj.Left > TmpObj.Left then
TmpObj := TPGObj
else
if TPGObj.Left = TmpObj.Left then
if TPGObj.Top < TmpObj.Top then
TmpObj := TPGObj;
end;
end;
VK_UP :
begin
if TPGObj.TabOrder = Self.TabOrder - 1 then
TmpObj := TPGObj;
end;
VK_DOWN :
begin
if TPGObj.TabOrder = Self.TabOrder + 1 then
TmpObj := TPGObj;
end;
end;
end;
if TmpObj <> nil then
if TmpObj.Enabled and TmpObj.Visible then
TmpObj.SetFocus;
inherited;
end;
Edit: inherited sollte schon noch in der Prozedur liegen
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.