Autor Beitrag
titus
Hält's aus hier
Beiträge: 8

Win XP Pro

BeitragVerfasst: Fr 09.06.06 02:07 
Hi,

wir versuchen gerade eine RichEdit ähnliche Komponente zu finden, oder gar RichEdit zu benutzen um farbigen Text darzustellen, und zwar nach folgenden Kriterien:

- Farbe Vordergrund, verschiedene in einer Zeile
- Farbe Hintergrund, verschiedene in einer Zeile

Und möglichst alle weiteren Formatierungen, wie zum Beispiel Fett, Unterstrichen etc. (ähnlich dem BBCode also).

Was wir bisher versucht haben:

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:
procedure SelAttColor(RichEdit: TRichEdit; iString: String; ColorStart: TColor);
var
  n: integer;
begin
  n := 0;
  RichEdit.Lines[n] := iString;

  RichEdit.SelStart             := 0;
  RichEdit.SelLength            := Length(iString);
  RichEdit.SelAttributes.Color  := ColorStart;
  RichEdit.Lines[n]             := RichEdit.Lines[n] + 'a';

  RichEdit.SelStart             := Length(iString);
  RichEdit.SelLength            := 0;
  RichEdit.SelAttributes.Color  := STD_TEXT_COLOR;
end;

procedure SelAttBg(RichEdit: TRichEdit; AColor: TColor);
var
  Format: CHARFORMAT2;
begin
  RichEdit.SelLength := 0;
  FillChar(Format, SizeOf(Format), 0);
  with Format do
  begin
    cbSize := SizeOf(Format);
    dwMask := CFM_BACKCOLOR;
    crBackColor := AColor;
    Richedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
  end;
end;


Die Versuche haben leider recht kläglich damit geendet, dass wir zwar farbig schreiben konnten, aber immer nur zeilenweise oder, dass die Farben verrückt spielten.

Ich hoffe ihr könnt uns helfen (wir sitzen jetzt schon seit ca. 4 Stunden dran und sind kaum weiter).

mfG, titus


Moderiert von user profile iconGausi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 09.06.2006 um 08:36
TheUnknown
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: Fr 09.06.06 08:16 
Guck Dir mal in Deinem Delphi-Install-verzeichnis das Verzeichnis "DEMOS" an - Da gibts einen Ordner, der RICHEDIT heisst - Da findest Du fast alles, was Du suchst! :-)
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Fr 09.06.06 08:19 
Hallo,
user profile icontitus hat folgendes geschrieben:
Ich hoffe ihr könnt uns helfen (wir sitzen jetzt schon seit ca. 4 Stunden dran und sind kaum weiter).
man muss nicht mal suchen, 6 Beiträge vor diesem geht es um unterschiedliche Formatierungen in einer Zeile im RichEdit
:arrow: [TRichEdit] TRichEdit gestalten


user profile icontitus hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure SelAttColor(RichEdit: TRichEdit; iString: String; ColorStart: TColor);
var
  n: integer;
begin
  n := 0;
  RichEdit.Lines[n] := iString;

  RichEdit.SelStart             := 0;
  RichEdit.SelLength            := Length(iString);
  RichEdit.SelAttributes.Color  := ColorStart;
  RichEdit.Lines[n]             := RichEdit.Lines[n] + 'a';

  RichEdit.SelStart             := Length(iString);
  RichEdit.SelLength            := 0;
  RichEdit.SelAttributes.Color  := STD_TEXT_COLOR;
end;
mit RichEdit.Lines[n] bekommt man nur den String ohne Formatierung.

user profile icontitus hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure SelAttBg(RichEdit: TRichEdit; AColor: TColor);
var
  Format: CHARFORMAT2;
begin
  RichEdit.SelLength := 0;
  FillChar(Format, SizeOf(Format), 0);
  with Format do
  begin
    cbSize := SizeOf(Format);
    dwMask := CFM_BACKCOLOR;
    crBackColor := AColor;
    Richedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
  end;
end;
mit dieser Prozedur soll das Selectierte farbig hinterlegt werden, aber mit SelLength := 0 wird die Selection zuvor aufgehoben. Das trifft auch auf die erste Prozedur SelAttColor zu.

Grundsätzliches zur Formatierung im Richedit:

selectierten Text formatieren:
- SelAttributes oder CharFormat2 setzen

vorhandenen Text auswählen und formatieren:
-SelStart setzen
-SelLength festlegen
-mit SelAttributes oder CharFormat2 das Selectierte formatieren

beim Text einfügen formatieren:
-falls erforderlich(Cursor entspricht nicht Einfügestelle) SelStart setzen
-SelAttributes oder CharFormat2 setzen
-mit SelText den Text einfügen
(nach dem Einfügen durch SelText entspricht SelStart automatisch dem Ende des hinzugefügten Strings)

Formatattribute setzen, damit der nachfolgend eingegebene Text entsprechend formatiert wird:
-SelStart setzen (dadurch wird SelLength =0)
-SelAttributes oder CharFormat2 setzen
>> der nun eingegebene Text wird entsprechend formatiert

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
titus Threadstarter
Hält's aus hier
Beiträge: 8

Win XP Pro

BeitragVerfasst: Fr 09.06.06 11:15 
Hi,

also erstmal danke euch für die Antworten.

Lannes, was schlägst du uns vor in der Funktion zu verändern?
---

Mit folgender procedure haben wir es versucht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.ColoredText(var RichEdit: TRichEdit; iString: string; ForeGround, BackGround: integer);
begin
  SelAttBg(RichEdit, Colors[BackGround]);
  RichEdit.SelStart := 0;
  RichEdit.SelAttributes.Color := Colors[ForeGround];
  RichEdit.Lines.Add(iString);
  SelAttBg(RichEdit, STD_TEXT_BG_COLOR);
  RichEdit.SelAttributes.Color := STD_TEXT_COLOR;
end;

(wobei Colors ein Array mit 16 Werten ist die alle als RGB gegeben sind)

und so aufgerufen:
ausblenden Delphi-Quelltext
1:
2:
3:
  ColoredText(Memo1, 'Ich bin ein farbiger Text mit Hintergrund.', 5, 7);
  Memo1.Lines.Add('Ich bin normal!');
  ColoredText(Memo1, 'Ich bin wieder ein farbiger Text mit Hintergrund.', 5, 7);


Folgende Ausgabe:
Zitat:
Ich bin ein farbiger Text mit Hintergrund.
Ich bin normal!
Ich bin wieder ein farbiger Text mit Hintergrund. (Hier sollte dieser Text genauso wie der oberste formatiert werden)


Bitte helft uns :?

mfG, titus
TheUnknown
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 334



BeitragVerfasst: Fr 09.06.06 11:35 
user profile icontitus hat folgendes geschrieben:

Bitte helft uns :?

mfG, titus


Ich will ja nicht dummschwätzen, aber wie ich schon schrieb: Guck' mal in den DEMOS-Ordner. DA findest Du den kompletten Quelltext für fast alle RichEdit-Funktionen!
titus Threadstarter
Hält's aus hier
Beiträge: 8

Win XP Pro

BeitragVerfasst: Fr 09.06.06 11:40 
user profile iconTheUnknown hat folgendes geschrieben:
user profile icontitus hat folgendes geschrieben:

Bitte helft uns :?

mfG, titus


Ich will ja nicht dummschwätzen, aber wie ich schon schrieb: Guck' mal in den DEMOS-Ordner. DA findest Du den kompletten Quelltext für fast alle RichEdit-Funktionen!

Leider ist da nur ein Beispiel für einen Editor den wir uns angeguckt haben aus dem wir nichts für unseres Problem ziehen können.
WASEO
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 56

Win98, Win2000, WinXP
D6 Prof, D7 Prof
BeitragVerfasst: Fr 09.06.06 12:05 
Prinzipiell seid Ihr schon auf dem richtigen Weg. Allerdings setzt der Befehl "SelStart = 0" den Richedit-Marker immer wieder zurück, so dass nur die erste Zeile eingefärbt wird. Hier mal ein Beispiel, das ich gerade getestet habe:

ausblenden 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:
procedure TForm1.RE_SetSelBgColor(RichEdit: TRichEdit; AColor: TColor);
var
  Format: CHARFORMAT2;
begin
  FillChar(Format, SizeOf(Format), 0);
  with Format do
  begin
    cbSize := SizeOf(Format);
    dwMask := CFM_BACKCOLOR;
    crBackColor := AColor;
    Richedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
  end;
end;

procedure TForm1.ColoredText(var RichEdit: TRichEdit; iString: string; ForeGround, BackGround: integer);
begin
  RichEdit.SelAttributes.Color := ForeGround;
  RE_SetSelBgColor(RichEdit, clYellow);
  Memo1.Lines.Add(iString);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ColoredText(Memo1, 'Ich bin ein farbiger Text mit Hintergrund.', 5, 7);
  Memo1.Lines.Add('Ich bin normal!');
  ColoredText(Memo1, 'Ich bin wieder ein farbiger Text mit Hintergrund.', 5, 7);
end;

_________________
Erstaunlich sind nicht die Dinge, die wir nicht kennen, sondern die wir kennen und die nicht so sind.
titus Threadstarter
Hält's aus hier
Beiträge: 8

Win XP Pro

BeitragVerfasst: Sa 10.06.06 00:12 
Vielen Dank so klappt das :)
Green
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

Windows XP Home
Delphi 6 Enterprise
BeitragVerfasst: So 18.06.06 22:17 
hmm kann mir jemand dazu kurz ma was helfen:

also ich hab einen string und der wird stück für stück in eine zeile in einem memo geschrieben, und ich will das er ab einem bestimmten moment in einer anderen farbe schreibt.

so hab ichs probiert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
  procedure ProcColoredText( S: string; var RichEdit: TRichEdit);
    var
      i: integer;
      buffer: string;
      colored, bold, underlined: boolean;
  begin
    colored := false;  bold := false; underlined := false;
    richedit.Lines.Append('');
    if length(S) <> 0 then
    for i := 1 to length(S) do
    begin
      if S[i] = #3 then begin
        RichEdit.SelAttributes.Color := clRed;
      end else
        RichEdit.Lines[RichEdit.Lines.Count-1] := RichEdit.Lines[RichEdit.Lines.Count-1] + S[i];
    end;
  end;
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: So 18.06.06 23:44 
Du kannst mit SelStart und SelLength bestimmen, welcher Text ausgewählt ist und wofür damit auch SelAttributes gilt. Vllcht hilft dir das etwas weiter. Weil so sagst du IHMO deinem RichEdit ja nicht unbedingt, wofür die SelAttributes jetzt gelten und was er dann wie malen soll. Im Zweifelsfall nimmt es immer RichEdit.Font.

Gruß alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Green
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

Windows XP Home
Delphi 6 Enterprise
BeitragVerfasst: Mo 19.06.06 12:29 
aber was muss ich denn machen um dem RichEdit klar zu machen:

Ab jetzt soll alles in Rot geschrieben werden... ich will das ganze ja nicht auf eine bestimmte länge festlegen wenn du verstehst was ich meine.
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Mo 19.06.06 12:36 
Ende des Textes auswählen, rote Farbe zuweisen und dann den Text hinzufügen

_________________
Programmers never die, they just GOSUB without RETURN
Green
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 283

Windows XP Home
Delphi 6 Enterprise
BeitragVerfasst: Mo 19.06.06 12:44 
ja an sich hab ich das schon verstanden, aber was meinst du mit ende des textes wählen? also SelStart auf die Länger der Zeile setzen...

so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
  procedure ProcColoredText( S: string; var RichEdit: TRichEdit);
    var
      i: integer;
      buffer: string;
      colored, bold, underlined: boolean;
  begin
    colored := false;  bold := false; underlined := false;
    richedit.Lines.Append('');
    if length(S) <> 0 then
    for i := 1 to length(S) do
    begin
      if S[i] = #3 then begin
        RichEdit.SelStart := Length(RichEdit.Lines[RichEdit.Lines.Count-1]);
        RichEdit.SelAttributes.Color := clRed;
      end else
        RichEdit.Lines[RichEdit.Lines.Count-1] := RichEdit.Lines[RichEdit.Lines.Count-1] + S[i];
    end;
  end;


geht das aber nicht... leider (in die zeilen 13 und 14 geht er auf jeden fall rein, da liegt das problem nicht)