RTF-Box und versteckte Hyperlinks...

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    RTF-Box und versteckte Hyperlinks...

    Hi Ihr,

    wieder ein Problem.

    Ich habe mir mit viel Mühe (Recherche und Konstruktion) eine Sub gebaut, mit welcher ich versteckte Hyperlinks in die RTFBox einfügen kann:

    VB.NET-Quellcode

    1. If tsc_TextEditor_RTFBox.SelectionFont IsNot Nothing Then
    2. fontName = tsc_TextEditor_RTFBox.SelectionFont.Name
    3. Else
    4. fontName = sym_TextEditor_Format_cob_Schriftart.Text
    5. End If
    6. Dim linkURL As String = My.Settings.Texteditor_Hotlink_Link
    7. Dim linkText As String = My.Settings.Texteditor_Hotlink_Text
    8. Dim rtflink As String = "{\rtf1\ansi{\fonttbl{\f0\fcharset0 " & fontName & ";}}<" & "{\field{\*\fldinst{HYPERLINK """ & linkURL & """}}" & "{\fldrslt{" & linkText & "\ul0\cf0}}}>}"
    9. Dim currentPosition As Integer = tsc_TextEditor_RTFBox.SelectionStart
    10. Dim insertedTextLength As Integer = My.Settings.Texteditor_Hotlink_Text.Length
    11. tsc_TextEditor_RTFBox.SelectedRtf = rtflink
    12. tsc_TextEditor_RTFBox.SelectionStart = currentPosition + My.Settings.Texteditor_Hotlink_Text.Length + 2
    13. tsc_TextEditor_RTFBox.SelectionLength = 0 '
    14. tsc_TextEditor_RTFBox.ScrollToCaret()


    Die Konstruktion und das Einfügen des Links klappt inzwischen auch prima.
    Allerdings bleibt die Eigenschaft SelectionStart immer auf currentPosition +1, anstatt dass SelectionStart mit currentPosition + My.Settings.Texteditor_Hotlink_Text.Length + 2 (+2, wegen der zusätzlich eingefügten sGrösser-/Kleiner-Zeichen) ans Ende des Hyperlinks gesetzt wird.
    Woran kann das liegen?
    Ich hätte das Caret nach dem Einfügen natürlich gerne auch am Ende der Einfügung.

    Das richtig fette Problem ist aber:
    Ich baue eine Test-RTF mit vier normalen Links.
    Egal, wo ich dann mit meiner o.g. Funktion den versteckten Link einfüge, wird dann in der RTFBox beim Anklicken der, dem versteckten Link folgenden normalen Links kein TextEditor_RTFBox_LinkClicked mehr ausgeführt.
    Öffne ich die RTF aber im Wordpad, funktionieren alle Links.

    Hier ein Beispiel-Quelltext des RTF:

    Zwei normale Links, dann der eingefügte versteckte Link mit dem Beschreibungs-Text "Test", dann zwei weitere normale Links:

    VB.NET-Quellcode

    1. {\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1031{\fonttbl{\f0\fnil\fcharset0 Bahnschrift SemiBold;}{\f1\fswiss Arial;}}
    2. {\colortbl ;\red0\green0\blue255;}
    3. {\*\generator Riched20 10.0.19041}{\*\mmathPr\mdispDef1\mwrapIndent1440 }\viewkind4\uc1
    4. \pard\f0\fs24 <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de"}}{\fldrslt{http://www.welt.de\ul0\cf0}}}}\f0\fs24 >\par
    5. \par
    6. <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de"}}{\fldrslt{http://www.welt.de\ul0\cf0}}}}\f0\fs24 >\par
    7. \par
    8. <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de"}}{\fldrslt{\ul\cf1\cf1\ul Test}}}}\f0\fs24 >\par
    9. \par
    10. <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de"}}{\fldrslt{http://www.welt.de\ul0\cf0}}}}\f0\fs24 >\par
    11. \par
    12. <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de"}}{\fldrslt{http://www.welt.de\ul0\cf0}}}}\f0\fs24 >\par
    13. \par
    14. \f1\par
    15. }


    Die ersten beiden normalen Links funktionieren. Auch der versteckte "Test"-Link.
    Aber die folgenden zwei normalen Links haben keine Funktion mehr, sobald ich den versteckten Link einfüge.
    Ohne dem versteckten Link funktionieren alle vier normalen Links.
    Weiss jemand von Euch vielleicht, woran das liegt und wie das zum Funktionieren gebracht werden kann?

    Als weiteres Problem mit den versteckten Links:
    Wie bekomme ich diese LinkURLs beim MouseOver ausgelesen, damit ich diese in der Statuszeile anzeigen kann?
    Finde dafür absolut keine Lösung.
    Es müsste doch m.E. in etwa so funktionieren:
    - Feststellen der Textpos im Quelltext, über welcher sich der Mauszeiger befindet.
    - Ab dieser Textstelle im Quelltext rückwärts suchen, bis der Text "<{{\field{\*\fldinst{HYPERLINK" + chr(34) auftaucht - die Textpos abdem chr(34)+1 als Startpos sichern.
    - Von dieser Stelle aus vorwärts suchen, bis ein weiteres Hockkomma erscheint die Textpos vor dem chr(34) als Endpos sichern.
    - Alles zwischen diesen beiden Punkten ist der Hyperlink
    Nur, wie setze ich das um?

    Schönes Rest-Weekend @all
    @Dideldum Hat es einen tieferen Sinn, Hyperlinks zu verstecken :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dideldum schrieb:

    Woran kann das liegen?
    Es ist leicht rauszufinden, warum es nicht übereinstimmt: Wenn Du nur Deinen Link in eine leere RTB einfügst und dann Dir per Buttonklick anzeigen lässt, was DeineRTB.Text.Length, DeineRTB.RTF.Length und was DeineRTB.SelectionStart ist, wirst Du merken, dass Du diese Sachen nicht miteinander verarbeiten kannst. Nach dem < ist SelectionStart noch korrekt 1, aber innerhalb des angezeigten Hyperlink-Texts ist der Wert schon sehr hoch. Du musst also eine Methode finden, die in Einklang zu bringen, bevor Du damit weitermachen kannst.
    Im Anhang bin ich mit dem Caret nach dem G. Und die genannten Daten sind doch auf den ersten Blick sehr verwirrend.

    Wenn ich mir nach dem Einfügen des Links den RichText roh ansehe, zeigt sich, dass der Hyperlink in Anführungszeichen ist. Bei manuellen, funktionierenden Links nicht. Wenn man aber aus Zeile#9 (Dim rtflink = …) die Anführungszeichen um den Link entfernt, ist im fertigen Richtext trotzdem noch eines enthalten. Die Anführungszeichen stören also offensichtlich weiteren Links.
    Bilder
    • Result.png

      2,97 kB, 365×146, 31 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    RodFromGermany schrieb:

    @Dideldum Hat es einen tieferen Sinn, Hyperlinks zu verstecken :?:


    Hi @RodFromGermany
    Danke für Deinen Beitrag. :)
    Ich möchte versteckte Hyperlinks (weiss nicht, ob man diese so nennt - damit meine ich Hyperlinks mit anderen Textbeschreibungen als der dahinterstehende Link) einbauen, um ein schöneres Bild der RTF-Ausgabe zu erzeugen.
    Z.B.: Die hier unten stehenden Links direkt in die Absatztitel einbauen.
    Leider bekomme ich das mit dem Bild-Einfügen nicht hin.
    Hier der Link:
    i.postimg.cc/CxszT5bY/Hyperlinks.jpg

    Schönen Rest-Sonntag

    VaporiZed schrieb:

    Es
    ist leicht rauszufinden, warum es nicht übereinstimmt: Wenn Du
    nur Deinen Link in eine leere RTB einfügst und dann Dir per Buttonklick
    anzeigen lässt, was DeineRTB.Text.Length,
    DeineRTB.RTF.Length und was DeineRTB.SelectionStart
    ist, wirst Du merken, dass Du diese Sachen nicht miteinander verarbeiten
    kannst. Nach dem < ist SelectionStart noch korrekt
    1, aber innerhalb des angezeigten Hyperlink-Texts ist der Wert schon
    sehr hoch. Du musst also eine Methode finden, die in Einklang zu
    bringen, bevor Du damit weitermachen kannst.
    Im Anhang bin ich mit dem Caret nach dem G. Und die genannten Daten sind doch auf den ersten Blick sehr verwirrend.

    Wenn
    ich mir nach dem Einfügen des Links den RichText roh ansehe, zeigt
    sich, dass der Hyperlink in Anführungszeichen ist. Bei manuellen,
    funktionierenden Links nicht. Wenn man aber aus Zeile#9 (Dim rtflink = …) die Anführungszeichen um den Link entfernt, ist im fertigen
    Richtext trotzdem noch eines enthalten. Die Anführungszeichen stören
    also offensichtlich weiteren Links.


    Hallo @VaporiZed,
    besten Dank für Deine Hilfe.
    Aber ich bekomme das nicht so hin, wie von Dir beschrieben.
    Mein Original Konstrukt:

    VB.NET-Quellcode

    1. Dim rtflink As String =
    2. "{\rtf1\ansi{\fonttbl{\f0\fcharset0 " & fontName & ";}}<"
    3. & "{\field{\*\fldinst{HYPERLINK """ & linkURL & """}}" &
    4. "{\fldrslt{" & linkText & "\ul0\cf0}}}>}"

    ergibt im RTF:

    VB.NET-Quellcode

    1. <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de"}}{\fldrslt{\ul\cf1 Test}}}}\f0\fs24 >\par


    Entferne ich das Hochkomma in der String-Zuweisung vor und nach der Variablen linkurl:

    VB.NET-Quellcode

    1. Dim rtflink As String =
    2. "{\rtf1\ansi{\fonttbl{\f0\fcharset0 " & fontName & ";}}<"
    3. & "{\field{\*\fldinst{HYPERLINK " & linkURL & "}}" &
    4. "{\fldrslt{" & linkText & "\ul0\cf0}}}>}"

    fehlt im RTFSource das zweite Hochkomma nach der Variablen linkurl:

    VB.NET-Quellcode

    1. <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de}}{\fldrslt{\ul\cf1 Test}}}}\f0\fs24 >\par
    und der Test-Link funktioniert dann nicht mehr

    ENtferne ich nur das Hochkomma vor der Variablen Linkurl

    VB.NET-Quellcode

    1. Dim rtflink As String =
    2. "{\rtf1\ansi{\fonttbl{\f0\fcharset0 " & fontName & ";}}<"
    3. & "{\field{\*\fldinst{HYPERLINK " & linkURL & """}}" &
    4. "{\fldrslt{" & linkText & "\ul0\cf0}}}>}"

    habe ich zwar beide Hochkommas im RTFSource

    VB.NET-Quellcode

    1. <{{\field{\*\fldinst{HYPERLINK "http://www.welt.de"}}{\fldrslt{\ul\cf1 Test}}}}\f0\fs24 >\par

    Aber weder der Testlink, noch die folgenden zwei normalen Links funktionieren.

    Wo verstehe ich Dich falsch?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dideldum“ ()

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Dideldum schrieb:

    aber darin nur Grundsätzliches zum Einstellen des Studios gefunden.
    Ich hoffe doch Option Strict On. 8o
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Dideldum In RFGs Post (Nr. 5) ging es nicht um den Inhalt der Links.
    Du hast zuvor erläutert, was du mit versteckten Hyperlinks meinst. (Bezug:

    Dideldum schrieb:

    Ich möchte versteckte Hyperlinks (weiss nicht, ob man diese so nennt - damit meine ich Hyperlinks mit anderen Textbeschreibungen als der dahinterstehende Link) einbauen
    )
    RFG wollte wissen, ob er dich richtig verstanden hat und als Beispiel einen solchen Hyperlink vorgewiesen, wie er ihn deiner Beschreibung nach interpretiert. Es ist derselbe Link aber einmal heißt er so "Visual Studio – Empfohlene Einstellungen" und einmal so: "empfohlenen Einstellungen".
    In dem Sinne hätte ich 'versteckt' auch interpretiert.

    Mit Hyperlinks kann ich leider nicht helfen, aber bevor ihr zwei euch um Kopf und Kragen redet.^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hallöchen Ihr Zwei,

    @RodFromGermany,
    danke Dir für Deinen Beitrag! :)

    VB.NET-Quellcode

    1. Option strict on

    habe ich aus, weil ich mit meiner Datagridtabelle ansonsten vor - für mich unlösbaren Problemen stehe.
    Ich habe in der Variablenzuweisungsfunktion

    VB.NET-Quellcode

    1. ' Tabellen für DataGridViews:
    2. Dim dtFiles As DataTable
    3. Dim bsFiles As New BindingSource


    im Load-Handler der Mainform:

    VB.NET-Quellcode

    1. With dgv_Files
    2. .DataSource = bsFiles
    3. End With


    und an jeder Scriptstelle, in der ich auf bsFiles verweise wie z.B. auf "bsFiles(e.RowIndex).row" im folgenden Script:

    VB.NET-Quellcode

    1. Private Sub dgv_Files_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgv_Files.CellFormatting
    2. If e.RowIndex < bsFiles.Count Then
    3. ' Grösse formatieren
    4. If e.ColumnIndex = 2 Then
    5. Dim vl As String
    6. Dim row As DataRow = bsFiles(e.RowIndex).row
    7. Dim length As Integer = CInt(row.Item("Grösse"))
    8. If length < 1024 Then
    9. vl = length.ToString & " Bytes"
    10. ElseIf length < 1024 * 1024 Then
    11. vl = Math.Round(length / 1024, 3).ToString & " KB"
    12. ElseIf length < 1024 * 1024 * 1024 Then
    13. vl = Math.Round(length / 1024 / 1024, 3).ToString & " MB"
    14. Else
    15. vl = Math.Round(length / 1024 / 1024 / 1024, 3).ToString & " GB"
    16. End If
    17. e.Value = vl
    18. e.FormattingApplied = True
    19. End If
    20. End If
    21. End Sub


    Motzt das Studio und hüstelt was von wegen:
    "BC30574 Option Strict On lässt späteres Binding nicht zu"
    Was mir aber absolut nichts sagt und ich demnach auch nicht weiss, wie ich den Fehler vermeiden kann.
    Auch die mögliche Korrektur-Vorschläge führen zu keiner Änderung der Fehlermeldung.

    EDIT:
    habe mich nochmal damit auseinandergesetzt.
    So klappt es:

    VB.NET-Quellcode

    1. Public Function ZeileBSFiles(index As Integer) As DataRow
    2. If index < 0 OrElse index >= bsFiles.Count Then Return Nothing
    3. Return DirectCast(bsFiles(index), DataRowView).Row
    4. End Function
    5. Private Sub dgv_Files_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgv_Files.CellFormatting
    6. If e.RowIndex < bsFiles.Count Then
    7. ' Grösse formatieren
    8. If e.ColumnIndex = 2 Then
    9. Dim vl As String
    10. Dim row As DataRow = ZeileBSFiles(e.RowIndex)
    11. Dim length As Integer = CInt(row.Item("Grösse"))
    12. If length < 1024 Then
    13. vl = length.ToString & " Bytes"
    14. ElseIf length < 1024 * 1024 Then
    15. vl = Math.Round(length / 1024, 3).ToString & " KB"
    16. ElseIf length < 1024 * 1024 * 1024 Then
    17. vl = Math.Round(length / 1024 / 1024, 3).ToString & " MB"
    18. Else
    19. vl = Math.Round(length / 1024 / 1024 / 1024, 3).ToString & " GB"
    20. End If
    21. e.Value = vl
    22. e.FormattingApplied = True
    23. End If
    24. End If
    25. End Sub


    jetzt habe ich den Fehler BS30574 nur noch in:
    "outlookapi.createitem(0)", allen " .to = mEmpfänger" usw. Zuweisungen.

    VB.NET-Quellcode

    1. Dim outlookapi As Object
    2. Dim outlookItem As Object
    3. outlookapi = CreateObject("Outlook.application")
    4. outlookItem = outlookapi.createitem(0)
    5. With outlookItem
    6. .to = mEmpfänger
    7. .CC = mCCEmpfänger
    8. .BCC = mBCCEmpfänger
    9. .Subject = mBetreff
    10. '.body = mBody
    11. If ausLinkAufgerufen <> True AndAlso (My.Settings.EMail_ObjektAlsAnlageSenden = True OrElse Anlage = True) Then
    12. For vara = 0 To dgv_Files.SelectedRows.Count - 1
    13. anlagePfad = auslesenDateiname(dgv_Files.SelectedRows(vara).Index)
    14. If IO.File.Exists(anlagePfad) = True Then
    15. .Attachments.Add(anlagePfad)
    16. End If
    17. Next vara
    18. End If
    19. .Importance = My.Settings.EMail_Priorität
    20. .Display() ' nur anzeigen
    21. '.Send ' unsichtbar senden
    22. End With
    23. outlookapi = Nothing
    24. outlookItem = Nothing


    Wenn ich die Fehler auch noch wegbringen könnte, kann ich auch "Option Strict" wieder auf "ON" setzen.
    Aber hierzu finde ich absolut keine Lösung.

    @Haudruferzappeltnoch
    Auch Dir besten Dank für Deine Hilfe. ^^
    Aaaaah, jetzt lernt der Frosch fliegen.
    Dann habe ich das Post von @RodFromGermany gründlich missverstanden.
    Ja, genau solche Links meine ich mit versteckten Links - also Hyperlinks, die als Beschreibungstext nicht die in der LinkURL stehende Webadresse haben, sondern einen alternativen Text wie z.B. "Hier klicken" o.ä.

    EDIT2:
    @VaporiZed
    Ich habe inzwischen herausgefunden, dass im \fldrslt (FieldResult) unbedingt ein funktionierender (im Web existierender) Link stehen muss, damit die weiteren nach diesem Link folgenden Links ausgeführt werden können.
    Schreibe ich hier z.B. in FieldResult die nicht existierende Webadresse "https://www.rest.de" oder nur einen Text "Hier klicken" rein, wird dieser Link korrupt, und die Selection.start-Anzeige läuft Amok.
    Dieser Fehler verhindert, dass folgende Links ausgeführt werden können.
    Hat jemand vielleicht einen Tip, wie ich funktionierende versteckte Links (Hyperlinks mit anderer Linkbeschreibung, als der LinkURL) in einem RTF funktionsfähig einbauen kann?
    Ich habe mir den o.g. Link-Test mit vier normalen Links im Word erstellt und nach dem 2. Link ebenfalls einen versteckten Link eingefügt.
    Im Word funktionieren alle Links und ich kann diese mit Strg+Anklicken im Browser öffnen.
    Dann habe ich diese Datei im Word als RTF gespeichert und in meiner RTF-Box aufgerufen.
    Ergebnis: Exakt das selbe Problem wie beim Erstellen in der Richtextbox.
    Kann dieses Verhalten am Interpreter der RTFBox selbst liegen?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Dideldum“ ()