AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TabOrder dynamisch...

Ein Thema von BigAl · begonnen am 6. Jun 2022 · letzter Beitrag vom 9. Jun 2022
Antwort Antwort
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
624 Beiträge
 
Delphi XE6 Enterprise
 
#1

AW: TabOrder dynamisch...

  Alt 7. Jun 2022, 11:43
Wie "priorisiert" sind denn die Felder? Ist es erlaubt, die aktuelle Reihe jederzeit etwa mit der Maus zu verlassen, um eine andere Reihe abzuarbeiten?

Ich habe das mal gemacht für ein Formular, wo die jeweils gewählte Reihe auf gar keinen Fall verlassen werden durfte (außer Programmende), bis man zum letzten Feld kam oder auf dem ersten Feld stand. Da wurden dann einfach sämtliche Felder außerhalb der Reihe auf enabled=false gesetzt...
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#2

AW: TabOrder dynamisch...

  Alt 8. Jun 2022, 05:45
Wie "priorisiert" sind denn die Felder? Ist es erlaubt, die aktuelle Reihe jederzeit etwa mit der Maus zu verlassen, um eine andere Reihe abzuarbeiten?

Ich habe das mal gemacht für ein Formular, wo die jeweils gewählte Reihe auf gar keinen Fall verlassen werden durfte (außer Programmende), bis man zum letzten Feld kam oder auf dem ersten Feld stand. Da wurden dann einfach sämtliche Felder außerhalb der Reihe auf enabled=false gesetzt...
Das ist eben der Punkt. Die Spalte kann z.B. mit der Maus verlassen werden. Dann ist halt eine andere Spalte aktiv.

Nochmal zum Verständnis: Es geht z.T. um mehrere hundert Eingabe-Controls pro Form. Spalte 1 enthält z.B. die Daten im imperialen Format, Spalte 2 die entsprechenden metrischen Pendants. Oder Spalte 1 enthält die Daten in Fremdwährung pro imperialer Einheit, Spalte 2 die Daten in Fremdwährung pro metrischer Einheit und Spalte 3 die Daten in Euro pro metrischer Einheit. Das sieht dann am Bildschirm so aus:

2022-06-08 06_35_15-BSE BEST PRACTICE.png

Oder so:

2022-06-08 06_39_21-BSE BEST PRACTICE.png

Wird ein Wert in einer beliebigen Spalte eingegeben, dann werden die Werte in den anderen Spalten automatisch berechnet. Die Blöcke werden halt immer wieder durch Eingaben unterbrochen, welche z.B. einspaltig sind. Grundsätzlich soll die Eingabe von oben nach unten erfolgen. Es kann aber z.B. sein, dass die Werte imperial vorliegen, aber einzelne Ausnahmen (z.B. ein Block) dann doch metrisch sind. Der Benutzer muss also die Möglichkeit haben zwischendurch gezielt (z.B. mit der Maus) die Spalte zu wechseln...
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: TabOrder dynamisch...

  Alt 8. Jun 2022, 09:46
Hallo,

ich würde den Ansatz von Uwe verfolgen.

im Anhang ein Testprojekt

Gruss Fritz
Angehängte Dateien
Dateityp: zip TabOrder.zip (2,1 KB, 5x aufgerufen)
Fritz Westermann
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#4

AW: TabOrder dynamisch...

  Alt 8. Jun 2022, 22:12
Hallo,

ich würde den Ansatz von Uwe verfolgen.

im Anhang ein Testprojekt

Gruss Fritz
Hallo Fritz,

habe eben mal das Beispiel von Dir angeschaut. Wie ich oben schon erwähnt habe werde ich den Ansatz mit "GetTabOrderList" verfolgen. Ich kann zwar Dein Beispiel so nicht übernehmen, da der Aufbau meiner Formulare etwas komplexer ist (die Formulare basieren auf Datenbanktabellen und verschiedenen JSON-Dateien), aber man kann sehen, dass es grundsätzlich funktioniert.

Vielen Dank!

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#5

AW: TabOrder dynamisch...

  Alt 9. Jun 2022, 11:04
Hallo zusammen,

hat perfekt funktioniert. Der Lösungsansatz über "GetTabOrderList" war perfekt.

Ich habe das nun folgendermaßen implementiert (falls mal jemand was ähnliches machen will):

Zum Verwalten der Tabulatorreihenfolgen habe ich folgende Member angelegt:

Delphi-Quellcode:
    
    FCols: Integer; // Number of input columns.
    FActiveCol: Integer; // The active column to tab through.
    FTabOrders: TArray<TArray<TWinControl>>; // The TabOrderLists for the columns.
In "TabOrders" speichere ich die Reihenfolge für die verschiedenen möglichen Spalten. Diese werden dann einfach in "GetTabOrderList" aktiviert, je nach Wert in "FActiveCol":

Delphi-Quellcode:
procedure TFrameQnr.GetTabOrderList(List: TList);
// Get the actual (prepared) tab order.
begin
  for var P in FTabOrders[FActiveCol] do
    List.Add(P);
end;
Jedem der Inout-Controls habe ich noch ein "OnMouseDown" und ein "OnKeyDown" verpasst. Klickt der Benutzer in eine bestimmte Spalte, so wird diese in den Listen gesucht und als aktiv gesetzt:

Delphi-Quellcode:
procedure TFrameQnr.OnDBEditMouseDown(ASender: TObject; AButton: TMouseButton; AShift: TShiftState; AX, AY: Integer);
// Switch the active column if a DBEdit is selected by mouse click.
begin
  // Find the first column that contains the control.
  for var ColIndex := 0 to High(FTabOrders) do
    for var Control in FTabOrders[ColIndex] do
      if ASender = Control then
      begin
        FActiveCol := ColIndex;
        Exit;
      end;
end;
Hatte das Anfang über die "Tag"-Eigenschaft gemacht, diese verwende ich aber nur sehr ungerne.

Da ich immer auch eine tastaturbasierte Lösung bereitstelle habe ich in "OnKeyDown" die Möglichkeit geschaffen die Spalte über Hotkeys zu wechseln:

Delphi-Quellcode:
procedure TFrameQnr.OnDBEditKeyDown(ASender: TObject; var AKey: Word; AShift: TShiftState);
// Enable <Ctrl><Tab> and <Ctrl><Shift><Tab> to change the active column.

  function GetActiveControlIndex: Integer;
  begin
    for var I := 0 to High(FTabOrders[FActiveCol]) - 1 do
      if FTabOrders[FActiveCol][I] = TControl(ASender) then
        Exit(I);
    Result := -1;
  end;

  procedure SetActiveControlIndex(AIndex: Integer);
  begin
    if (AIndex >= 0) then
      FTabOrders[FActiveCol][AIndex].SetFocus;
  end;

var
  Index: Integer;
begin
  if AKey = VK_TAB then
  begin
    if AShift = [ssCtrl] then // next column
    begin
      Index := GetActiveControlIndex;
      if (FActiveCol < FCols - 1) and (FTabOrders[FActiveCol][Index] <> FTabOrders[FActiveCol + 1][Index]) then
      begin
        Inc(FActiveCol);
        SetActiveControlIndex(Index);
      end;
      AKey := 0;
    end
    else if AShift = [ssCtrl, ssShift] then // previous column
    begin
      Index := GetActiveControlIndex;
      if (FActiveCol > 0) and (FTabOrders[FActiveCol][Index] <> FTabOrders[FActiveCol - 1][Index]) then
      begin
        Dec(FActiveCol);
        SetActiveControlIndex(Index);
      end;
      AKey := 0;
    end;
  end;
end;
Das war es im Wesentlichen schon. Am aufwendigsten war die ursprüngliche Erstellung der Arrays mit den Reihenfolgen. Diese ist aber sehr programmspezifisch und es macht keinen Sinn, dass ich diese hier poste.

In diesem Sinne. Nochmal vielen Dank für eure tolle Unterstützung.

Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)

Geändert von BigAl ( 9. Jun 2022 um 13:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.359 Beiträge
 
Delphi 12 Athens
 
#6

AW: TabOrder dynamisch...

  Alt 9. Jun 2022, 13:46
Zitat:
Hatte das Anfang über die "Tag"-Eigenschaft gemacht, diese verwende ich aber nur sehr ungerne.
Dabei ist Delphi-Referenz durchsuchenTComponent.Tag sogar extra nur für "dich" vorhanden.
Zitat von OH:
Tag hat keine vordefinierte Bedeutung. Die Eigenschaft Tag kann zusätzliche Integerwerte speichern, um die Arbeit des Programmierers zu erleichtern.

Im FMX gibt es zusätzlich auch noch TagFloat, TagObject und TagString .... nur schade, dass Diese nicht im Formdesigner verfügbar sind (abgesehn vom Objekt hätte der OI damit kein Problem).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 9. Jun 2022 um 13:49 Uhr)
  Mit Zitat antworten Zitat
BigAl

Registriert seit: 6. Sep 2008
Ort: Kehl
504 Beiträge
 
Delphi 12 Athens
 
#7

AW: TabOrder dynamisch...

  Alt 9. Jun 2022, 13:51
[QUOTE=himitsu;1507084]
Zitat:
Dabei ist Delphi-Referenz durchsuchenTComponent.Tag sogar extra nur für "dich" vorhanden.
Außer ein anderer hat da schonmal was "Quick and Dirty" mit angestellt .

Ich nutze die Tag-Eigenschaft eigentlich nur um mal schnell was zu testen oder so. Ich habe da einfach zu viel Angst, dass ich das irgendwann mal versehentlich mehrfach verwende und es dann knallt. Wäre zwar auch keine große Sache das zu fixen aber jeder hat halt so seine eigenen Regeln bezüglich "sauberem Code" .

Aber grundsätzlich hast Du natürlich recht.
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:24 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