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 werdenrftAWL->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 erWoran 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