RichEdit-Chatbox-UDF

  • Hallo, so eben ist meine ChatBox-UDF OHNE IE (Internet Explodierer :P) fertig geworden. Ist sicherlich für jedes Highlighting nützlich^^ Nutzbar durch:

    [autoit]

    BB-Codes: Text (bold), das gleiche mit i (italic), u (underlined) und s (striked).
    Farben: [c=#abcdef]Farblich[/code]

    [/autoit]


    Schriftgröße: Test

    Viel Spaß damit :)


    EDIT:
    Screenshot:
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    EDIT: Update: keine Datei mehr
    EDIT: Update: bessere Perfomance, für jedes RichEdit brauchbar, danke Progandy :thumbup:
    EDIT: Bugs entfernt, z.B. gingen Farben nicht über mehrere Zeilen

  • So hab es noch angehängt und das Ergebnis vom Beispiel drin (im Vergleich zum IE-Embedd viel schärfere Schrift ^^)

  • Gefällt mir :thumbup:
    wird sicherlich in Zukunft das eine oder andere "Edit" ersetzen und
    somit viel benutzerfreundlicher implementiert werden :)
    ich muss sagen, bisher war mir die Umsetzung mit dem IE zu umständlich/optisch nicht
    so ansprechend und schwieriger umzusetzen...
    "Leider" kann ich dieses Argument nicht mehr benutzen um meinen LAN-Chat
    aufzuschieben ;)

    Mal ne Frage an die "Könner":
    Ist es performanter die (derzeit) lokale Variable in jeder (benötigten) Funktion neu zu deklarieren + initialisieren,
    oder mit Global zu arbeiten?

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Warum hast du denn die Datei eingeführt? Das geht doch viel einfacher per _GUICtrlRichEdit_AppendText ;)
    Edit: Eine Funktion, die vielleicht besser ist, um auch Unicode-Zeichen im RTF haben zu können:

    [autoit]

    ; ProgAndy
    Func _GUICtrlRichEdit_AppendTextUTF8($hWnd, $sText)
    If Not IsHWnd($hWnd) Then Return SetError(101, 0, False)

    [/autoit][autoit][/autoit][autoit]

    Local $iLength = _GUICtrlRichEdit_GetTextLength($hWnd)
    _GUICtrlRichEdit_SetSel($hWnd, $iLength, $iLength) ; go to end of text
    Local $tSetText = DllStructCreate($tagSETTEXTEX)
    DllStructSetData($tSetText, 1, $ST_SELECTION)
    DllStructSetData($tSetText, 2, 65001)
    Local $iRet = _SendMessage($hWnd, $EM_SETTEXTEX, DllStructGetPtr($tSetText), BinaryToString(StringToBinary($sText, 4), 1), 0, "ptr", "STR")
    If Not $iRet Then Return SetError(700, 0, False)
    Return True
    EndFunc ;==>_GUICtrlRichEdit_AppendText

    [/autoit]
  • Ist es performanter die (derzeit) lokale Variable in jeder (benötigten) Funktion neu zu deklarieren + initialisieren,
    oder mit Global zu arbeiten?


    Wenn man im Autoit-InlineASM eine Variable hat, erscheint die Zahl auch im Bytecode, ich glaube also, dass es nur mehr Platz verbraucht wenn du in jeder Funktion ein Local mit gleichen Variablen hat, aber manchmal hast du viele Variablen und kannst mit Local dann getrost alle Variablen verwenden (in der Funktion natürlich).

    Warum hast du denn die Datei eingeführt? Das geht doch viel einfacher per _GUICtrlRichEdit_AppendText ;)
    Edit: Eine Funktion, die vielleicht besser ist, um auch Unicode-Zeichen im RTF haben zu können:


    Das Problem ist, dass ich mir dem RichEditFormat arbeite und nur Farbtabellen erlaubt sind, dh ich muss oben Farben und Text einfügen. Aber ich hatte erst gedacht, ich brauch Dateien, damit genug rein kann, ich musste dann aber doch irgendwann fast alles in eine Variable tun, ich änder es noch, dass alles in Variablen ist.

    EDIT:
    Update oben, keine Datei mehr benutzt

    Einmal editiert, zuletzt von TheShadowAE (26. Februar 2011 um 09:18)

  • Das Problem ist, dass ich mir dem RichEditFormat arbeite und nur Farbtabellen erlaubt sind, dh ich muss oben Farben und Text einfügen. Aber ich hatte erst gedacht, ich brauch Dateien, damit genug rein kann, ich musste dann aber doch irgendwann fast alles in eine Variable tun, ich änder es noch, dass alles in Variablen ist.


    Das RichEdit-Control ist klug genug. Du kannst einfach einen RTF-formatierten Text unklusive Farbtabelle anhängen. Das wird dann passend ins Dokument integriert und muss nicht von dir gemacht werden.

  • Hättest d mir das früher gesagt...
    der macht also mit {\rtf1\utf8 text } {\rtf1\utf8 text2 } einfach nur eine text1 text2 anzeige, wo dann die farbtabellen zusammengelegt werden? Wird auch das \cfN durch das richtige ersetzt?

  • Hättest d mir das früher gesagt...


    Du hast ja nicht gefragt.


    der macht also mit {\rtf1\utf8 text } {\rtf1\utf8 text2 } einfach nur eine text1 text2 anzeige, wo dann die farbtabellen zusammengelegt werden? Wird auch das \cfN durch das richtige ersetzt?


    Ja, jedenfalls bei mir ;)

  • Danke, ich arbeite im Moment dann an der neuen Lösung, damit kann man dann an jedes RichEdit anfügen :)

    EDIT: fertig, Upgedated

    • Offizieller Beitrag

    Sieht gut aus, deine UDF. :thumbup:

    Was jetzt noch fehlt, sind Smileys einzufügen.

    Edit: Habe versucht mal das RichEdit zu speichern, komischerweise funktioniert _GUICtrlRichEdit_StreamToFile dabei nicht, die Datei hat 0 Länge 8|

  • Dann hast du vielleicht noch das Array von der alten UDF genommen. Das neuste gibt nur das RichEdit zurück. Das StreamToVar was ich probiert hab (am Ende, um etwas drin zu haben) hat funktioniert, ansonstendanke fürs testen, wie da Smileys reinkommen können wüsste ich nicht wie das gehen soll, ich habe auch keine große Motivation dazu, weil ich die Textsmileys lieber mag :D

    PS: Abgesehen davon, kann ich gerade nichts ändern, weil mein PC streikt, ist in Reparatur

    • Offizieller Beitrag

    Deine UDF hat ein Problem damit farbige Zahlen darzustellen.

    Beispiel:

    [autoit]

    _ChatBoxAdd($Edit1,"[c=#00FF00]8Grün[/code]"&@CRLF)

    [/autoit]


    Sobald eine Zahl direkt nach dem Colorbefehl steht wird die Zahl nicht angezeigt und der darauffolgende Text Schwarz dargestellt.
    Habe den Fehler gefixt in die Zeile

    [autoit]

    $txt=StringRegExpReplace($txt,"\[c=#"&$sp[$x*2]&"\](.*?)\[\/c\]","{\\cf"&$colors&"$1}")

    [/autoit]


    muß dieser Inhalt:

    [autoit]

    $txt=StringRegExpReplace($txt,"\[c=#"&$sp[$x*2]&"\](.*?)\[\/c\]","{\\cf"&$colors&" $1}")

    [/autoit]


    Es fehlte einfach ein Leerzeichen, schon werden die Zahlen farbig.
    Dieser Scriptteil ist vollkommen unnötig:

    [autoit]

    For $z=$x+1 To $anz
    If $z>$anz Then ExitLoop
    If $sp[$z*2]=$sp[$x*2] Then
    _ArrayDelete($sp,$z*2)
    _ArrayDelete($sp,$z*2)
    $anz-=1
    EndIf
    Next

    [/autoit]


    PS: Der Fehler mit dem Speichern hab ich auch gefunden.
    Ich benutze einfach StreamToVar und speichere die Variable einfach in eine Datei.
    Aus mir nicht erkennbaren Grund kann _GUICtrlRichEdit_StreamToFile keine Datei benutzen Fehler 102.

  • Aus mir nicht erkennbaren Grund kann _GUICtrlRichEdit_StreamToFile keine Datei benutzen Fehler 102.


    Lol, hast du dir mal die Funktion angesehen? Das steht da drin, da fehlt ein Gleichheitszeichen:

    [autoit]

    ...
    Local $hFile = FileOpen($sFilespec, 2) ; overwrite
    If $hFile - 1 Then Return SetError(102, 0, False)
    ...

    [/autoit]


    Die Funktion funktioniert zufällig genau dann, wenn das FileHandle 1 ist.

    • Offizieller Beitrag

    Ist mir gar nicht aufgefallen 8| Ich hab aber nicht wirklich gesucht, wil es beim Testscript von TheShadowAE gefunzt hat. :D

  • Raupi Der Skriptteil bewirkt, dass keine Farben doppelt kommen, das mit dem Leerziechen kann ich nicht testen, kommt da dann ein Leerzeichen im RichEdit? Ansonsten danke, wird bei Möglichkeit geändert

    • Offizieller Beitrag

    Nein, es wird kein Leerzeichen eingefügt.

    Beispiel:

    [autoit]

    _ChatBoxAdd($Edit1,"[c=#00FF00]8Grün[/code]"&@CRLF)

    [/autoit]

    ergibt ohne Leerzeichen folgenden RichEdit-String


    {\cf28 gibt es aber nicht
    Mit dem Leerzeichen :


    die Zuordnung {\cf2 ist vollkommen in Ordnung. ;)
    1 Leerzeichen zwischen {\cf2 und dem darauffolgenden Text wird nicht als solches interpretiert.
    Im Normalfall ist immer 1 Leerzeichen vorhanden :thumbup: Bei allen Nichtzahlen ist das RichEdit aber tollerant und arbeitet richtig.

  • Das ist wirklich gut geworden.
    Du möchtest vielleicht noch das in deine Konverter-Funktion einbauen, damit niemand unerwünschte RTF-Code einschlueßen kann:

    [autoit]

    $txt=StringReplace($txt,"{","\{", 0, 1)
    $txt=StringReplace($txt,"}","\}", 0, 1)

    [/autoit]
    • Offizieller Beitrag

    Ich habe noch den überflüssigen Eintrag im colorbl gekillt.

    [autoit]

    Local $__CB__filesstr="{\rtf1\utf8" & @CRLF & "{\colortbl;" & @CRLF & "}" & @CRLF & @CRLF & "}"

    [/autoit]

    und dazu die abgeänderte _ChatBoxConvert:

    Spoiler anzeigen
    [autoit]

    Func __ChatBoxConvert($txt)
    $txt=StringReplace($txt,"{","\{")
    $txt=StringReplace($txt,"}","\}")
    $txt=StringRegExpReplace($txt,"(?i)\[b\](.*?)\[\/b\]","{\\b $1}")
    $txt=StringRegExpReplace($txt,"(?i)\[i\](.*?)\[\/i\]","{\\i $1}")
    $txt=StringRegExpReplace($txt,"(?i)\[u\](.*?)\[\/u\]","{\\ul $1}")
    $txt=StringRegExpReplace($txt,"(?i)\[s\](.*?)\[\/s\]","{\\strike $1}")
    Local $aColor = StringRegExp($txt, "(?i)\[c=#([0-9A-Fa-f]{6})\].*?\[\/c\]", 3)
    Local $sColor, $iColors
    If Not @error Then
    For $i = 0 To UBound($aColor) - 1
    $sColor &= "\red" & Dec(StringMid($aColor[$i], 1, 2)) & "\green" & Dec(StringMid($aColor[$i], 3, 2)) & "\blue" & Dec(StringMid($aColor[$i], 5, 2)) & ";" & @CRLF
    $iColors += 1
    $txt = StringRegExpReplace($txt, "\[c=#" & $aColor[$i] & "\](.*?)\[\/c\]", "{\\cf" & $iColors & " $1}")
    Next
    EndIf
    $txt = StringReplace($txt, @CRLF, "\line" & @CRLF)
    Local $sRTFString = StringMid($__CB__filesstr, 1, StringInStr($__CB__filesstr, "l;" & @CRLF) + 2) & _
    $sColor & _
    StringTrimRight(StringMid($__CB__filesstr, StringInStr($__CB__filesstr, "l;" & @CRLF, 1, 1) + 4), 4) & _
    $txt & _
    "}"
    Return $sRTFString
    EndFunc

    [/autoit]


    Dein Ursprungscode war ein bischen verquer. :D