Memofeld und Text einlesen

Moderator: ModerationP

Memofeld und Text einlesen

Beitragvon Gast » 18. Nov 2020, 13:04

Hallo,
in einem Memo-Feld kann man Text markieren.
Ist es möglich, den Text durch VBA, z.B. durch einen Button in eine Variable einzulesen?
Gruß Hubert
Gast
 

Re: Memofeld und Text einlesen

Beitragvon knobbi38 » 18. Nov 2020, 13:20

Hallo,

um auf den selektierten Text zuzugreifen, kennt die Tetxbox die Eigenschaften, welche mit .Sel... anfangen.
Siehe im Objektmodell oder der OH.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23

Re: Memofeld und Text einlesen

Beitragvon Beaker s.a. » 18. Nov 2020, 13:24

Hallo,
Ja. Die entsprechend benötigten Eigenschaften des Text-/Memofeldes lauten
"SelStart" und "SelLength". Zum extrahieren brauchst du dann noch "Mid" und
"InStr".
gruss ekkehard
Ereignisorientierte Programmierung:
Alles, was geschieht, geschieht.
Alles, was während seines Geschehens etwas anderes geschehen
läßt, läßt etwas anderes geschehen.
Alles, was sich selbst im Zuge seines Geschehens erneut geschehen
läßt, geschieht erneut.
Beaker s.a.
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1056
Registriert: 14. Jul 2012, 21:56
Wohnort: Bremen

Re: Memofeld und Text einlesen

Beitragvon Gast » 18. Nov 2020, 13:42

Hallo,
danke.
Ich versuch`s damit.
Gruß Hubert
Gast
 

Re: Memofeld und Text einlesen

Beitragvon Gast » 18. Nov 2020, 13:59

Hallo,
es kommt jeweils <div> mit schließendem </div> pro Zeile.
Ist das der interne tag für Absatz?
Gruß Hubert
Gast
 

Re: Memofeld und Text einlesen

Beitragvon Gast » 18. Nov 2020, 14:51

Hallo,
noch zu <div> und </div>
Code: Alles auswählen
 strMarkiert = Mid(txtMemoRT.Value, txtMemoRT.SelStart, txtMemoRT.SelLength)

SelLength scheint <div> und </div> nicht mit zu erfassen. Verwendet man dann SelLength mit mid, ergibt sich eine zu kurze Zeichenkette.
Es ist auch ein Unterscheid, ob mitten im Memofeld Tetx markiert ist oder die Markierung am Anfang beginnt. Bei letztem wird
Laufzeitfehler '5': Ungültiger Prozeduraufruf oder ungültiges Argument
gemeldet mit debuggen-Option.
Beginnt die Markierung am Anfang, läuft der Code durch, aber der gelieferte String ist kürzer als die Markierung.
Gruß Hubert
Gast
 

Re: Memofeld und Text einlesen

Beitragvon Bitsqueezer » 18. Nov 2020, 15:28

Hallo,

um den reinen Text zu erhalten, kannst Du den Inhalt des Memofeldes mit der Funktion "PlainText" in reinen Text umwandeln, in dem dann keine Tags mehr vorkommen. Darauf sollte dann die SelStart/-Length-Eigenschaft funktionieren, die auch nur nach der Anzahl Zeichen gehen, nicht denen, die die Formatierung durch Tags hinzufügen.

"div" steht in HTML für "Division" und stellt einfach nur einen Bereich dar, ergibt keinerlei Formatierung. Die kann man aber dem Div-Tag hinzufügen, was dessen Sinn ist.

https://www.w3schools.com/tags/tag_div.ASP

In RTF hat man hier allerdings nur sehr begrenzte Möglichkeiten.

Gruß

Christian
Bitsqueezer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 7910
Registriert: 21. Jun 2007, 12:17

Re: Memofeld und Text einlesen

Beitragvon knobbi38 » 18. Nov 2020, 15:55

Hallo Hubert,

wenn dein Feld <div> Tags enthält, ist das RTF-Text. Stellt sich die Frage, ob du diese Tags wirklich für deine anstehende Weiterverarbeitung brauchst.

Natürlich must du schon die Werte-Bereiche beachten. Die Position des ersten Zeichen in einem String ist für MID$() = 1 und für SelStart = 0. (-> steht auch in der Hilfe!!! nicht gelesen? ) Das gilt natürlich analog auch für .SelLength().
Wenn du direkt die .SelText verwendest, kannst du direkt den makrierten String auslesen.

Aber du hast ein ganz anderes Problem. Durch die Verwendung des Buttons, verliert die Textbox den Fokus und wenn du den Fokus zurück auf die Textbox setzt, wird die Markierung zurückgesetzt. Du must also den markierten Text, beim Lostfocus-Event in einer Variablen zwischenspeichern und dann kannst du diesen später auswerten.

AirCode:
Code: Alles auswählen
Private strSelectedText As String

Private Sub txtMemo_GotFocus()
  strSelectedText = vbNullString
End Sub

Private Sub txtMemo_LostFocus()
  strSelectedText = txtMemo.SelText
End Sub

Private Sub Befehl4_Click()
  Debug.Print strSelectedText
  strSelectedText = vbNullString
End Sub


Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23

Re: Memofeld und Text einlesen

Beitragvon Gast » 19. Nov 2020, 10:40

Hallo,
danke euch.
plaintext ist evtl nicht nötig, da ich feststellte, dass die tags verschwinden, wenn man die string-Variable nutzt. Offensichtlich ist so nicht für das RT-Format geeignet (Aber wenn man eine dafür braucht?).
Ich habe sie jetzt public deklariert (p_strSelectedText), da txtMemo jetzt in einem Ufo steht.
Statt lostfocus musste ich auch das Exit vom Ufo-Control nehmen, um p_strSelectedText zu füttern. Das geht.
Kann man das auch erreichen ohne die Public-Variable? Ich glaube, es ist besser, wenn man solche vermeidet.
Gruß Hubert
Gast
 

Re: Memofeld und Text einlesen

Beitragvon knobbi38 » 19. Nov 2020, 11:47

Hallo Hubert,

die Stringvariable ist modulglobal (private) im Formular und nicht public und wie beschrieben für die Zwischenspeicherung notwendig. Wenn du von außerhalb des UF darauf zugreifen möchtest, würde man normalerweise dafür eine Property verwenden.

Es liegt übrigens nicht an der Stringvariable, daß die Tags "verschwinden", sondern an der Eigenschaft SelText.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23

Re: Memofeld und Text einlesen

Beitragvon Gast » 19. Nov 2020, 12:04

Hallo,
die Variable ist für die Markierung des Memofelds im Ufo und der Button ist im Hafo.
Müsste doch dann eine public-Variable sein.
Schreibt man die Property in ein Standardmodul?
Gruß Hubert
Gast
 

Re: Memofeld und Text einlesen

Beitragvon knobbi38 » 19. Nov 2020, 12:24

Hallo Hubert,

ich dachte eigentlich, daß ich das klar formuliert hätte. Also nochmal:
- die Variable ist private modulglobal im UF definiert.
- um den Zugriff auf die Variable von außerhalb auf diese private Variable zu ermöglichen, erstellt man im Codemodul des UF entsprechende Get-/Let Property Prozeduren.
- diese "neue" Eigenschaft wird dann in der Klick-Prozedur vom Button im HF angesprochen, um den selektierten Text auszulesen.

Das sind VBA-Grundlagen und kann hier nochmal nachgelesen werden:
https://www.vba-tutorial.de/objekte/eigenschaften.htm

Wieso hat das LostFocus Event der Textbox nicht gereicht? Das Exit Event des SubForm-Controls ist definitiv das falsche Event, weil es im HF auftritt.

Btw.: wenn du nächstes mal hier Fragen stellst, solltest du solche grundlegenden Informationen, wie Verwendung von Unterformularen und wo welche Button plaziert sind, den Helfern nicht vorenthalten. Das sind vollkommen andere Rahmenbedingungen und die Helfer machen ihre Arbeit nicht gerne doppelt.

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23

Re: Memofeld und Text einlesen

Beitragvon Gast » 20. Nov 2020, 13:04

Hallo,
...den Helfern nicht vorenthalten

Entschuldige, vor dem Post 19. Nov 2020, 10:40 hatte ich noch kein Ufo und es lief mit deinen Angaben.
Dann brachte ich das Ufo ein und es kam dann
Fehler beim Kompilieren; Variable nicht definiert.

Erst durch die p-Variable in einem Standardmodul, konnte der Fehler vermieden werden. Habe noch einmal getestet:
- im Standardmodul p_strSelectedText auskommentiert
- die Variable als "private modulglobal im UF definiert". Der Fehler kommt wieder :(
Code: Alles auswählen
Private Sub cmdText_Click()' (im Hafo)
  Dim s As String
  Debug.Print p_strSelectedText
  p_strSelectedText = vbNullString
  With Me!sfmUfo.Controls("txtMemo")
    If Nz(.Value) = "" Then Exit Sub
    s = Mid(.Value, .SelStart, .SelLength)
  End With
End Sub

Die Property kann ich erst leider später machen.
Vielleicht trifft da ""private modulglobal im UF" zu.
Gruß Hubert
Gast
 

Re: Memofeld und Text einlesen

Beitragvon knobbi38 » 20. Nov 2020, 13:21

Hallo Hubert,

die Formulierung "modulglobal" ist keine VBA Anweisung oder Syntax, sondern bezeichnet den Ort, wo die Variable definiert wird, in dem Fall bedeutet das in als "Private" einem (Klassen-)Modul außerhalb einer Funktion oder Prozedur, siehe mein ersten Beispiel (AirCode). Exakt der Code, ohne die Button_Click Prozedur, kommt in das Modul vom UF. Zusätzlich dann die Anweisungen für die Properties.

Also mit dem grundsätzlichen Aufbau von VBA Code solltest du dich vielleicht doch nochmal beschäftigen, ebenso mit der Sichtbarkeit von Variablen und Prozeduren. Das Tutorial hast du dann wahrscheinlich auch nicht weiter beachtet.
- die Variable als "private modulglobal im UF definiert". Der Fehler kommt wieder

Das du auf eine privat deklarierte Variable im UF vom HF keinen Zugriff hast, sollte eigentlich klar sein - oder was meinst du bewirkt der Modifizierer "private"?
Die Property kann ich erst leider später machen.
Du musst du nicht später machen, sondern erlaubt dir ja erst den Zugriff vom HF auf die interne Variable des UF. :roll:

Gruß Ulrich
knobbi38
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 2797
Registriert: 02. Jul 2015, 14:23

Re: Memofeld und Text einlesen

Beitragvon Hubert$ » 20. Nov 2020, 13:33

Hallo,
der code im vorherigen Post wurde falsch kopiert.
richtig ist:
Code: Alles auswählen
  Private Sub cmdText_Click()
  Debug.Print p_strSelectedText
  p_strSelectedText = vbNullString
End Sub

Du musst du nicht später machen

Damit meinte ich, dass ich, da Propert kaum verwendet, mich erst wieder einlesen muss.
Dass du auf eine privat deklarierte Variable im UF vom HF keinen Zugriff hast

Das ist mir schon klar, deswegen ja die Verwirrung. Daher doch meine p-Variable!
Aber deine Aussage, sie Private zu deklarieren, vielleicht weil du davon ausgehst, dass ich eine property habe?
Kann das wg Zeitgründen momentan nicht prüfen. Bin mal gespannt, ob mit der Property das "Private " eine Erklärung findet.
Gruß Hubert
Hubert$
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 90
Registriert: 04. Dez 2019, 21:32

Nächste

Zurück zu Access Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste