September 24, 2020, 04:06:13

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Rückgabewert einer Optionsgruppe nach Fokusverlust

Begonnen von pmmuc, August 15, 2020, 18:36:29

⏪ vorheriges - nächstes ⏩

pmmuc

August 15, 2020, 18:36:29 Letzte Bearbeitung: August 15, 2020, 18:43:32 von pmmuc
Hallo Zusammen,
ich brauch mal wieder Hilfe.
Ich habe eine Optionsgruppe mit mehreren Buttons. Wenn ich die verschiedenen Buttons drücke wird jeweils eine Aktion ausgeführt was auch gut funktioniert.
Mein Problem ist, dass wenn die Optionsgruppe den Fokus verliert und ich dann einen Button der Gruppe drücke, erst beim zweiten Drücken die gewünschte Aktion ausgeführt wird.
Das Ereignis "Beim Hineingehen" wird zwar beim ersten Drücken ausgelöst, bringt aber dann den "alten" Button (der vor Fokusverlust gedrückt war) als Rückgabewert.
Die Ereignisse Beim Klicken, vor und nach Aktualisierung bringen zwar die Richtigen Werte werden aber erst beim zweiten drücken ausgelöst.
Gibt es eine Möglichkeit auch nach dem Fokusverlust sofort nach dem ersten Drücken eines Buttons der Optionsgruppe den dazugehörigen Wert bzw. Aktion zu erhalten.

Gruß
pmmuc

MzKlMu

Hallo,
das Problem kann ich nicht nachstellen.
Wenn ein Button der Gruppe gedrückt wird, verliert diese doch nicht den Fokus.

Beschreibe das mal genauer.
Gruß
Klaus

DF6GL

August 15, 2020, 19:51:44 #2 Letzte Bearbeitung: August 16, 2020, 10:43:41 von DF6GL
Hallo,

Zitat..habe eine Optionsgruppe mit mehreren Buttons.
??


Eine Optionsgruppe kann keine Buttons enthalten, allenfalls  Optionsfelder oder Kontrollkästchen..  >edit> und Umschaltflächen gehören auch dazu </edit>

pmmuc

Sorry, da war ich wohl etwas zu ungenau.
Ich habe eine Optionsgruppe mit 6 Umschaltflächen und ein Listenfeld. Durch drücken der Umschaltflächen werden die Anzeigekriterien für das Listenfled geändert und das Listenfeld entsprechend auf den neuen Inhalt aktualisiert. Klicke ich nun auf einen Eintrag im Listenfeld wird dieser ausgewählt. Damit ist der Fokus auch auf dem Listenfeld.
Klicke ich nun wieder auf eine Umschaltfläche in der Optionsgruppe werden erst beim zweiten Klick die neuen Kriterien im Listenfeld angewandt. Beim ersten Klick wird in der Optionsgruppe lediglich das Ereignis "Beim Hingehen" ausgelöst, das mir aber nichts nützt, da hier noch die vergangene Umschaltfläche aktiviert ist. Erst beim zweiten Klick wird dann die neu gedrückte Umschaltfläche über deren Ereignis "Bei Fokuserhalt" aktiviert oder die Ereignisse "Beim Klicken" bzw. "vor- und nach Aktualisierung" der Optionsgruppe die dann auch die richtigen Werte enthalten. Die Frage ist, muss hier tasächlich immer 2x drücken.
Gruß
pmmuc

pmmuc

August 15, 2020, 23:31:21 #4 Letzte Bearbeitung: August 15, 2020, 23:38:34 von pmmuc
Hallo,
ich habe nun herausgefunden, durch was dieses Verhalten verursacht wird.
Problem aber noch nicht ganz gelöst.
Um alle Textfelder im Formular zu leeren springe ich mit dem Klick auf die Umschaltfläche auch zu einem neuen Datensatz
Private Sub UmschaltflächeAlk_GotFocus()
    DoCmd.GoToRecord , , acNewRec
    Me!lstGefiltertNachName.RowSource = "SELECT DISTINCT ......
End Sub
Lass ich DoCmd.GoToRecord , , acNewRec weg, funktioniert alles wunderbar.

Nur wie bekomme ich dann meine Textfelder im Formular geleert ? Es handelt sich um gebundene Textfelder

Gruß
pmmuc

MzKlMu

Hallo,
warum willst Du die Textfelder leeren ?
Irgendwie verstehe ich Deinen Arbeitsablauf nicht.
Gruß
Klaus

pmmuc

Hallo,
durch drücken einer Umschaltfläche wird der Inhalt des Listenfeldes bestimmt. Im Listenfeld wird durch klicken ein Datensatz ausgewählt und die Textfelder mit den dazugehörigen Daten befüllt.
Wird nun über die Umschaltflächen der Inhalt des Listenfeldes verändert, bleiben aber die Inhalte der Textfelder noch mit den alten Feldinhalten bestehen. D.h. Inhalt Listenfeld und Inhalt Textfelder passen nicht mehr zusammen (so lange bis im Listenfeld ein neuer Datensatz ausgewählt wird und die Textfelder dadurch wieder aktualisiert werden).
Das ist der Grund warum die Textfelder geleert werden sollen.
Gruß
pmmuc

MzKlMu

Hallo,
einen neuen Datensatz anzufangen nur um die Felder zu leeren weil diese nicht mehr zum Listenfeld passen ist doch eine Krücke. Du musst die Anzeige wieder passend machen.

ZitatIm Listenfeld wird durch klicken ein Datensatz ausgewählt und die Textfelder mit den dazugehörigen Daten befüllt.
Wie genau wird das gemacht (VBA) ?
Gruß
Klaus

pmmuc

Hallo
Zitat von: undefineddas ist doch eine Krücke
wenn ich eine andere Möglichkeit hätte die Anzeige wieder passend zu machen, gerne.
Die Auswahl des Datensatzes erfolgt beim Klick auf das Listenfeld
Private Sub lstGefiltertNachName_Click()
    Me.Recordset.FindFirst "RezeptID = " & Str(Me!lstGefiltertNachName)
End Sub
Solange ich aber im Listenfeld nicht klicke, wird kein neuer Datensatz ausgewählt und es bleiben die "alten" Daten in den Textfeldern.
Darum diese "Krücke" auf einen neuen, leeren Datensatz zu springen.
gruß
pmmuc

MzKlMu

Hallo,
dann versuche es mal so:
Private Sub UmschaltflächeAlk_GotFocus()
    Me!lstGefiltertNachName.RowSource = "SELECT DISTINCT ......
    Me.Recordset.FindFirst "RezeptID = " & Me!lstGefiltertNachName
End Sub
Einfach auch hier noch mal suchen.
Auf das Str kann verzichtet werden.

Der Code der UmschaltflächeAlk und der Code der für FindFist gehören jeweils in das Ereigniss "Nach Aktualisierung".
Gruß
Klaus

pmmuc

Hallo,
ich habe nun zum Code in den Umschaltflächen "FindFirst" jeweils noch dazugefügt
Private Sub UmschaltflächeAlk_GotFocus()
    Me!lstGefiltertNachName.RowSource = "SELECT DISTINCT .....
    Me.Recordset.FindFirst "RezeptID = " & Me!lstGefiltertNachName
End Sub
und den Code für das Listenfeld in das Ereignis "Nach Aktualisierung" gestellt
Private Sub lstGefiltertNachName_AfterUpdate()
    Me.Recordset.FindFirst "RezeptID = " & Me!lstGefiltertNachName
End Sub
Am Verhalten im Formular hat sich leider nichts geändert.

Gruß
pmmuc

crystal

Hallo pmmuc,

etwas schwierig, deinen Beschreibungen und Ideen zu folgen.

Also so wie ich das verstehe...

1. Du zeigst in einem Formular irgendeinen Datensatz an.
2. Über Optionsfelder steuerst du den Inhalt eines Listenfelds, dessen Inhalt
3. auch richtig dargestellt wird.
4. Nun wählst du im Listenfeld einen anderen Datensatz aus.
5. Den weist du dem Formular zu.
6. Der andere Datensatz soll nun im Formular dargestellt werden.
7. Möglicherweise fehlt hier auch etwas Code im "Current"-Event.

Das ist zwar alles etwas seltsam, aber ich würde es mit einem
Me.Requery
versuchen. Dem Formular/dem Listenfeld eine neue Recordsource zuzuweisen, reicht m. E. nicht. Man muss auch noch sagen, dass die neue Recordsource auch geladen werden soll.

Ansonsten könnte es sein, dass die m. E. überflüssigen Events (bei Hineingehen, GotFocus etc.) schon versuchen, "irgendwas" zu machen, bevor eben der Event "Nach Änderung" ausgelöst wird. Ich würde diese Events mal ausschalten (z. B. im Code auskommentieren), da sie m. E. nur entstanden sind, um ein Resultat zu generieren, das eigentlich in den Event "Nach Änderung" gehört.

Bitte prüfe auch, ob du Events in einzelnen Optionsfeldern der Optionsgruppe hast, oder nur auf Änderung der Optionsgruppe reagierst (was richtiger wäre).

Es bringt m. E. nichts, diverse Events abzufangen und schon "etwas zu machen", z. B. wenn der Mauszeiger in eine Optionsgruppe geführt wird oder die Gruppe den Focus erhält, weil dann ja noch keine Benutzer-Aktion erfolgt ist oder sein muss. Bitte beschränke dich auf "sinnvolle" Events wie "AfterUpdate" UND lösche die überflüssigen anderen Events.

Letztlich könnte es hilfreich sein, zumindest ein paar Bilder deines Formulars hochzuladen.

Gruß,
crystal
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!

Aus gesundheitlichen Gründen nur noch selten dabei...

ebs17

Vermutlich solltest Du viel genauer beschreiben oder gleich eine aussagefähige Demo liefern, was Du da zusammenzimmerst.

Eine Optionsgruppe als Ganzes hat die Aufgabe, einen Rückgabewert über alles zu liefern. Der Rückgabewert wird dann nachfolgend ausgewertet, z.B. über eine Select Case-Weiche in Aktionen überführt.     
Was da drinnen die Knöpfe, Sternchen oder Flächen oder deren Ereignisse machen, ist da völlig uninteressant.
Primär würde mich nur der Rückgabewert aus AfterUpdate der Optionsgruppe interessieren.

Bei der Liebe zu Umschaltflächen müsste man vielleicht testen, ob  beim Drücken einer Fläche die andere(n) zurückgestellt werden müssen. Wenn Du den Flächen selber direkt Aktionen zuordnest, müsstest Du diese Experimentalprogrammierung auch selber beherrschen.
Mit freundlichem Glück Auf!

Eberhard

pmmuc

Hallo Zusammen,
erst einmal vielen Dank für all die wertvollen Hinweise.
Nachdem ich nun alle Hinweise berücksichtigt und entsprechend umgeschrieben habe, macht es genau das was es soll.
Der wesentliche Fehler war, dass ich die Umschaltflächen in der Optionsgruppe wie einzelne Buttons behandelt habe und das ist wohl etwas problematisch.
Kaum habe ich die Optionsgruppe als eine Einheit behandelt und den Rückgabewert über Select Case ausgewertet schon hat es funktioniert.
Nochmal vielen Dank für all Eure Mühe.
Gruß
pmmuc