Autor |
Beitrag |
jackie05
      
Beiträge: 357
|
Verfasst: Di 09.02.10 21:14
Hallo,
ich möchte ein beliebiger Text Fett anzeigen lassen in RichEdit.
z.B. Dies ist _ein_ Test!
Dies ist ein Test!
oder
z.B. _Dies_ ist _ein_ Test!
Dies ist ein Test!
Das was zwischen _?_ ist, soll Fett angezeigt werden.
Der erste unterstrich aktiviert die Fett-Schrifft und der zweite unterstrich deaktiviert die Fett-Schrift.
Kann man mein Quellcode nicht irgendwie ändern, damit ich auch mit den unterstriche eine Fette schrift bekomme?
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| var s: string; begin RichEdit1.Clear; List.Add('°K°'+Memo1.Text); s := List.Text; s:=StringReplace(s, '#', #13#10+'.......', [rfReplaceAll]); while Pos('°',s) > 0 do begin case s[2] of 'A' : RichEdit1.SelAttributes.Color := RGB(128, 128, 128); 'B' : RichEdit1.SelAttributes.Color := RGB(0, 0, 255); 'C' : RichEdit1.SelAttributes.Color := RGB(0, 255, 255); 'D' : RichEdit1.SelAttributes.Color := RGB(64, 64, 64); 'E' : RichEdit1.SelAttributes.Color := RGB(0, 172, 0); 'G' : RichEdit1.SelAttributes.Color := RGB(0, 255, 0); 'K' : RichEdit1.SelAttributes.Color := RGB(0, 0, 0); 'L' : RichEdit1.SelAttributes.Color := RGB(192, 192, 192); 'M' : RichEdit1.SelAttributes.Color := RGB(255, 0, 255); 'N' : RichEdit1.SelAttributes.Color := RGB(150, 74, 0); 'O' : RichEdit1.SelAttributes.Color := RGB(255, 200, 0); 'P' : RichEdit1.SelAttributes.Color := RGB(255, 175, 175); 'R' : RichEdit1.SelAttributes.Color := RGB(255, 0, 0); 'W' : RichEdit1.SelAttributes.Color := RGB(255, 255, 255); 'Y' : RichEdit1.SelAttributes.Color := RGB(255, 255, 0); end; Delete(s,1,3); if Pos('°',s) = 0 then begin RichEdit1.SelText := s end else begin RichEdit1.SelText := Copy(s,1,Pos('°',s)-1); Delete(s,1,Pos('°',s)-1); end; end; List.Clear; |
Dieser Quellcode färbt Texte in ein beliebige farbe, z.B.
Dies °R°ist °B°ein Test!
Dies ist ein Test!
Wie könnte ich das jetzt so um ändern, damit ich auch Fette Texte anzeigen kann wie oben beschrieben?
Vielen Dank schonmal im Voraus.
MfG Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 10.02.2010 um 20:26
|
|
martin300
      
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: Di 09.02.10 22:43
Hallo,
zuerst braucht man einen
Delphi-Quelltext 1:
| procedure superStringListAnalyser(txt: String); |
der trennt den Text und dann noch
Delphi-Quelltext 1:
| procedure makeBold (txt: String); |
etwas fettes und
Delphi-Quelltext 1:
| procedure makePlain (txt: String); |
etwas "normales";
Der SuperStringListAnalyser wird mit dem Text gefüttert, zwischendurch werden die Texte mit den beiden Procedures aufgerufen.
Im Prinzip ist das Programm fertig, sind aber nicht viele Zeilen. Wenn du sie selber machen möchtest poste ich den restlichen Code nicht.
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: Mi 10.02.10 08:43
Vielen Dank für die antwort.
Leider komme ich nicht so klar mit der Formatierung etc.
Ich würde mich sehr freuen, wenn du mir einen beispiel Code Posten könntest.
Vielen Dank.
MfG
|
|
martin300
      
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: Mi 10.02.10 09:49
hi,
hier die beiden Formatierungen,
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.makeBold(txt: String); begin RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style + [fsbold]; richedit1.SelText := txt; RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style - [fsbold]; end;
procedure TForm1.makePlain(txt: String); begin richedit1.SelText := txt; end; |
der Analyser
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.superStringListAnalyser(txt: String); var strList : TStringList; I: Integer; begin strList :=TStringList.Create; strlist.Delimiter := '_'; strList.DelimitedText := txt; for I := 0 to strlist.Count - 1 do begin if (i mod 2 = 1) then begin makebold(strlist.Strings[i]); end else begin makeplain(strList.Strings[i]); end; end; end; |
und noch der Start.
Delphi-Quelltext 1: 2: 3: 4: 5:
| procedure TForm1.Button1Click(Sender: TObject); begin Richedit1.SelStart := 0; superStringListAnalyser('wir_sind_imwald_und_haben_noch_mehr'); end; |
Alernativ könntest du noch den superStringListAnalyser anpassen und dort Zeichen für Zeichen analysieren (anstelle der TStringList). Ist aber abhängig wieviele Formatierungen eingebaut werden.
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: Mi 10.02.10 10:23
Vielen Dank für die Mühe.
Es funktioniert zwar, aber wie kann ich mein Quellcode für die Farben mit benutzen?
Weil wenn ich beides zusammen benutze, dann funktioniert die formatierung nicht mehr korrekt.
MfG
|
|
martin300
      
Beiträge: 186
Erhaltene Danke: 2
|
Verfasst: Mi 10.02.10 11:31
Hallo,
das stimmt. Beides zusammen funktioniert nicht.
Da müsste noch etwas geändert werden. Eine Möglichkeit ist alles neu zu machen und in dem Parser (der den String Analysiert) die Fettfunktion einzubauen. (Das ist sicher schöner, aber auch ein wenig schwieriger).
Alternativ der einfacherer, aber nicht so schöne Weg: Du lässt deinen Code so wie er ist und zeigst alles im Richedit an. Dort erscheint dann der Text bunt. Dann änderst du meinen Code um und zwar so das du die Formatierung mittels Richedt.SelStart und Richedt.SelLength neu setzt. Das wäre auch nicht so ein großer Aufwand.
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: Mi 10.02.10 14:30
Danke Dir.
Ich habe das jetzt so gelöst:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| var s: string; z,zz: integer; begin RichEdit1.Clear;
List.Add('°K°'+Memo1.Text); s := List.Text; s:=StringReplace(s, '#', #13#10+'°K°.......', [rfReplaceAll]); z := 0; while Pos('_',s) > 0 do begin if (z = 0) then s:=StringReplace(s, '_', '°1°', []); if (z = 1) then s:=StringReplace(s, '_', '°2°', []); zz := zz + 1; z := 1 - z; end; if not ((zz mod 2) = 0) then begin Insert('°2°', s, length(s)); end;
while Pos('°',s) > 0 do begin case s[2] of 'A' : RichEdit1.SelAttributes.Color := RGB(128, 128, 128); 'B' : RichEdit1.SelAttributes.Color := RGB(0, 0, 255); 'C' : RichEdit1.SelAttributes.Color := RGB(0, 255, 255); 'D' : RichEdit1.SelAttributes.Color := RGB(64, 64, 64); 'E' : RichEdit1.SelAttributes.Color := RGB(0, 172, 0); 'G' : RichEdit1.SelAttributes.Color := RGB(0, 255, 0); 'K' : RichEdit1.SelAttributes.Color := RGB(0, 0, 0); 'L' : RichEdit1.SelAttributes.Color := RGB(192, 192, 192); 'M' : RichEdit1.SelAttributes.Color := RGB(255, 0, 255); 'N' : RichEdit1.SelAttributes.Color := RGB(150, 74, 0); 'O' : RichEdit1.SelAttributes.Color := RGB(255, 200, 0); 'P' : RichEdit1.SelAttributes.Color := RGB(255, 175, 175); 'R' : RichEdit1.SelAttributes.Color := RGB(255, 0, 0); 'W' : RichEdit1.SelAttributes.Color := RGB(255, 255, 255); 'Y' : RichEdit1.SelAttributes.Color := RGB(255, 255, 0); '1' : RichEdit1.SelAttributes.Style := [fsBold]; '2' : RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style-[fsBold]; end; Delete(s,1,3); if Pos('°',s) = 0 then begin RichEdit1.SelText := s end else begin RichEdit1.SelText := Copy(s,1,Pos('°',s)-1); Delete(s,1,Pos('°',s)-1); end; end;
List.Clear; |
Im Text kann ich dann
Hallo, °R°das ist _ein_ Test!
schreiben und im string Variable(s) ersetze ich den unterstrich mit °1° = Fett oder °2° = normal und die ausgabe sieht dann wie folgt aus:
Hallo, das ist ein Test!
Funktioniert bestens und man kann es ja so lassen.
Ich danke Dir trotzdem vielmals für die Hilfe.
MfG
|
|
|