none
Text im RTF-Memofeld an Cursorpositon einfügen

    Frage

  • Hallo Leute,

    ich möchte per VBA in einem Textfeld an der aktuellen Cursorposition in einem RTF-Memofeld einen Text per Button einfügen. Leider geht es nicht mit dem Trick sich die alte Cursorposition zu merken (.SelStart) und im VBA-Code dann einfach mit Left() u. Mid() den Text dazwischen einzufügen. Es wird nämlich immer auch der verborgene HTML-Code mit gerechnet, so dass immer eine falsche Cursorpostion ermittelt wird.

    Kennt jemand eine funktionierende Lösung?

    Vielen Dank im voraus.

    Gruß Ahmed


    Antworten bitte nur in der Newsgroup
    Windows 7 64bit Home Premium
    Office Prof. 2010

    Samstag, 26. Mai 2012 07:45

Antworten

Alle Antworten

  • Hallo!

    Eine Lösung kann ich (noch) nicht anbieten, aber eine Ergänzung zur Problembeschreibung:

    Wenn der Text vor dem Auslesen von SelStart bearbeitet wurde, wird die Position inkl. "HTML"-Tags zurückgegeben.
    Wurde der Text nicht bearbeitet, wird nur die Postion der sichtbaren Zeichen ohne Html-Tags zurückgegeben.

    mfg
    Josef

    [OT]

    "Antworten bitte nur in der Newsgroup"

    ... warum fragst du dann im Forum? :-))))


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch


    • Bearbeitet Josef Pötzl Mittwoch, 30. Mai 2012 08:44 Test-Code war falsch
    Mittwoch, 30. Mai 2012 07:59
  • Danke Josef

    Toll zu wissen. Da hat wohl ein Access Programmierer von Microsoft Hirnkrämpfe gehabt, als er sich das ausgedacht hat.

    Wird das nur dann umgeschaltet, wenn durch den Benutzer editiert wird, oder auch, wenn über VBA Code der Text verändert wird?

    Gruss

    Henry

    Josef Pötzl [MVP] wrote:

    Eine Lösung kann ich (noch) nicht anbieten, aber eine Ergänzung zur
    Problembeschreibung:
    Wenn der Text vor dem Auslesen von SelStart bearbeitet wurde, wird die
    Position inkl. "HTML"-Tags zurückgegeben. Wurde der Text nicht
    bearbeitet, wird nur die Postion der sichtbaren Zeichen ohne Html-Tags
    zurückgegeben.

    Mittwoch, 30. Mai 2012 08:18
  • Hallo Henry!

    Ich muss meine "Ergänzung" zurücknehmen. Meine Vermutung trifft nicht zu. DAs war nur ein Zufallsergebnis.
    Mein Test-Code gab bei einer Änderung die letzte Position aus, die ich mit der Pos inkl. Tags verwechselte.

    => Somit wird immer nur die Position ohne HTML-Tags zurückgegeben.


    Lösungsansatz (noch nicht vollständig getestet):

    Public Function HtmlTextPos(ByVal HtmlText As String, ByVal PlainTextPos As Long) As Long
       
       Dim TagStartPos As Long
       Dim TagEndPos As Long
       Dim TextPos As Long
       Dim TempText As String
       Dim TempHtmlTextPos As Long

       TempText = HtmlText
       TempText = Replace(TempText, " ", Chr(160))
       TempText = Replace(TempText, "<br>" & vbNewLine, Chr(172))
       TempText = Replace(TempText, "</div>" & vbNewLine & vbNewLine & "<div>", "</div> <div>")

       TagStartPos = 1
       Do

          TagEndPos = InStr(TagStartPos, TempText, ">") + 1
          TagStartPos = InStr(TagEndPos, TempText, "<")

          TextPos = TextPos + TagStartPos - TagEndPos

       Loop Until TextPos >= PlainTextPos Or TagEndPos = 0

       TempHtmlTextPos = TagStartPos - TextPos + PlainTextPos - 1

       TempText = Left(TempText, TempHtmlTextPos)
       TempText = Replace(TempText, "</div> <div>", "</div>" & vbNewLine & vbNewLine & "<div>")
       TempText = Replace(TempText, Chr(172), "<br>" & vbNewLine)
       TempText = Replace(TempText, Chr(160), "&nbsp;")
       HtmlTextPos = Len(TempText)

    End Function

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch




    Mittwoch, 30. Mai 2012 08:31
  • Hallo Josef,

    vielen Dank für Deine Hilfe, aber irgendwie funktioniert das nicht so richtig.
    Ich werde das Thema auch nicht mehr weiter verfolgen, da ich eine Ersatzlösung habe.

    Wird  in einem Textfeld ein Wert erfasst, wird jetzt der einzufügende Text einfach in den Zwischenspeicher geschrieben und ein Hinweisfeld weißt darauf hin, dass der Text mit Strg+V an der geeigneten Stelle selbst einzufügen ist.

    Hier meine Lösung:

    Dim sText As String
    
    
    lblInfosteuersparnis.Visible = (Len(Steuerersparnis.Text) > 0)
    If Len(Steuerersparnis.Text) = 0 Then Exit Sub
    
    sText = vbNewLine & "Bei der Einkommensteuer-Erklärung haben wir für Sie die getrennte Veranlagung gewählt. " & _
            "Der daraus resultierende Steuervorteil beträgt " & Format(Steuerersparnis, "Currency") & "."
    
    
    Dim MyDataObject As DataObject
    Set MyDataObject = New DataObject
        MyDataObject.Clear
        MyDataObject.SetText sText
        MyDataObject.PutInClipboard
    

    Man kann halt nicht alles automatisieren.

    Gruß Ahmed

    Mittwoch, 30. Mai 2012 13:37
  • Hallo!

    > aber irgendwie funktioniert das nicht so richtig

    Der Code ist auch nur ein Lösungsansatz. ;-)

    Könntest du deine Ersatzlösung nicht so ausbauen, dass an die Cursorposition der Text aus dem Zwischenspeicher eingefügt wird?
    z. B. über DoCmd.RunCommand acCmdPaste

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch



    Mittwoch, 30. Mai 2012 13:50
  • Ich wollte den Text per Button einfügen. Dazu sollte der Anwender an die Textposition springen und dann den Button klicken. Leider wird mit dann aber mit der SelStart-Anweisung die Position im HTML-Text ausgegeben. Daher kann ich nicht mehr an die ursprüngliche Stelle wieder zurückspringen.

    Jetzt ist es halt so, dass der Text manuell per Strg+V an der gewählten Stelle eingefügt werden kann. Ist vielleicht auch sinnvoller, da ja noch die Problematik mit Zeilenumbrüchen etc. besteht. Von daher werde ich das Thema erst einmal nicht weiter verfolgen.

    Vielleicht gibt es ja mit der nächsten Access-Version eine sinnvolle Lösung.

    Aber dennoch vielen Dank für Deine Hilfe. Die Funktion habe ich erst einmal übernommen und vielleicht kann ich diese ja dennoch einmal gebrauchen.

    Gruß Ahmed

    Mittwoch, 30. Mai 2012 15:46
  • Hallo!

    Bei meinem Test wurde bei SelStart die Position des Textes ohne Tags zurückgegeben.

    Ich erstellte einmal ein Beispiel (SelStartRichText.accdb), damit wir die gleiche Ausgangsbasis für eine weitere Diskussion/Problemumgehung haben. ;-)

    mfg
    Josef


    Code-Bibliothek für Access-Entwickler
    AccUnit - Testen von Access-Anwendungen
    Virtueller Access-Stammtisch

    Mittwoch, 30. Mai 2012 16:29
  • Genial, also ich wirklich, also ehrlich, also....

    Hat bei meinen Tests einwandfrei funktioniert und werde ich gleich bei mit einbauen.

    Und auch gleich umgesetzt und funktioniert absolut einwandfrei.

    Vielen Dank für die Hilfe.

    Gruß Ahmed


    Donnerstag, 31. Mai 2012 05:48