Schriftfarbe der Einzelnen Zeilen einer RichtTextBox ändern



  • Hallo

    kurze Frage

    kann man in RichText Box die Schriftfarbe der einzelnen Zeilen ändern.
    also Zeile 1 Blau Zeile 2 Grün usw.

    Vielen Dank schonmal

    Felix



  • Ja kann man. Siehe dazu Eigenschaft TRichEdit::SelAttributes. Da ist auch ein Beispiel.



  • Ok SelAttributes sieht schonmal ganz gut aus jetzt muß ich nur noch den zubearbeitenden text markieren oder?

    die Frage ist nur wie?

    Hilfe benötigt Helfer wird mit Dank überschüttet 🙂

    MfG Felix



  • Hast Du schon einen Blick in die Hilfe des BCB geworfen. Das ist das alles mit Beispielen drin... Ich hab keine Lust das hier alles rein zu kopieren.



  • Natürlich hab ich in die Hilfe geschaut ich sag dir mal was passiert und was passieren soll vielleicht wirds dann klarer

    ich gebe ein: ue0.0
    [Drücke Entertaste]
    Text wird überprüft und soll dann mit folgendem Code rot eingefärbt werden

    rftAWL->SetFocus();
    rftAWL->SelStart=1;
    rftAWL->SelLength = (StrLen(STbearbeiten.c_str()));
    rftAWL->SelAttributes->Color=clRed;
    

    Wenn er aber das abgearbeitet hat steht nur noch "u" da und zwar Schwarz

    So woran kann das liegen weil eigentlich sollte das den Text ja überhauptnicht verändern.

    MfG Felix



  • Hallo

    AnsiString STbearbeiten = "ue0.0"; // Denke mal das soll der Typ des Symbols sein
    rftAWL->SetFocus();
    rftAWL->SelStart=0; // Beim ersten zeichen anfangen
    rftAWL->SelLength = STbearbeiten.Length(); // Länge diretk aus dem String bestimmen
    rftAWL->SelAttributes->Color=clRed;        
    rftAWL->SelLength = 0; // Auswahl rückgängig machen
    

    bis bald
    akari



  • so jetzt ist es fast richtig das Problem ist noch das der String der ausgelesen wird eine Zeile tiefer steht als ich ihn eingegeben habe.

    was habt ihr dafür für eine erklärung bzw. kann man das Rückgängig machen.

    MfG Felix



  • Hallo

    Du must doch wissen, wo du welche Strings in das RichEdit eingibst. Eventuell ist ja vor deiner Eingabe noch ein einzelner Zeilenumbruch.

    bis bald
    akari



  • das Problem ist, das diese funktion beim drücken der Entertaste erfolgt und wenn man die markierung aufhebt wird ja der Coursor an den Anfang des Strings gesetzt und erst dann wird der durch Enter ausgelöste Zeilenumbruch ausgelöst also muß ich noch meinen Coursor ans ende Der Zeile setzen.

    Da bin ich grad dran dürfte aber mit der CaretPos möglich sein

    aber irgendwie will er mir mit folgendem Code trotzdem nicht das richtige machen.

    rftAWL->SetFocus();
                                    rftAWL->SelStart=0; // Beim ersten zeichen anfangen
                                    rftAWL->SelLength = STZeile.Length(); // Länge diretk aus dem String bestimmen
                                    rftAWL->SelAttributes->Color=clRed;
                                    rftAWL->SelLength = 0; // Auswahl rückgängig machen
                                    rftAWL->CaretPos.y=x;
                                    rftAWL->CaretPos.x=STZeile.Length();
    

    Wahrscheinlich kleiner Fehler mit großen folgen



  • Hallo

    nimm statt

    rftAWL->CaretPos.y=x;
    rftAWL->CaretPos.x=STZeile.Length();
    

    einfach

    rftAWL->SelStart = rftAWL->Text.Length();
    

    zum Positionieren.

    bis bald
    akari



  • Hallo erstmal folgendes der obige Code klappt irgendwie nur in der ersten Zeile muß ich da für alle Zeichen mit zählen und den Selstart auf den Wert Stellen minus der Länge (Also Selstart=Zeichengesamt-String.length)

    oder wählt SelStart = 0 den ersten Buchstaben der gerade verwendeten Zeile

    MfG Felix



  • Ausserdem fügt er noch eine Leerzeile ein die ich überhaupt net will.

    Hier nochmal der Code

    rftAWL->SelLength = (StrLen(STbearbeiten.c_str()));*/
     rftAWL->SetFocus();
     rftAWL->SelStart=0; // Beim ersten zeichen anfangen
     rftAWL->SelLength = STZeile.Length(); // Länge diretk aus dem String bestimmen
     rftAWL->SelAttributes->Color=clRed;
     rftAWL->SelLength = 0; // Auswahl rückgängig machen
     rftAWL->SelStart = rftAWL->Text.Length();
     rftAWL->SelAttributes->Color=clWindowText;
    

    folgendes Passiert

    eingabe U e0.0
    [Enter] drücken
    Bsp:
    Ue0.0
    //hier sollte der Coursor stehen
    //hier steht er

    Woran kann das liegen?

    MfG Felix



  • bierber schrieb:

    Hallo erstmal folgendes der obige Code klappt irgendwie nur in der ersten Zeile muß ich da für alle Zeichen mit zählen und den Selstart auf den Wert Stellen minus der Länge (Also Selstart=Zeichengesamt-String.length)

    oder wählt SelStart = 0 den ersten Buchstaben der gerade verwendeten Zeile

    Mit SelStart = 0 wird in der Tat der Cursor vor das erste Zeichen des gesamten Textes gsetzt, nicht nur der Zeile. Wenn du andere Zeilen als die erste auswählen willst, must du wie du schon beschrieben hast, den Zähler erst noch bestimmen.

    Ausserdem fügt er noch eine Leerzeile ein

    Das liegt aber nicht an dem von mir gepostetet Code, denn da wird übrhaupt gar nichts eingefügt.
    Du must also die Stelle wo die überflüssige Leerzeile eingefügt wird woanders suchen.

    bis bald
    akari



  • so hab jetzt den Code überarbeitet und einen Zähler eingebaut

    der sieht folgendermassen aus:

    x=rftAWL->CaretPos.y;
    
            STZeile=rftAWL->Lines->Strings[x]; //liest Zeile x aus   Zeile 1 ==> x=0
            STbearbeiten=STZeile;
            intAnzZeichen[x]=STZeile.Length();
            if(x>0)
            {
                    for (j=0;(x-1)>=j;j++)
                    {
                            intAnzZeichenAktuell=intAnzZeichenAktuell+intAnzZeichen[j];
                            intAnzZeichenAktuell++;
                    }
    
            }
    

    so und die Farbänderung sieht jetzt so aus:

    rftAWL->SetFocus();
                                    rftAWL->SelStart=intAnzZeichenAktuell; // Beim ersten zeichen anfangen
                                    rftAWL->SelLength = STZeile.Length(); // Länge diretk aus dem String bestimmen
                                    rftAWL->SelAttributes->Color=clRed;
                                    rftAWL->SelLength = 0; // Auswahl rückgängig machen
                                    rftAWL->SelStart = rftAWL->Text.Length();
                                    rftAWL->SelAttributes->Color=clWindowText;
    

    Problem ist jetzt das in Zeile 1 alles Wunderbar läuft aber ab Zeile 2 werden nur noch die ersten 3 Zeichen eingefärbt.

    Ich verstehe es net!

    Das mit der LeerZEILE kommt nur in diesem Code vor nicht im oberen

    rftAWL->SetFocus();
                                    rftAWL->SelStart=0; // Beim ersten zeichen anfangen
                                    rftAWL->SelLength = STZeile.Length(); // Länge diretk aus dem String bestimmen
                                    rftAWL->SelAttributes->Color=clWindowText;
                                    rftAWL->SelLength = 0; // Auswahl rückgängig machen
                                    rftAWL->SelStart = rftAWL->Text.Length();
    

    zur info das ganze wird beim Enterdrücken in der RichTextBox ausgelöst kann es sein das er von selber schon durch
    rftAWL->SelStart = rftAWL->Text.Length();
    in die nächste Zeile Springt?

    MfG Felix



  • So brauche hilfe kann mir jemand mal ne Funktion schreiben die bei jedem Aufruf der Funktion die aktuelle Zeile(in der der Coursor steht) rot einfärbt?

    Ich probier das jetzt schon eine geschlagene Woche und komme einfach nicht drauf wie das geht

    Wäre supper nett weil ich werd Wahnsinnig damit 😡

    MfG Felix



  • der folgende Code färbt dir beim drücken der Entertaste die letzte Zeile rot ein.

    void __fastcall TForm1::RichEdit1KeyPress(TObject *Sender, char &Key)
    {
       if(Key == VK_RETURN)
       {
          int LastLine = RichEdit1->Lines->Count-1;
          int SelStart = 0;
          int SelLength = RichEdit1->Lines->Strings[LastLine].Length();
        //erstes Zeichen der letzten Linie suchen
          for(int i=0;i<LastLine;i++)
          {
             SelStart += RichEdit1->Lines->
                         Strings[i].Length()+2;    //+2 wegen \r\n am Ende der Zeile
          }
        //letzte Zeile markieren
          RichEdit1->SelStart = SelStart;
          RichEdit1->SelLength = SelLength;
          RichEdit1->SelAttributes->Color = clRed;
        //Cursor an letztes Zeichen setzen und Selectierung aufheben
          RichEdit1->SelStart = SelStart + SelLength+2;
          RichEdit1->SelLength = 0;
        //Text Farbe wieder auf schwarz setzen
          RichEdit1->SelAttributes->Color = clBlack;
       }
    }
    


  • Merci

    danke danke danke

    bei mir waren die +2 as Problem

    SelStart += RichEdit1->Lines->
    Strings[i].Length()+2;

    jetzt klppt es wunderbar

    danke für die Hilfe

    MfG Felix


Anmelden zum Antworten