AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi mit den Cursortasten zum nächstliegen Control springen

mit den Cursortasten zum nächstliegen Control springen

Ein Thema von Optiplex · begonnen am 11. Mai 2009 · letzter Beitrag vom 2. Jun 2009
Antwort Antwort
Seite 3 von 3     123
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#21

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 25. Mai 2009, 14:20
Hallo quendolineDD,
du hast recht dein Code sollte die selbe funktion haben wie meiner.
Zitat von quendolineDD:
Du müsstest dann innerhalb des nächsten TPlanGame das gewünschte Unterelement noch direkt anvisieren.
darin liegt das Problem, denn der Index von ComponentCount liegt bei der Erstellungsreihenfolge der einzelnen Komponenten und diese ist nur in der .DFM Datei zu ersehen und verändert sich außerdem sobald ich eine Komponente in den Hintergrund oder Vordergrund bringe (das heißt es kommt darauf an, wann die einzelnen Komponenten auf die Form geschoben werden). Bei einer For Schleife oder bei jeder anderen ist dann das herausfiltern des gewünschten Elements sehr schwierig, ich hatte gehofft, dass du eine Idee hast wie ich das Lösen könnte.

Dieter
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#22

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 25. Mai 2009, 22:41
Hallo,

den Index des Arrays Components kannst du per Code verändern, z.B.:
Button3.ComponentIndex := 0; eventuel hilft Dir das ja weiter.

Eine Komponente in den Hintergrund oder Vordergrund bringen verändert nicht den Index.

Zitat von quendolineDD:
Eventuell wäre eine Visualisierung hilfreich.
mach doch mal ein Screenshot damit man sich die Anordnung der Elemente besser vorstellen kann.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#23

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 26. Mai 2009, 08:08
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.
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#24

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 27. Mai 2009, 08:07
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
Miniaturansicht angehängter Grafiken
turnierplan_233.jpg  
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#25

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 28. Mai 2009, 08:01
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
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#26

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 28. Mai 2009, 19:19
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;
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#27

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 29. Mai 2009, 08:24
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.
  Mit Zitat antworten Zitat
Optiplex

Registriert seit: 5. Mär 2008
131 Beiträge
 
Delphi 2005 Personal
 
#28

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 2. Jun 2009, 08:15
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:
////////////////////////////////////////////////////////////////////////////////
// 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;
//===
Gruss und Danke Dieter
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz