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
Thema durchsuchen
Ansicht
Themen-Optionen

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 2 von 3     12 3      
Optiplex

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

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 12. Mai 2009, 11:47
Ich habe mir darüber gedanken gemacht, ob man mit Findcomponent und der Abfrage noch dem Typ der Komponente sowie mit dem Vorschlag von Blup mit der Tag Eigenschaft, wenn nötig könnte man auch PosX/PosY (aber das hat man eigendlich schon mit Left/Top) als Eigenschaft in die Kombo mit einfließen lassen, irgendwie ans Ziel kommen könnte. Bin aber immer noch nicht zu einem positiven Ergebnis gekommen, tue mich sehr schwer mit der Positionsauswertung der einzelnen Kombos und weis nicht wie ich da rangehen soll, oder sehe ich den Wald vor lauter Bäumen nicht.

Aber Danke, dass ihr euch immer noch mit meinem Problem beschäftigt.

Dieter
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#12

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 12. Mai 2009, 11:55
Dafür ist es ja eine Community

Also so kannst du deine Komponenten iterieren und deren Position zur Form bestimmen
Delphi-Quellcode:
var
  i: Integer;
begin
  for i := 0 to Self.ComponentCount - 1 do
    if Self.Components[i].ClassType = TEdit then
      ShowMessage(IntToStr(TEdit(Self.Components[i]).Left));
end;
Hab das jetzt mal beispielsweise für ein Edit gemacht. Musst du natürlich auf deine Komponenten überarbeiten. Wenn du das OO machen willst, musst du über eine Liste verfügen, die über alle instanzierten Objekte bescheid weiß. Da wäre es vielleicht sogar besser wenn du über diese Klasse dann sogar die gesamte Erstellung der Komponenten auf der Form regelst und ihr die Darstellungs- und Verwaltungsintelligenz überträgst.

Edit:
Zitat:
wenn nötig könnte man auch PosX/PosY (aber das hat man eigendlich schon mit Left/Top) als Eigenschaft in die Kombo mit einfließen lassen
Das ist in der Komponente doch schon enthalten.

Edit2:
Mal nur reinweg zum probieren geht das auch so
Delphi-Quellcode:
var
  i: Integer;
  o : TObject;
begin
  o := nil;

  for i := 0 to Self.ComponentCount - 1 do
    if Self.Components[i].ClassType = TEdit then
    begin
      if TEdit(Self.Components[i]).Left > TButton(Sender).Left then
        if o = nil then
          o := Self.Components[i]
        else
        if TEdit(Self.Components[i]).Left < TEdit(o).Left then
          o := Self.Components[i];
    end;
    ShowMessage(TEdit(o).Text);
end;
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
Optiplex

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

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 12. Mai 2009, 14:19
Danke für den Source Lars, werden mich gleich mal ans ausprobieren machen. Leider muss ich dann wieder weg und kann mich erst Morgen wieder melden.

Gruss Dieter
  Mit Zitat antworten Zitat
Optiplex

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

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 13. Mai 2009, 08:19
Hallo ich hoffe ihr seit noch da.
Lars dein Source funtioniert in soweit,das der Button den Focus in das nächstliegende Edit nach rechts springen lässt, in abhängigkeit der For- Schleife.

Zitat von quendolineDD:

Edit2:
Mal nur reinweg zum probieren geht das auch so
Delphi-Quellcode:
var
  i: Integer;
  o : TObject;
begin
  o := nil;

  for i := 0 to Self.ComponentCount - 1 do
    if Self.Components[i].ClassType = TEdit then
    begin
      if TEdit(Self.Components[i]).Left > TButton(Sender).Left then
        if o = nil then
          o := Self.Components[i]
        else
        if TEdit(Self.Components[i]).Left < TEdit(o).Left then
          o := Self.Components[i];
    end;

    ShowMessage(TEdit(o).Text);
end;
leider verstehe ich die Schleife nicht ganz,

Delphi-Quellcode:
       else
        if TEdit(Self.Components[i]).Left < TEdit(o).Left then
          o := Self.Components[i];
mit diesem Bereich weis ich einfach nicht wann er angesprungen wird und wann nicht. Ich werde versuchen mit den Cursortasten eine Art Steuerung hinzubekommen. Oder hast du auch dafür eine schon eine Idee, denn über TObject das ganze zu probieren, wäre ich nicht gekommen.

Ich sag ja ich muss noch viel lernen.

Dieter
  Mit Zitat antworten Zitat
Optiplex

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

Re: mit den Cursortasten zum nächstliegende Control springen

  Alt 25. Mai 2009, 08:03
Hallo,
Ich muss diesen Thread nochmals aufnehmen da Ich einfach nicht weiterkomme. Ich habe die Vorschläge von oben in meiner Komponente im Keydown Ereignis (welches ich überschreibe) versucht umzusetzen. Es funktioniert soweit, dass ich mit den Cursortasten sowohl rechts als auch links jeweils an die oberste Komponente gesprungen wird. Hoch und runter funktioniert nur wenn die Komponenten in der Tab-Reihenfolge stehen und Enabled sind, ist auch nur eins davon nicht Enabled bleibt der Focus hängen. Vielleicht kann jemand mal auf meinen Text schauen und hat eine Idee für mich, zumindest, dass der Focus nicht hängen bleibt sonder zum nächsten gesprungen wird.
Delphi-Quellcode:
////////////////////////////////////////////////////////////////////////////////
// Die neuen Tastatur Ereignisse
//
procedure TPlanGame.KeyDown(var Key: Word; Shift: TShiftState);
var iii, xxx, aaa : integer;
  obj: tObject;
  break:Boolean;
begin
  obj:=nil;
    xxx:=1;
// break:=false;
  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]).TabOrder = TabOrder+xxx then obj:=Parent.Components[iii];
                  end;
          vk_up:begin
                      if TPlanGame(Parent.Components[iii]).TabOrder = TabOrder-xxx then obj:=Parent.Components[iii];
                  end;
        end;
      end;
    end;
    if obj=nil then
      exit
    else if TPlanGame(obj).Enabled and TPlanGame(obj).Visible then TPlanGame(obj).Setfocus;
  inherited;
end;
//===
Gruß Dieter
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#16

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 25. Mai 2009, 09:07
Solange du selbst nicht beschreiben kannst, nach welcher eindeutigen Regel ein anderes Steuerelement ausgewählt werden soll, kann man dafür auch kein Programm schreiben.

Das ausgewählte Steuerelement ist bekannt.
Ermittle den entsprechenden Knoten im Baum.
Wähle nach der gewünschten Funktionalität den nächsten Knoten aus.
Ermittle das entsprechende Steuerelement.
Den Fokus setzen dürfte klar sein.
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 25. Mai 2009, 09:18
Ich schau mir das heut Mittag oder Nachmittag mal an. Ist gerade noch zu früh.
TObject habe ich verwendet, da es die "Mutter" aller Klassen ist und somit auch die Superklasse aller von ihr abgeleiteten Klassen, kann sie auch alle (dank der Polymorphie) in direkter Vererbungslinie stehenden Klassen beherbergen.
Dann solltest du zur Übersicht vielleicht noch eine Variable vom Typ TPlanGame erstellen und in jeder Schleife einmal variable := TPlanGame(Parent.Components[iii]); Und dann darauf jeweils zugreifen mit variable.left usw. Das macht alles etwas übersichtlicher.

Dann zu meinem obigen Quelltext. Es hat mir lediglich das Edit genannt welches am nähesten Rechts von dem Button ist.
Vielleicht solltest du alle deine Objekte aus der Taborder nehmen und diesen einfach den Fokus zuweisen mit MSDN-Library durchsuchenSetFocus.

Edit: Rechtschreibfehler entfernt.
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#18

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 25. Mai 2009, 09:23
Zitat von Blup:
Das mit dem Array war ja nur eine möglichst allgemeingültiger Lösungsansatz.
Wenn du die Beziehungen zwischen den einzelnen Kombos bereits in einer Baumstruktur vorliegen hast, kannst du den jeweiligen linken oder rechten Nachbarn auch daraus ermitteln.
Dafür benötigt man natürlich Kenntniss über deine Datenstruktur für den Baum.

Alternativ könnte man auch im Tag der Kombo ihre relative Position im Baum speichern.
z.B so:
Tag := x + y * 100
x := Tag mod 100
y := Tag div 100
Ist zwar etwas [OT] aber dieses Beispiel ist etwas irreleitend meiner Meinung nach, wenn x >100 ist, dann sollte man eigentlich immer falsche Werte raus bekommen (so auf den ersten Blick, glaube ich) [/OT]
2. Account Sero
  Mit Zitat antworten Zitat
Optiplex

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

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 25. Mai 2009, 11:40
hallo Blub,

Zitat von Blup:
Solange du selbst nicht beschreiben kannst, nach welcher eindeutigen Regel ein anderes Steuerelement ausgewählt werden soll, kann man dafür auch kein Programm schreiben.

Das ausgewählte Steuerelement ist bekannt.
Ermittle den entsprechenden Knoten im Baum.
Wähle nach der gewünschten Funktionalität den nächsten Knoten aus.
Ermittle das entsprechende Steuerelement.
Den Fokus setzen dürfte klar sein.
Also ich möchte mit den Cursortasten innerhalb meiner Komponente (hier TPlanGame) springen und zwar so,dass wenn ich Rechts drücke das nächstliegende TPlanGame rechts angesprungen wird usw.
was ich bis jetzt erreicht habe, ist das das oberste element rechts bzw. links angesprungen wird und dann mit den Auf/Ab tasten zum Element gesprungen werden kann. Nur wenn ein Elenemt bei auf und ab nicht Enabled ist bleibt es auf den aktiven Elenemt hängen, und das ist nätürlich nicht ackzeptabel da die darunterliegenden Elemente nie erreicht werden können.Die weitere Problematik besteht darin, dass diese Steuerung innerhalb der Komponente TPlanGame integriert wurde.


Hallo quendolineDD,
danke dass du dich damit beschäftigen willst.

Gruss Dieter
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: mit den Cursortasten zum nächstliegen Control springen

  Alt 25. Mai 2009, 12:30
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 00:54 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