Neuigkeiten:

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

Mobiles Hauptmenü

Gebundenes und ungebundenes Textfeld synchronisieren; repaint

Begonnen von sts2009, Januar 18, 2012, 14:43:37

⏪ vorheriges - nächstes ⏩

sts2009

Hallo in die Runde!   

Ich habe das folgende Problem, bei dem ich nicht weiterweiß. In einem Formular in geteilter Ansicht gibt es ein gebundenes Textfeld "Ende" und ein ungebundenes Textfeld "txtEnde". Die Spalte "ende" in der Datenbank ist vom Typ "datetime". Da das Ende-Datum nur minutengenau angezeigt (und eingegeben) werden soll, verstecke ich das gebundene Feld "ende" und zeige in "txtEnde" einen gekürzten Datums-String:

Private Sub Form_Current()     
  If Not IsNull(Me!Ende) Then Me!txtEnde = Mid(CStr(Me!Ende), 1, 16) Else Me!txtEnde = ""
  Debug.Print "txtEnde: " & txtEnde.Value
End Sub 

Problem: txtEnde zeigt beim Blättern durch die Datensätze einen falschen Wert an, nämlich jeweils den aus der vorherigen Zeile. Die Ausgabe vom debug.print zeigt hingegen den richtigen Wert! Wenn ich  das Formular minimiere und wiederherstelle, zeigt plötzlich auch das Formular den richtigen Wert. Der folgende Code funktioniert also (notdürftig):

Private Sub Form_Current()     
If Not IsNull(Me!Ende) Then Me!txtEnde = Mid(CStr(Me!Ende), 1, 16) Else Me!txtEnde = ""'   
Me.Repaint     
' repaint aktualisiert txtEnde nicht;     
' workaround:     
DoCmd.SelectObject acForm, "dafe"   
DoCmd.Minimize     
DoCmd.SelectObject acForm, "dafe"   
DoCmd.restore
End Sub 

Müßte nicht eigentlich "Repaint" das tun, was ich möchte?  Kann ich das Problem anders lösen, ohne Minimize/restore, denn das verursacht häßliches Flackern?   

Viele Grüße




DF6GL

Hallo,

lass das ganze Getönse und schreib einfach in die Format-Eigenschaft des gebundenen Feldes:

tt.mm.jjjj hh:nn

sts2009

Hallo,

danke! Das kannte ich noch nicht.

Es ist allerdings nicht ganz das, was ich will, da beim Eingeben die Sekunden wieder angezeigt werden (Access 2007). Kriegt man die auch irgendwie weg?

Neugierig wär ich schon, warum das repaint nicht klappt (flasche Methode?), bzw. warum das minimize/restore klappt.

Viele Grüße

DF6GL

#3
Hallo,


setz zusätzlich das Eingabeformat zusätzlich auf die gewünschte Eingabeform ein.


der Datentyp "Datum/Uhrzeit" beinhaltet nun mal die Sekunden.   Wenn Du streng eine Uhrzeit mit nur Std/Sek  "verwalten" willst, musst Du für die Eingabe/Speicherung ein Textfeld verwenden und selber für die gewünschte Formatierung (Plausi-Prüfungen und Darstellung) sorgen.


Der angezeigte Inhalt eines ungebundenen Feldes wird nicht sofort in die Value-Eigenschaft übernommen. Dafür ist die TEXT-Eigenschaft zu verwenden, die allerdings nur auszuwerten ist, wenn das Textfeld den Fokus besitzt.




sts2009

Hallo,

Zitat von: DF6GL am Januar 18, 2012, 15:50:55

Der angezeigte Inhalt eines ungebundenen Feldes wird nicht sofort in die Value-Eigenschaft übernommen. Dafür ist die TEXT-Eigenschaft zu verwenden, die allerdings nur auszuwerten ist, wenn das Textfeld den Fokus besitzt.


Meinst Du das andersrum? Die Value-Eigenschaft ist sofort aktuell (laut dem debug.print), der im Feld angezeigte Wert erst nach Rumgehampel.



Statt eines geteilten Formulars verwende ich jetzt ein einzelnes Formular mit einem Listenfeld zur Datensatzselektion. Hier funktioniert das mit dem versteckten, gebunden und dem sichtbaren, ungebundenen Feld ohne Probleme.

Viele Grüße

MzKlMu

Hallo,
ZitatDie Value-Eigenschaft ist sofort aktuell
Nein, die Value Eigenschaft ist erst nach verlassen des Feldes (Nach Aktualisierung) aktuelle. Der aktuelle Inhalt des Feldes vor Aktualisierung geibt die Eigenschaft Text wieder.
Das das mit Debug.Print stimmt, hängt an der Stelle an der der Befehl aufgerufen wird. Wahrscheinlich nach verlassen des Feldes.
Gruß Klaus

sts2009

Hallo,

Zitat von: MzKlMu am Januar 24, 2012, 15:46:55
ZitatDie Value-Eigenschaft ist sofort aktuell
Nein, die Value Eigenschaft ist erst nach verlassen des Feldes (Nach Aktualisierung) aktuelle. Der aktuelle Inhalt des Feldes vor Aktualisierung geibt die Eigenschaft Text wieder.
Das das mit Debug.Print stimmt, hängt an der Stelle an der der Befehl aufgerufen wird. Wahrscheinlich nach verlassen des Feldes.

debug.print txtEnde.value steht in sub Form_Current().
Wenn ich im Datenblatt-Teil den Datensatz wechsle, z. B. durch Mausklick, gibt debug.print den Wert der aktuellen Zeile aus (das meinte ich mit "sofort"). Die Anzeige von meinem Textfeld txtEnde wird aber erst aktualisiert, wenn ich z. B. das Formular minimiere und wiederherstelle (mit Mausklick oder per vba).

Viele Grüße

MzKlMu

Hallo,
Wenn der Datensatz gewechselt wird, ist .Value aktuell.
Value kann übrigens entfallen, txtEnde ist das Gleiche wie txtEnde.Value
Bei Form_Current() enthält also das Feld immer den angezeigten Wert.
Wenn ich aber ohne das Feld zu verlassen den Wert brauche, muss ich die Eigenschaft .Text verwenden.
Gruß Klaus

sts2009

Hallo,

Zitat von: MzKlMu am Januar 24, 2012, 16:28:00

Wenn der Datensatz gewechselt wird, ist .Value aktuell.
Value kann übrigens entfallen, txtEnde ist das Gleiche wie txtEnde.Value
Bei Form_Current() enthält also das Feld immer den angezeigten Wert.


Eben nicht, das ist ja mein Problem! :-) Mein (ungebundenes) Feld txtEnde* zeigt nicht (sofort) den Wert an, den es laut .value hat. 

(*) txtEnde setze ich in Form_Current() durch
Me!txtEnde = Mid(CStr(Me!Ende), 1, 16)

Viele Grüße

MzKlMu

Hallo,
rechne txtEnde in der Abfrage:
txtEnde: Teil([Ende]; 1; 16)
Achtung, die Syntax ist etwas anders.
Binde dann das Formularfeld an txtEnde
Gruß Klaus