![]() |
Re: mit den Cursortasten zum nächstliegen Control springen
Hallo quendolineDD,
du hast recht dein Code sollte die selbe funktion haben wie meiner. Zitat:
Dieter |
Re: mit den Cursortasten zum nächstliegen Control springen
Hallo,
den Index des Arrays Components kannst du per Code verändern, z.B.:
Delphi-Quellcode:
eventuel hilft Dir das ja weiter.
Button3.ComponentIndex := 0;
Eine Komponente in den Hintergrund oder Vordergrund bringen verändert nicht den Index. Zitat:
|
Re: mit den Cursortasten zum nächstliegen Control springen
Hallo Lannes,
danke für den Tip mit Componentindex, ich werde mal sehen ob mich das weiterbringt. Einen Screenshot kann ich dir erst morgen mitbringen da ich zur Zeit bei der Maloche bin und Delphi und das Programm auf meinem Privatrechner sind. |
Re: mit den Cursortasten zum nächstliegen Control springen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Lannes,
vor lauter testerei Gestern habe ich den Printscreen vergessen, deshalb habe ich schnell einen schematischen Turnierplan für 16 Spieler erstellt, hier kann man die Anordnung der einzelnen Komponenten sehen. Jede Komponente stellt eine Partie mit zwei Spielern dar. Die Änderung des Komponentenindexes hat nichts gebracht. Dieter |
Re: mit den Cursortasten zum nächstliegen Control springen
Hallo zusammen,
also so langsam gebe ich diese Cursorsteuerung auf, ich habe jetzt noch mal zwei Abende probiert und getestet und scheitere immer noch beim überspringen der Komponenten(bei VK_Up,VK_Down) welche nicht Enabled sind. Entweder ich stehe voll auf dem Schlauch oder ich bin einfach nur zu doof um eine Lösung zu finden. Dass bei Rechts und Links immer das oberste Element angesprungen wird(Enabled wird hier berücksichtigt) damit könnte ich leben; nur dass bei Rauf und Runter der Focus hängen bleibt, wenn ein Element gesperrt ist, damit kann ich nicht leben, denn dann erreiche ich manche Elemente nicht. Von euch scheint auch keiner mehr eine Idee zu haben wie man das lösen könnte. Gruss Dieter |
Re: mit den Cursortasten zum nächstliegen Control springen
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:
Der Zugriff vereinfacht:
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 | -------
Delphi-Quellcode:
Bzgl. Enabled etc. kannst Du ja prüfen und gegebenenfalls über das Referenz-Array das nächste anzusteuernde Element ermitteln,
i := ComponentIndex;
case Key of VK_LEFT : TGameElem(TGame.Components[REF[i,0]]).SetFocus; VK_UP : TGameElem(TGame.Components[REF[i,1]]).SetFocus; 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; |
Re: mit den Cursortasten zum nächstliegen Control springen
Hallo Lars,
ich habe die Lösung gestern Abend gefunden, manchmal sieht man den Wald vor lauter Bäumen nicht. Die Lösung lag in der symetrischen Anordnung der Komponenten. Sobald ich den Code bereinigt und auskommentiert habe, stell ich die Lösung hier rein (kann allerding bis nächste Wo Dienstag dauern), damit auch ihr die Lösung habt, vielleicht kann der ein oder andere Sie ja mal gebrauchen. |
Re: mit den Cursortasten zum nächstliegen Control springen
So und hier wie versprochen die komplette Procedure, ich hoffe, dass einige von euch sie gebrauchen können, wenn jemand noch eine Verbesserung sieht oder macht gebt mir bitte Bescheid.
In die Komponente wurde eine besondere Tastatursteuerung integriert damit diese einwandfrei funktioniert ist folgendes zu beachten: 1- mit den Cursortasten kann nur innerhalb der Komponentenklasse gesprungen werden 2- mit den Cursortasten rechts und links kann jeweils auf die oberste Komponente in der nächsten Reihe rechts oder Links gesprungen werden. 3- mit den Cursortasten rauf und runter kann dann in der Reihe eine Komponente nach oben oder unten gesprungen werden.Damit dies Funktioniert müssen die Komponenten innerhalb der Reihe den gleichen X-Achsenwert (Left) haben. 4- mit der Space-Taste wird das Click-Ereignis ausgelöst. 5- die Tab-Taste funktioniert wie bisher nach der Taborder.
Delphi-Quellcode:
Gruss und Danke Dieter
////////////////////////////////////////////////////////////////////////////////
// Die neuen Tastatur Ereignisse // procedure TPlanGame.KeyDown(var Key: Word; Shift: TShiftState); var iii:integer; obj: tObject; begin obj:=nil; If (Key=vk_Right) or (Key=vk_Left) or (Key=vk_Down) or (Key=vk_up)then begin for iii :=0 to Parent.ComponentCount-1 do if Parent.Components[iii].classtype=TPlanGame then begin if TPlanGame(Parent.Components[iii]).enabled and TPlanGame(Parent.Components[iii]).Visible then //begin case Key of vk_Right: begin if TPlanGame(Parent.Components[iii]).Left > Left then if obj=nil then obj:= Parent.Components[iii] else begin if (TPlanGame(Parent.Components[iii]).Left < TPlanGame(obj).Left) then obj:=Parent.Components[iii]; if (TPlanGame(Parent.Components[iii]).Left = TPlanGame(obj).Left) then if (TPlanGame(Parent.Components[iii]).Top < TPlanGame(obj).Top)then obj:=Parent.Components[iii]; end; end; vk_Left: begin if TPlanGame(Parent.Components[iii]).Left < Left then if obj=nil then obj:= Parent.Components[iii] else begin if (TPlanGame(Parent.Components[iii]).Left > TPlanGame(obj).Left) then obj:=Parent.Components[iii]; if (TPlanGame(Parent.Components[iii]).Left = TPlanGame(obj).Left) then if (TPlanGame(Parent.Components[iii]).Top < TPlanGame(obj).Top)then obj:=Parent.Components[iii]; end; end; vk_Down: begin if (TPlanGame(Parent.Components[iii]).Left = Left) and (TPlanGame(Parent.Components[iii]).Top > Top)then if obj=nil then obj:= Parent.Components[iii] else if (TPlanGame(Parent.Components[iii]).Top < TPlanGame(obj).Top) then obj:=Parent.Components[iii]; end; vk_up: begin if (TPlanGame(Parent.Components[iii]).Left = Left) and (TPlanGame(Parent.Components[iii]).Top < Top)then if obj=nil then obj:= Parent.Components[iii] else if (TPlanGame(Parent.Components[iii]).Top > TPlanGame(obj).Top) then obj:=Parent.Components[iii]; end; end; //end; end; if obj<>nil then if TPlanGame(obj).Enabled and TPlanGame(obj).Visible then TPlanGame(obj).Setfocus; end; if Key=VK_Space then Click; inherited; end; //=== |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz