Autor Beitrag
jackie05
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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?
ausblenden volle Höhe Delphi-Quelltext
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[2of //Farbe setzen
      'A' : RichEdit1.SelAttributes.Color := RGB(128128128);
      'B' : RichEdit1.SelAttributes.Color := RGB(00255);
      'C' : RichEdit1.SelAttributes.Color := RGB(0255255);
      'D' : RichEdit1.SelAttributes.Color := RGB(646464);
      'E' : RichEdit1.SelAttributes.Color := RGB(01720);
      'G' : RichEdit1.SelAttributes.Color := RGB(02550);
      'K' : RichEdit1.SelAttributes.Color := RGB(000);
      'L' : RichEdit1.SelAttributes.Color := RGB(192192192);
      'M' : RichEdit1.SelAttributes.Color := RGB(2550255);
      'N' : RichEdit1.SelAttributes.Color := RGB(150740);
      'O' : RichEdit1.SelAttributes.Color := RGB(2552000);
      'P' : RichEdit1.SelAttributes.Color := RGB(255175175);
      'R' : RichEdit1.SelAttributes.Color := RGB(25500);
      'W' : RichEdit1.SelAttributes.Color := RGB(255255255);
      'Y' : RichEdit1.SelAttributes.Color := RGB(2552550);
    end;
    Delete(s,1,3);           //hier wird z.B. '°B°' gelöscht
    if Pos('°',s) = 0 then   //keine weitere Farbe mehr
    begin
      RichEdit1.SelText := s //Rest ins Richedit schreiben
    end
    else begin
      RichEdit1.SelText := Copy(s,1,Pos('°',s)-1); //bis nächste Farbe ins RichEdit
      Delete(s,1,Pos('°',s)-1);                    //bis nächste farbe löschen
    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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mi 10.02.2010 um 20:26
martin300
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: Di 09.02.10 22:43 
Hallo,
zuerst braucht man einen
ausblenden Delphi-Quelltext
1:
 procedure superStringListAnalyser(txt: String);					

der trennt den Text und dann noch
ausblenden Delphi-Quelltext
1:
procedure makeBold (txt: String);					

etwas fettes und
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: Mi 10.02.10 09:49 
hi,
hier die beiden Formatierungen,
ausblenden 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
ausblenden 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 = 1then
    begin
      makebold(strlist.Strings[i]);
    end else
    begin
      makeplain(strList.Strings[i]);
    end;
  end;
end;

und noch der Start.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 186
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Mi 10.02.10 14:30 
Danke Dir.

Ich habe das jetzt so gelöst:
ausblenden volle Höhe Delphi-Quelltext
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 = 0then
      s:=StringReplace(s, '_''°1°', []); //°1° = Fett
    if (z = 1then
      s:=StringReplace(s, '_''°2°', []); //°2° = Normal
    zz := zz + 1;
    z := 1 - z; //Umschalten zwischen 0 und 1
  end;
  if not ((zz mod 2) = 0then
  begin
    Insert('°2°', s, length(s));
  end;

  while Pos('°',s) > 0 do begin
    case s[2of //Farbe setzen
      'A' : RichEdit1.SelAttributes.Color := RGB(128128128);
      'B' : RichEdit1.SelAttributes.Color := RGB(00255);
      'C' : RichEdit1.SelAttributes.Color := RGB(0255255);
      'D' : RichEdit1.SelAttributes.Color := RGB(646464);
      'E' : RichEdit1.SelAttributes.Color := RGB(01720);
      'G' : RichEdit1.SelAttributes.Color := RGB(02550);
      'K' : RichEdit1.SelAttributes.Color := RGB(000);
      'L' : RichEdit1.SelAttributes.Color := RGB(192192192);
      'M' : RichEdit1.SelAttributes.Color := RGB(2550255);
      'N' : RichEdit1.SelAttributes.Color := RGB(150740);
      'O' : RichEdit1.SelAttributes.Color := RGB(2552000);
      'P' : RichEdit1.SelAttributes.Color := RGB(255175175);
      'R' : RichEdit1.SelAttributes.Color := RGB(25500);
      'W' : RichEdit1.SelAttributes.Color := RGB(255255255);
      'Y' : RichEdit1.SelAttributes.Color := RGB(2552550);
      '1' : RichEdit1.SelAttributes.Style := [fsBold];
      '2' : RichEdit1.SelAttributes.Style := RichEdit1.SelAttributes.Style-[fsBold];
    end;
    Delete(s,1,3);           //hier wird z.B. '°B°' gelöscht
    if Pos('°',s) = 0 then   //keine weitere Farbe mehr
    begin
      RichEdit1.SelText := s //Rest ins Richedit schreiben
    end
    else begin
      RichEdit1.SelText := Copy(s,1,Pos('°',s)-1); //bis nächste Farbe ins RichEdit
      Delete(s,1,Pos('°',s)-1);                    //bis nächste farbe löschen
    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