Focus setzen im Frame

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
juelin
Beiträge: 297
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Focus setzen im Frame

Beitrag von juelin »

Hallo,
ich muss leider nochmal nerven, sorry.
Ich habe ein Frame das ich aus der Form aufrufen. Siehe Anhang frame2.
Also ich gehe folgendermaßen vor.
1. Drücke ich den Button "Anlegen Person".
In der Routine TFrame2.Button1Click bereite ich die ComboBox1 (Personenart) vor und geben den Focus
mit Form1.ActiveControl:=Form1.Frame2.ComboBox1; an die ComboBox1.
Das funktioniert auch.
2. Nach der Auswahl in der ComboBox1
In der Routine TFrame2.ComboBox1Change bereite ich den Edit1 (Vorname) vor und geben den Focus
mit Form1.ActiveControl:=Form1.Frame2.Edit1; an den Edit1.
Das funktioniert auch.
3. Nach der Eingabe in Edit1
In der Routine TFrame2.Edit1KeyUp bereite ich den Edit2 (Nachname) vor und geben den Focus
mit Form1.ActiveControl:=Form1.Frame2.Edit2; an den Edit2.
Hier bekomme ich den Fehler Anhang Focus auf den Befehl: Form1.ActiveControl:=Form1.Frame2.Edit2
Frame2 ist in Unit1 definiert

type
{ TForm1 }
TForm1 = class(TForm)
Frame1: TFrame1;
Frame2: TFrame2;


Ich habe keine Ahnung warum.
Kann mir da Jemand helfen?

Das wäre toll.
Danke und Gruß
Jürgen
Dateianhänge
Focus.jpg
Focus.jpg (21.74 KiB) 2160 mal betrachtet
frame2.jpg
frame2.jpg (255.98 KiB) 2160 mal betrachtet

charlytango
Beiträge: 1092
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Focus setzen im Frame

Beitrag von charlytango »

In so einem Frame würde ich alle Vorbereitungsarbeiten (also das Befüllen der Drop-Down Listen etc) in einer eigenen Prozedur machen

Code: Alles auswählen

public 
   procedure Init;
Die Reihenfolge der Edits wird über das Property TabControl gesteuert. Dafür gibt es auch einen eigen Editor "Tab Order".

Dann kann man dann die Editfelder mit dem Tabulator durchwechseln. Ein eigenes Setzen des Eingabefokus ist dann nicht nötig. Standardmäßig wechselt man unter Windows mit Tabulator von einem zum anderen Feld und Enter/Return "drückt" den Default Button.


Ich verstehe irgendwie nicht warum du so einen Befehl

Code: Alles auswählen

Form1.ActiveControl:=Form1.Frame2.Edit2
überhaupt brauchst.

Ein Frame macht ja doch nur dann Sinn wenn das Frame praktisch autark funktioniert, also alles was es anzuzeigen, einzugeben und ggfs zu speichern gibt selbst im Frame erledigt wird.

Benutzeravatar
juelin
Beiträge: 297
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Focus setzen im Frame

Beitrag von juelin »

Hallo,
charlytango hat geschrieben
Die Reihenfolge der Edits wird über das Property TabControl gesteuert. Dafür gibt es auch einen eigen Editor "Tab Order".
Leider ist die Sache nicht so einfach.
Bei mir ist das so.
Nicht der Anwender bestimmt wann er wo was eingibt.
Ich bestimme wann wo der Anwender was ein zu geben hat.
Bei mir ist immer nur ein Eingabefeld zur Eingabe bereit.
Das muss auch so sein, denn die Eingabe verläuft nicht linear.
Abhängng von Eingaben die gemacht wurden wird die Reihenfolge der Eingabe geändert
und bestiimt Eingabefelder ausgelassen.
Meine Frage war ja.
Warum funktioniert der Befehl: Form1.ActiveControl:=Form1.Frame2.Edit2 2 mal und bei dritten mal kommt die Fehlermeldung?
Gruß
Jürgen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6853
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Focus setzen im Frame

Beitrag von af0815 »

juelin hat geschrieben: So 27. Okt 2024, 09:42 Warum funktioniert der Befehl: Form1.ActiveControl:=Form1.Frame2.Edit2 2 mal und bei dritten mal kommt die Fehlermeldung?
Diese Fehlermeldung kommt immer dann, wenn für das Betriebsystem das angeforderte Control nicht sichtbar oder deaktiviert ist. Warum das so ist, kann man aus der Ferne nicht unbedingt sehen.
Es reicht schon , wenn ein anders Fenster/Dialog mal den Focus hat, das muss nicht einmal dein eigens Programm sein. Ich lasse - für mich - die Finger vom ActiveControl springereien und verwende die TabOrder als auch ReadOnly oder Enabled/Disabled.

Bei Editfeldern ReadOnly und die Taborder setzten. Beides kannst du ja im Code ändern so wie du es zu glauben brauchst. Wennb du es sauber haben willst, dann sollte das Frame alleine die ganze Arbeit machen und nicht quer über die Parentform. Wenn der Code selbst gut ist, braucht man das Frame nur einbinden und es passt. Für so sprungfrickeleien ist es besser du verwendet kein Frame, da entfällt eine Schicht die man beachten muss.
Zuletzt geändert von af0815 am So 27. Okt 2024, 11:19, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Sieben
Beiträge: 292
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Focus setzen im Frame

Beitrag von Sieben »

Vertraue der Fehlermeldung. Damit ein Control Focus erhalten kann, muss es a) Visible und b) Enabled sein. Im übrigen scheint mir das auch eine ungewöhnliche und grausame Art der Benutzerführung zu sein. Und dann noch in KeyUp...? Ich würde, wenn schon, dann wohl eher an OnExit denken. Und den Ratschlag, aussagekräftige Bezeichner für Units, Forms und Komponenten zu wählen, scheinst du auch weiterhin in den Wind zu schlagen. Natürlich muss ich das nicht verstehen, und glücklicherweise auch nicht den Sourcecode warten.

Benutzeravatar
juelin
Beiträge: 297
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Focus setzen im Frame

Beitrag von juelin »

Hallo af0815 ,
das mit dem TabOrder ist ja schön und gut.
Aber man muss ganz schön die Tab-Taste drücken bis man zu 14. Editfeld kommt.
Das muss doch auch einfacher gehen.
Gruß
Jürgen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6853
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Focus setzen im Frame

Beitrag von af0815 »

juelin hat geschrieben: So 27. Okt 2024, 11:46 Hallo af0815 ,
das mit dem TabOrder ist ja schön und gut.
Aber man muss ganz schön die Tab-Taste drücken bis man zu 14. Editfeld kommt.
Das muss doch auch einfacher gehen.
Gruß
Jürgen
Ich verstehe noch immer nicht wie die Bedienung sein soll ? Bei einer Eingabe geht man Feld für Feld vor. Oder wie gehst du in der Eingabemaske vor. Wenn ich 12 Felder überspringen will als Benutzer, dann eben mit der TabTaste.

Wie gesagt, ich sehe das Beispiel im Post und das sieht für mich wie eine stinknormale Eingabemaske aus, wo ich mit der TabOrder den Benutzer durchführe.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 1207
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Manjaro Linux, Mint und Windows 10 ,Lazarus 3.99, FPC-Version: 3.3.1
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Focus setzen im Frame

Beitrag von kralle »

Moin Jürgen,

1. Ich würde ein Abfrage-Formular machen und das was auf Grund von gemachten Eingaben nicht benötigt wird deaktivieren,
und der Fokus springt dann zum Nächsten nötigen Feld.

2. Wegen Eingabefeld 14: Du könntest das "Keypressed" vom Form/Frame abfangen und ein Eingabefeld für die Feldnummer anbieten.
Natürlich musst Du dann Deine Felder sichtbar nummerieren.

3. Was Dein Formular betrifft: Die Beschreibung der Eingabefelder sollte Linksbündig erfolgen. Mittig kannst Du bei einer Bildunterschrift machen.
Wie lesen von links nach rechts.
Denke an Menschen, die vielleicht durch die Bildschirmlupe schauen müssen und immer nur einen Teil sehen, die müssen dann immer den Textanfang suchen.

Gruß Heiko
OS: MX Linux, Linux Mint und Windows 10
FPC-Version: 3.3.1 , Lazarus 3.99
+ Delphi XE7SP1

Benutzeravatar
juelin
Beiträge: 297
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Focus setzen im Frame

Beitrag von juelin »

Also irgendwie reden wir aneinander vorbei.
Ich will eine Eingabe im Feld Strasse machen, das ist Edit3.
Alle anderen Editfelder stehen auf Readonly=True.
Edit3 steht auf Readonly=False und Enabled=True.
Ich kann in TabOrder von Edit3 reinmachen was ich will, ich muss immer MEHRMALSA die Tabtaste drücken bis
ich im Feld Sreasse was eingeben kann (am wenigsten mit Wert -1).
Und obwohl kein anderes Feld Eingabebereit ist sitzt der Cursor nicht da.
Der Corsor sollt aber SOFORT in diesem Feld stehen.

Das ganze ist ja ein Teil von Edit3.Control. (Focus setzen).
Kann man da nicht was machen?

Gruß
Jürgen

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1652
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Focus setzen im Frame

Beitrag von fliegermichl »

SelectNext selektiert das nächste aktivierbare Control und überspringt dabei diejenigen, die auf Enabled = False stehen. ReadOnly reicht nicht, weil das Feld damit immer noch selektiert werden kann. Es kann eben nur nicht überschrieben werden.

Benutzeravatar
Ally
Beiträge: 283
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: x64

Re: Focus setzen im Frame

Beitrag von Ally »

Hallo Jürgen,

was passiert wenn du, bei den Feldern die du nicht anspringen möchtest, TabStop auf False setzt?

Gruß
Roland

Benutzeravatar
juelin
Beiträge: 297
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Focus setzen im Frame

Beitrag von juelin »

Also hab ich alles ausprobiert.
Ich setzte alle anderen Eingaben (Edit und Combobox) auf

Code: Alles auswählen

      Edit8.Enabled:=False;
      Edit8.ReadOnly:=True;
      Edit8.TabStop:=False;
nur das Eingabefeld wo die Eingabe statfinden soll setzte ich auf

Code: Alles auswählen

        Edit7.Enabled:=True;
        Edit7.ReadOnly:=False;
        Edit7.TabStop:=True;
Aber es funktioniert nicht. Mein Eingabefeld besitzt nicht den Focus.
Habt Ihr noch andere Ideen?
Gruß
Jürgen
PS:denkt dran est ist keine Form sondern ein Frame.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6853
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Focus setzen im Frame

Beitrag von af0815 »

Hast du ein Beispiel ohne Abhängigkeiten, wo man das Testen kann ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1092
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Focus setzen im Frame

Beitrag von charlytango »

juelin hat geschrieben: So 27. Okt 2024, 11:46 Hallo af0815 ,
das mit dem TabOrder ist ja schön und gut.
Aber man muss ganz schön die Tab-Taste drücken bis man zu 14. Editfeld kommt.
Das muss doch auch einfacher gehen.
Ja klar geht das einfacher -- mit einem Mausklick oder einem zugeordneten Hotkey

Benutzeravatar
juelin
Beiträge: 297
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Focus setzen im Frame

Beitrag von juelin »

Hi,
so ich habe mal für alle, die sich mal an meinem Problem ausprobieren möchten in GitHup was reingestellt.
https://github.com/juelin2807/test
Für Source im Projektinspektor Printer4Lazarus einfügen
Nach Programmstart wird ein Verzeichnis für die Projekte erwartet (DirektoryDialog). Irgendwas auswählen und
anschliessend die Anzahl Projekte eingeben (10 genügen) und mit Button bestätigen.
Dann im Menü (oben in Rot) unter Person/Firma den Punkt Erstellen neues Personenfile auswählen.
Ein Verzeichnis für die Personen (DirektoryDialog). Irgendwas auswählen.
Dann im Menü (oben in Rot) unter Person/Firma den Punkt Personen verwalten auswählen.
Im nächsten Bild (Unit3) den Button Anlagen Person drücken.
Nach Auswahl der ComboBox Personenart (Person) wird eine Eingabe im Feld Vorname (Edit1) erwartet.
Aber der Cursor steht nicht drauf.

Entweder alle Felder eingaben oder im Taskmanager Programm abbrechen.

Bin mal gespannt, ob Ihr das Rätsel knackt.

Gruß
Jürgen

Antworten