Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Felder deaktivieren und Focus

Begonnen von Elwood, September 07, 2011, 17:43:14

⏪ vorheriges - nächstes ⏩

Elwood

Hallo!
Und da sind sie wieder: meine Grenzen...

Ich möchte fallabhängig die Eingabemöglichkeit in einigen Formularen / Unterformularen unterdrücken. Dazu benutze ich folgenden Code:
    Dim ctl As Control
    For Each ctl In frm
        If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.Name = "Button_ChangeBew" Then
        ctl.Enabled = onoff
        End If
    Next ctl
Das klappt auch wunderbar in Access 2010. In Version 2003 bleibt immer das Feld mit der Reihenfolgeposition 0 unberücksichtigt. Wenn es nur ein Feld gibt kommt die Meldung, dass ein Feld, das den Fokus hat, nicht deaktiviert werden kann.

Als Workaround fällt mir nur ein, einen 0x0 Button zu machen, auf den ich den Fokus ersatzweise setze.
Aber wie blöd ist das denn? Gibt es da keine elegantere Lösung?

THX4Help

DF6GL

Hallo,

kann das bei A2010 jetzt nicht nachvollziehen, würde mich aber sehr wundern, wenn es stimmte..


Die Reihenfolgeposition hat mit dem Einstellen der Enabled-Eigenschaft auch nichts zu tun.

Wenn Du "fallabhängig" Steuerelemente deaktivieren willst, dann wäre die Verwendung/Auswertung der "Tag"-Eigenschaft der Steuerelemente ein besserer Weg, um zum Ziel zu kommen.

Elwood

#2
Stimmt, in 2010 kann man das nicht nachvollziehen, da funktioniert es ja.
Die Tag- Eigenschaft bezieht sich doch nur auf Label-Objekte?

Das mit der Reihenfolgeposition ist vielleicht missverständlich:
Nachdem immer die Position 0 den Focus bekommt ist es eben immer dieses Steuerelement, das der og. Code nicht deaktivieren kann.

DF6GL

#3
Hallo,

nein, ich meinte, ich konnte es nicht testen.


Zwischenzeitlich schon , und da geht es tatsächlich, das aktive Steuerelement zu deaktivieren.  :o    Insofern bin ich am Wundern   8)


Das hebt aber meinen Ratschlag zur Verwendung der "Tag"-Eigenschaft nicht auf.


Andererseits ist A2010 nunmal zwei Generationen weiter und hat ein paar Neuerungen erfahren, die aber nun  nicht unter "blöd" einzuordnen sind.

Ob solche Änderungen nun sinnvoll sind und zur Inkompatibilität beitragen , steht auf einem anderen Blatt.



PS: Fast jedes Steuerelement hat eine "Tag"-Eigenschaft ("Marke") 

Elwood

Wie jetzt? Bei Dir klappt es in 2003?
Das ist ja übel - schwer nachvollziehbare Probleme sind die ... problematischsten.

Was soll ich denn wie über die Tag- Eigenschaft machen?
"Enabled" macht eigentlich genau das richtige - außer da, wo der Fokus ist

Jonny

Hallo

ein kleines Beispiel für Tag´s

Public Sub LockControls(ByRef frm As Form, ByVal bolLocked As Boolean)
    Dim ctl As Control
    On Error Resume Next
    For Each ctl In frm.Controls
        If ctl.Tag = "s" Or ctl.Tag = "S" Then
            ctl.Locked = bolLocked
        End If
    Next ctl
    Set ctl = Nothing
    If bolLocked = True Then
        frm!ARot.BackColor = vbRed
        frm!AGruen.BackColor = -2147483633
    Else
        frm!ARot.BackColor = -2147483633
        frm!AGruen.BackColor = vbGreen
    End If

End Sub

Aufruf mit call Lookcontrols(me,true)   
für gesperrt alle Felder mit Marke = S oder Marke = s

Hab damit auch bei Acc 2003 noch keine Schwierigkeiten gefunden.

Das mit der Farbe ist nur eine kleine Spielerei.

Gruß

Johann

database

Hallo,

unter AC2010 geht es ein aktives Control zu deaktivieren.
Allerdings nicht mit deinem Code aus #1!

damit geht es:


Dim ctl As Control
   For Each ctl In Me.Controls
       If ctl.ControlType = acTextBox Or ctl.ControlType = acComboBox Or ctl.Name = "Button_ChangeBew" Then
       ctl.Enabled = False
       End If
   Next ctl


ZitatWas soll ich denn wie über die Tag- Eigenschaft machen

Du KÖNNTEST in einem bestimmten Fall die 'Tag'-Eigenschaft eines oder mehrerer Steuerelemente auf einen bestimmten Wert setzen z.B. '1'
Dann kannst du die Steuerelemente wie oben gezeigt durchlaufen und anstatt der Frage nach der Art des Steuerelementes (ControlType) die Tag-Eigenschaft auslesen und entsprechend reagieren.
Dazu ersetzt du die If-Bedingung oben durch foilgende:


If ctl.Tag = 1 Then
   ctl.Enabled = False
End If


Die Tag Eigenschaft KANN bzw. KÖNNTE nach ausführen der gewünschten Aktion wieder entfernt werden

HTH

Elwood

#7
Aaalso
schon mal vielen Dank für die vielen Hinweise!
Ich habe grade mal meinen Workaround umgesetzt und einen unsichtbaren Button an Reihenfolgeposition 0 gesetzt.
So werden tatsächlich alle Felder disabled.

@database
onoff ist eine Variable, die True oder False bekommt, je nach Übergabewert für die Prozedur.
Sorry, hatte ich nicht mit geposted.

Wenn ich das mit den Tags richtig verstehe, müsste ich die entsprechenden Felder mit dem Tag markieren, indem ich z.B. "S" reinschreibe. Und dann abfragen. Ist sicher nützlich, wenn ich nur bestimmte Felder will. Im vorliegenden Fall sind es aber alle. Das "Klappt nicht, wenn der Fokus drauf ist" - Problem löst das ja erst mal nicht,

@Jonny
Deinen Code werde ich nachher mal ausprobieren.
Da Du aber Locked statt Enabled setzt, bekomme ich da nicht das gleiche Problem, wenn ich Enabled ändern will?
(Bei Locked kann ich ja noch in die Felder klicken und drin rummachen, bei Enabled kommt der Anwender erst gar nicht rein.)

DF6GL

Hallo,

die eigentliche "Problematik" ist doch, dass in <A2010 das akt.Steuelement nicht per Code disabled werden kann.

Das ist so und wird so bleiben. Wenn man dort funktionierenden Code haben will, muss man eben mit geeigneten Methoden (--> "Tag" verwenden oder das aktive St.-Element "aus der Schleife verbannen" , d. h. explizit durch Vergleich mit dem St.-El.-Namen genau dieses von der Bearbeitung ausschliessen.


Weiterhin ist es bei <2010 (dadurch) erforderlich, dass wenigstens ein weiteres St.-El. vorhanden ist, auf das man den Fokus setzen kann, damit das im Moment den Code ausführende St.-El. frei für die "Vergewaltigung" wird.



Alternativ zu der "Disableungsschleife" (was für ein denglisch   :o  )   könnte man ja auch die Eigenschaft "Allowedits" einsetzen.




Elwood

Zitat von: DF6GL am September 07, 2011, 21:21:49
Hallo,

die eigentliche "Problematik" ist doch, dass in <A2010 das akt.Steuelement nicht per Code disabled werden kann.

Das ist so und wird so bleiben. Wenn man dort funktionierenden Code haben will, muss man eben mit geeigneten Methoden (--> "Tag" verwenden oder das aktive St.-Element "aus der Schleife verbannen" , d. h. explizit durch Vergleich mit dem St.-El.-Namen genau dieses von der Bearbeitung ausschliessen.


Weiterhin ist es bei <2010 (dadurch) erforderlich, dass wenigstens ein weiteres St.-El. vorhanden ist, auf das man den Fokus setzen kann, damit das im Moment den Code ausführende St.-El. frei für die "Vergewaltigung" wird.
Danke, dass Du das auf den Punkt gebracht hast!
Ich habe zwar keine Ahnung, wie man das per Tag lösen kann, denn wie Du ja auch schreibst: man braucht wenigstens ein freies Element, um den Fokus drauf zu setzen. So wie ich das sehe, kann ich mir mit Tags spezifische Zuweisungen erleichtern.

Ich habe es mal bei meiner "invisible-Button" Lösung gelassen.
Auch, wenn ich es nicht schön finde, funktionieren tut es.

Nochmal vielen Dank an alle!