Announcement

Collapse
No announcement yet.

Wiedermal Richedit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wiedermal Richedit

    Hallo zusammen,

    gibt es eine Möglichkeit die Attribute (Farbe, Font...) der Wörter in einem Richedit ohne Selstart, Sellength, Seltext zu verändern? So nach dem Motto: das 5. Wort wird blau aber ohne lästige Markierungen.

    Für Eure Hilfe bin ich sehr dankbar.

    Roc

  • #2
    Hi,<br><br>Natürlich geht das ...<br><br>Beschäftige dich mit: <br><br>TCharRange, TCharFormat, EM_GETLINECOUNT, EM_EXGETSEL, EM_GETCHARFORMAT, WM_GETTEXTLENGTH, EM_SETCHARFORMAT, EM_REPLACESEL, EM_LINEFROMCHAR, EM_EXSETSEL ...<br><br>Beispielcode kann ich Dir leider nicht geben. Jedoch in der<br>Hilfedatei WIN32.HLP finden Sie genügend erläuterungen...<br><br>Gruss M.Müller<br&gt

    Comment


    • #3
      Hallo Markus,<br>
      <br>
      die Messages usw. die Du da erwähnst, sind die, die Delphi intern bei SelStart, SelLength... verwendet. Delphi macht also intern genau das gleiche => die Markierungen können so nicht umgangen werden.<br>
      So gesehen bieten die Sourcen der VCL dafür Beispielcode.<br>
      <br>
      @roc<br>
      Ein Idee, wie es tatsächlich ohne Markierungen gehen könnte kommt mir da aber noch. Ob diese durchführbar ist, weiss ich leider nicht:<br>
      Eventuell könntest Du die RTF-Tags an den entsprechenden Stellen in das Dokument einbauen. Die Position und Länge, für ein Attribut musst Du ja so oder so ermitteln.<br>
      Egal, ob das überhaupt so ohne Weiteres geht: Du sparst Dir damit ausschliesslich die Markierung, und bei einem einzigen Wort fällt das kurze Markieren eigentlich nicht so sehr auf.<br>
      <br>
      Ciao<br>
      Chri

      Comment


      • #4
        Hallo Roc,<br>
        <br>
        es geht doch noch einfacher (kennst Du den Spruch vom Wald und den Bäumen ...)<br>
        Für den Zeitraum, in dem keine Markierungen zu sehen sein sollen, kannst Du schlicht die Eigenschaft HideSelection auf true setzten. Dann werden diese nicht angezeigt.<br>
        (Hab' ich zwar noch nicht probiert, sollte aber, gemäss Doku, funkionieren)<br>
        <br>
        Ciao<br>
        Chri

        Comment


        • #5
          oder mal mit Lines.BeginUpdate/.EndUpdate arbeiten, diese nutzen intern RichEdit.Perform(wm_SetRedraw, 0/1, 0);

          Hage

          Comment


          • #6
            Hi,<br><br>Man kann die aktuelle Markierung mit EM_EXGETSEL holen, anschliessend auf die<br>zu ändernden Textteile setzen, Änderungen vornehmen und die geholte Markierung wieder setzen mit EM_EXSETSEL.<br><br>Gruss M.Mülle

            Comment


            • #7
              @Markus, das wissen wir ja, denn nur so kann man dem RichEdit sagen welcher Abschnitt des Textes gemeint ist. Man kommt also da nicht drumrum. Das problem ist aber das beim Umsetzen der Markierung die auch sichtbar wird (flackert). Eine Lösung wäre eben die Anzeige zu unterdrücken, siehe mein Posting oben.

              Hage

              Comment


              • #8
                @Reddmann, Das Flacken lässt sich mit wm_SetRedraw ganz unterbinden?
                Gruss M.Mülle

                Comment


                • #9
                  Jain, wm_SetRedraw verhindert das der Gerätecontext (DC) gültig wird, d.h. es wird alles gezeichnet wie bisher, es wird aber nicht dargestellt. Der DC ist also ein DC ohne dahinterliegendem Bildschirm, ein Dummy DC also. Damit wird also KEIN Geschwindigkeitsvorteil erreicht und das Control verhält sich so als würde es tatsächlich gezeichnet.<br>
                  Lines.Begin/Endupdate nutzt intern auch wm_SetRedraw.<br>
                  Das Problem mit dem RichEdit ist aber das die Positionierung des Carets auch zu einem Scrolling führen kann. Wird also mit wm_SetRedraw das Zeichnen unterdrückt und innerhalb dessen mit .SelStart die Selection verschoben, dann wird zwar nicht gezeichnet aber eben gescrollt. Da dieses aber unterdrückt wurde können nachfolgend Fehldarstellungen entstehen. Leider speichert das Richtedit intern die Scrollposition und beim zurücksetzen von .SelStart wird von unten nach oben reingescrollt, eine erneute Darstellung ist also verrutscht.

                  Hage

                  Comment


                  • #10
                    @Reddmann, Danke für Ihre ausführliche Erläuterung.<br>Im TListBox gibt es einen TopIndex. Anhand diesem kann der erste sichtbare Eintrag<br>ermittelt werden. gibt es so etwas auch im RichEdit? Oder kann das 1. sichtbare Textzeichen ermittelt werden?<br>Damit könnte man zuerst ein EM_EXSETSEL auf dieses Zeichen ausgeführt werden.<br>und anschliessend die entsprechende Markierung.<br><br>Gruss M.Mülle

                    Comment


                    • #11
                      Wow.

                      Das sind ja ne ganze Menge Ideen! Vielen dank. Ich werde mal alles ausprobieren.
                      Mal ne interessante Frage, wie ich finde: Wie bewerkstelligt das ganze der Quellcode-Editor in Delphi. Wenn ich dort ein Befehl, wie z.B. "if" eingebe wird es ja auch syntaktisch hervorgehoben. Ich sehe jedenfalls keine Markierungen, egal wie schnell ich schreibe oder die CPU ausgelastet ist.

                      Euer Feedback is KLASSE!

                      Ro

                      Comment


                      • #12
                        Hi Roc

                        Das IDE ist KEIN RichEdit sondern eine Eigenentwicklung von Borland. Interessanterweise findet man im WEB eine sehr gute vergleichbar Freeware Komponente. (frag mich nicht wie sie heist müsste erst suchen). Das Freewareprogram "Context" nutzt diese Komponente.
                        Alles was das IDE kann kann man auch mit dieser Kompo. erschlagen.

                        @Müller, nein gibts beim RE nicht. Es gibt aber die Möglichkeit den Index dae ersten sichtbaren Zeichens zu ermitteln. Aber das hilft nichts, da der RE mit variablen Fonts + inbedded Graphics + inbedded OLE + auto Wordwrap arbeiten kann. All diese Features verhindern eine "exakte" Zeilenberechnung bzw. Zeilenpositionierung. Zusätzlich enthält das RTF-Format noch Formatierungsbefehle die als solches nicht als Text dargestellt werden. Eine direkte Synchronisation der Plaindaten mit dem Text-Zeichenindex ist damit unmöglich.<br>
                        All diese Gründe erklären sehr gut die Schwierigkeiten und den Grund dafür warum z.b. das Delphi IDE eben nur mit Fixed Fonts arbeiten kann.

                        Gruß Hage

                        Comment


                        • #13
                          Es gibt aber Wege denoch das RE so umzubiegen das es exakt und sauber funktioniert. Das Ziel ist es eine BeginUpdate/EndUpdate Funktionalität ins RE zu integrieren die das Neudarstellen + Kontextveränderungen verhindert. Möglich ist das durch wm_Setredraw und umbiegen der WndProc() funktionen, abhängig ob gelockt wurde oder nicht. Abgefangen werden die Messages wm_HScroll, wm_VScroll, wm_ScrollCaret, wm_Size, wm_WindowPosChanging, wm_Paint, wm_NCPaint, wm_EraseBkGnd einige wichtige em_xxxx Messages und bei einigen en_xxx NotifyMessages müssen die Rückgabewerte manipuliert werden. Zusätzlich dann noch die Messages wm_Print, wm_PrintClient, em_FormatRange. Alles in allem ist es "a lot of work" aber definitiv möglich, da ichs schon selber umgesetzt habe.

                          Gruß hage

                          Comment


                          • #14
                            @Reddmann, schade.<br>Ich habe gerade quer durch Web gesucht und auch verschiedene RichEdit's gefunden, jedoch keine, die Freeware sind und diese Funktion unterstützen. :-(<br>Ich ziehe den Hut vor Ihnen. Das mit den Windows-Botschaften ist wirklich schwierig (ich habe mich damit auch schon rumgeärgert).<br>Vielleicht kennen Sie doch noch einen Link? Roc und ich würden uns sehr freuen.<br><br>Gruss M.Mülle

                            Comment


                            • #15
                              Leider nicht sonst hätte ich mir auch nicht diesen Aufwand geleistet. Bei mir gings darum das RE so zu erweitern daß es bestimmte Formatierungen durch Werte ersetzt. Z.b. steht im Text "Sehr geehrter Herr [Name], anbei die am [Datum] geforderten...", und nun soll eine StringListe über .Values['Name'] := 'Reddmann' diese Parameter ersetzen. Natürlich sollte es NICHT flackern und deshalb habe ich mich mehrere Tage mit diesem Problem herumgeschlagen. Wenn es ein RE-Ersatz gäbe, der auch so wenig Code frisst wie RE, dann hätte ich garantiert diese Ersatz-Komponente benutzt.

                              Hage

                              Comment

                              Working...
                              X