| Autor |
Beitrag |
titus
Hält's aus hier
Beiträge: 8
Win XP Pro
|
Verfasst: 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:
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 Gausi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Fr 09.06.2006 um 08:36
|
|
TheUnknown
      
Beiträge: 334
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Fr 09.06.06 08:19
Hallo,
titus 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
[TRichEdit] TRichEdit gestalten
titus hat folgendes geschrieben: | 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.
titus hat folgendes geschrieben: | 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 
Hält's aus hier
Beiträge: 8
Win XP Pro
|
Verfasst: 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:
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:
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
      
Beiträge: 334
|
Verfasst: Fr 09.06.06 11:35
titus 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 
Hält's aus hier
Beiträge: 8
Win XP Pro
|
Verfasst: Fr 09.06.06 11:40
|
|
WASEO
      
Beiträge: 56
Win98, Win2000, WinXP
D6 Prof, D7 Prof
|
Verfasst: 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:
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 
Hält's aus hier
Beiträge: 8
Win XP Pro
|
Verfasst: Sa 10.06.06 00:12
Vielen Dank so klappt das 
|
|
Green
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: 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:
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
      
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)
|
Verfasst: 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
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: 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
      
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)
|
Verfasst: 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
      
Beiträge: 283
Windows XP Home
Delphi 6 Enterprise
|
Verfasst: 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:
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)
|
|
|