![]() |
AW: TabOrder dynamisch...
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:
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":FCols: Integer; // Number of input columns. FActiveCol: Integer; // The active column to tab through. FTabOrders: TArray<TArray<TWinControl>>; // The TabOrderLists for the columns.
Delphi-Quellcode:
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:
procedure TFrameQnr.GetTabOrderList(List: TList);
// Get the actual (prepared) tab order. begin for var P in FTabOrders[FActiveCol] do List.Add(P); end;
Delphi-Quellcode:
Hatte das Anfang über die "Tag"-Eigenschaft gemacht, diese verwende ich aber nur sehr ungerne.
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; 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:
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.
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; In diesem Sinne. Nochmal vielen Dank für eure tolle Unterstützung. Alex |
AW: TabOrder dynamisch...
Zitat:
![]() Zitat:
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). |
AW: TabOrder dynamisch...
[QUOTE=himitsu;1507084]
Zitat:
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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 by Thomas Breitkreuz