Neuigkeiten:

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

Mobiles Hauptmenü

Text per VBA zu einem Textfeld hinzuaddieren: letze Leerzeile / Leerzeichen weg

Begonnen von BotschafterSarek, Juli 09, 2014, 14:24:25

⏪ vorheriges - nächstes ⏩

BotschafterSarek

Hallo zusammen,

ich habe in einer Access2003-Datenbank ein Formularfeld, in dem Text eingegeben werden soll. Teilweise werden Textbausteine verwendet, die man in einer Combobox auswählen kann. Wählt man in der Combobox einen Eintrag aus, so wird dieser per VBA dem Memofeld hinzugefügt. Im Prinzip klappt das, aber ich habe drei Probleme:


  • Wenn ich in meinem Memofeld ein Leerzeichen eingegeben habe oder einen Zeilenumbruch gemacht habe, wird das beim Anhängen des Textbausteins ignoriert, der Textbaustein wird direkt hinter das letzte Wort im Memofeld geklatscht. Das erfordert manuelles Nacharbeiten und macht die Verwendung der Textbausteine ineffizient. Geht das nicht besser?
  • Wenn ich nach dem Einfügen eines Textbausteins wieder in mein Memofeld klicke, um weiterzuschreiben, erscheint der Textbaustein manchmal erneut, so dass er dann zweimal dort steht. Woran liegt das? Ich habe keine Systematik erkennen können, wann der Textbaustein ein zweites Mal erscheint und wann nicht.
  • Eigentlich wollte ich durch die VBA-Zeile Me!Befund_K.SetFocus den Fokus nach dem Einfügen eines Textbausteins wieder auf das Memofeld setzen, aber ich bekomme dann einen Laufzeitfehler 2108, der mich darauf hinweist, dass das Feld erst gespeichert werden muss, bevor ich SetFocus ausführen kann. Aber wie soll ich es speichern?

Für Eure Hilfe Danke im Voraus,
Sarek \\//_

MzKlMu

Hallo,
das Datenmodell ist falsch. Hier fehlt noch eine Tabelle zur Zuordnung der Textbausteine zum Gutachten. Das ist eine klassische n:m Beziehung zu der 3 Tabellen erforderlich sind.
In der 3.Tabelle (der fehlenden) wird die ID des Gutachtens und der Index der Textbausteine als jeweils ein Datensatz gespeichert. Das Memofeld entfällt ersatzlos. Die Darstellung der Textbausteine erfolgt dann in einem Unterformular.
Gruß Klaus

BotschafterSarek

Zitat von: MzKlMu am Juli 09, 2014, 18:33:34
das Datenmodell ist falsch. Hier fehlt noch eine Tabelle zur Zuordnung der Textbausteine zum Gutachten. Das ist eine klassische n:m Beziehung zu der 3 Tabellen erforderlich sind.
In der 3.Tabelle (der fehlenden) wird die ID des Gutachtens und der Index der Textbausteine als jeweils ein Datensatz gespeichert. Das Memofeld entfällt ersatzlos.

Sorry, aber so ist das nicht gedacht. Der Text besteht ja nicht nur aus Bausteinen, sondern ist ein normaler Fließtext, der in dem Memofeld geschrieben wird. Die Textbausteine sollen nur das Eintippen häufig wiederkehrender Passagen vermeiden.

Es muss doch möglich sein, beim Auslesen des Inhaltes eines Textfeldes zu erkennen, ob dort am Ende ein Leerzeichen oder ein Zeilenumbruch steht.

MzKlMu

Hallo,
sorry, habe ich falsch verstanden. Nach nochmaligem Lesen ist mir das auch aufgefallen.
Verwende das Ereignis "Nach Aktualisierung" des Kombis. Vor Aktualisierung ist das Problem. Und ergänze den Code wie folgt:
Private Sub Bausteinwahl_Befund_AfterUpdate()
    Me!Befund_K = Me!Befund_K & " " & Me!Bausteinwahl_Befund
    Me!Befund_K = LTrim(Me!Befund_K) & " " 'entfernt ein führendes LZ und fügt zum Weiterschreiben hinten eins an.
    Me!Befund_K.SetFocus 'setzt den Fokus
    Me!Befund_K.SelStart = Len(Me!Befund_K.Text) 'wertet den momentanen Inhalt (.Text) aus und setzt den Cursor hinter das letzte Zeichen.
End Sub

Den Zeilenumbruch beizubehalten wird meiner Meinung nach nicht gehen, da das Feld bei Auswahl des Kombis den Fokus verliert und damit der Zeilenumbruch wieder automatisch entfernt wird. Das Leerzeichen wird auch entfernt, aber über den Code wieder eines angehängt.
Gruß Klaus

BotschafterSarek

Zitat von: MzKlMu am Juli 09, 2014, 19:56:46
sorry, habe ich falsch verstanden. Nach nochmaligem Lesen ist mir das auch aufgefallen.

:-)


Zitat von: MzKlMu am Juli 09, 2014, 19:56:46
Verwende das Ereignis "Nach Aktualisierung" des Kombis. Vor Aktualisierung ist das Problem. Und ergänze den Code wie folgt

OK, bei Leerzeichen verhält er sich jetzt halbwegs richtig - auch wenn ein Leerzeichen nach dem Textbaustein unter Umständen (nämlich wenn ein Satzzeichen folgen soll) nicht angesagt wäre.

Aber wenn der Textbaustein nach einer Zeilenschaltung eingefügt wird, wird diese zuvor vorgenommene Zeilenschaltung ignoriert, und der Textbaustein wird mit einem Leerzeichen an den alten Absatz angefügt. Das ist noch unbrauchbar.

Wo liegt eigentlich das Problem für Access? Ein Leerzeichen oder eine Zeilenschaltung sind doch normale Zeichen. Warum behandelt Access die anders als Buchstaben, Zahlen, Sonderzeichen et cetera? Wenn das letzte Zeichen in dem Memofeld ein X ist, wird das doch auch nicht gelöscht. Warum wird ein chr(13) oder ein chr(32) gelöscht?

BotschafterSarek

Zitat von: MzKlMu am Juli 09, 2014, 19:56:46
Den Zeilenumbruch beizubehalten wird meiner Meinung nach nicht gehen, da das Feld bei Auswahl des Kombis den Fokus verliert und damit der Zeilenumbruch wieder automatisch entfernt wird. Das Leerzeichen wird auch entfernt, aber über den Code wieder eines angehängt.

OK, den Nachtrag habe ich eben erst gesehen. Wenn die Access-internen Textfelder sich so komisch verhalten, gibt es denn irgendwelche anderen in Access nutzbaren Texteingabe-Steuerelemente, die eine vernünftige Texteingabe ermöglichen?

MzKlMu

Hallo,
ich habe oben noch was ergänzt.
Nicht sichtbare Zeichen werden von Access am Ende eines Feldes automatisch entfernt. Daher wird das mit der Zeilenschaltung nicht gelingen. Das Leerzeichen wird ja mit dem Textbaustein immer wieder angefügt.
Zitatunter Umständen (nämlich wenn ein Satzzeichen folgen soll) nicht angesagt wäre.
wenn Du das verhindern willst, musst Du das letzte Zeichen ermitteln und entsprechend reagieren. Wie soll das auch anders gehen?

Zitatgibt es denn irgendwelche anderen in Access nutzbaren Texteingabe-Steuerelemente, die eine vernünftige Texteingabe ermöglichen?
nein, meiner Meinung nach nicht. Ein Memofeld (Access) ist halt keine Textverarbeitung.

Man könnte mal versuchen eine Button zur Einfügung einer Zeilenschaltung einzubauen, aber dann nach dem Einfügen eines Textbausteins und dann den Cursor wieder nach hinten zu setzen.
Gruß Klaus

BotschafterSarek

Zitat von: MzKlMu am Juli 09, 2014, 20:20:35
wenn Du das verhindern willst, musst Du das letzte Zeichen ermitteln und entsprechend reagieren.

Darauf wird es wohl hinauslaufen. Habe ich eine Möglichkeit, mit dem KeyPress-Ereignis des Memofeldes herauszufinden, welche Taste gerade gedrück wurde, bevor dieses Zeichen dann im Memofeld angefügt wird?


Zitat von: MzKlMu am Juli 09, 2014, 20:20:35
Man könnte mal versuchen eine Button zur Einfügung einer Zeilenschaltung einzubauen, aber dann nach dem Einfügen eines Textbausteins und dann den Cursor wieder nach hinten zu setzen.

Ein Button zur Zeilenschaltung? Ne, die EIngabe soll schon "normal" erfolgen. Ein Benutzer ist gewohnt, dass man mit der Enter-Taste eine Zeilenschaltung macht, und so soll es auch bleiben.

MzKlMu

Hallo,
ZitatHabe ich eine Möglichkeit, mit dem KeyPress-Ereignis des Memofeldes herauszufinden, welche Taste gerade gedrück wurde, bevor dieses Zeichen dann im Memofeld angefügt wird?
ja, das geht. Und da fällt mir auch ein, da könnte man auch eine Zeilenschaltung abfangen.

Wenn Du willst, baue ich Dir da mal was, aber erst heute sehr spät oder morgen früh.
Gruß Klaus

BotschafterSarek

Zitat von: MzKlMu am Juli 09, 2014, 20:47:59
ja, das geht. Und da fällt mir auch ein, da könnte man auch eine Zeilenschaltung abfangen.

Genau die Idee kam mir auch :-)

Zitat von: MzKlMu am Juli 09, 2014, 20:47:59
Wenn Du willst, baue ich Dir da mal was, aber erst heute sehr spät oder morgen früh.

Ich bin schon dabei :-)

BotschafterSarek

#10
Zitat von: BotschafterSarek am Juli 09, 2014, 20:52:05
Ich bin schon dabei :-)

Ich scheitere nur gerade daran, dass das Einfügen eines chr(13) in das Memofeld leider keinen Zeilenumbruch erzeugt, sondern ein kleines Quadrat :(

Anbei die Lösung des Problems :-)
Danke für die Tipps, von alleine wäre ich nicht drauf gekommen, auch wenn es eigentlich einfach war ...