[Delphi] Verschillende kleuren in Rich Edit

Pagina: 1
Acties:
  • 436 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Anoniem: 17304

Topicstarter
Misschien weet hier iemand het antwoord op mijn vraag.
Ik wil een soort html/php editor maken en heb al aardig wat ideetjes hoe ik het ga doen. Alleen zit ik met het volgende probleem.
Ik wil natuurlijk de code syntax highlighten, nu was ik al met een functie daarvoor bezig, toen ik me opeens afvroeg of een Rich Edit field wel zoiets aankan, nee dus.... ;(

Wat voor soort veld moet ik gaan gebruiken? Het veld moet dus wel editable zijn....en dus verschillende kleuren voor de stukjes code etc....

Of is er een (freeware) component voor, ik heb hem nog niet kunnen vinden.

Hellup :?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:48
Toch een TRichEdit.

Ik heb Delphi hier nu niet geinstalleerd staan (alles even opnieuw gesetupped), maar die TRichEdit Control heeft wel een property Font. In die property kan je allerhande properties instellen mbt uw lettertype, en ook het kleur dus.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Anoniem: 14829

Kijk 's naar SynEdit!

"SynEdit is a multi-line edit control, for Borland Delphi and C++Builder. It is a full-VCL control, meaning it is not a wrapper for Microsoft Windows controls, and no run-time library is required.
SynEdit is packaged together with highlighter classes which are used to syntax highlight many programming languages source code."

Ik heb er alleen nog maar vluchtig naar gekeken, maar 't klinkt veelbelovend.

Acties:
  • 0 Henk 'm!

Anoniem: 17304

Topicstarter
Okee bedankt zal er straks wel naar kijken....

Whoami, je kan bij zo'n TRichEdit veld het lettertype en de kleur wel aanpassen, maar dan van alle tekst, en niet van alleen 1 woord of regel of iets dergelijks.

Acties:
  • 0 Henk 'm!

Anoniem: 17304

Topicstarter
Op dinsdag 12 maart 2002 22:25 schreef Afterlife het volgende:
Kijk 's naar SynEdit!

...
Ik heb er alleen nog maar vluchtig naar gekeken, maar 't klinkt veelbelovend.
Bedankt, ik denk dat ik hier wel zeker wat mee kan!
De documentatie laat jammergenoeg wat te wensen over...snap er nog weinig van, maar het is denk ik het tooltje wat ik nodig heb *D

Acties:
  • 0 Henk 'm!

  • Cryothic
  • Registratie: September 2001
  • Laatst online: 04-09-2024

Cryothic

why?

Het moet ook mogelijk zijn met een richedit hoor.

Start wordpad maar eens op, typ een tekstje, geef sommige woorden een kleurtje (of bold) en sla het op als een RichEdit bestand.

Vervolgens laad je die in je richedit met bijvoorbeeld LoadFromFile.
In tegenstelling tot de memo, zul je nu zien dat die woorden gekleurd zijn.

Ik heb ook wel eens zoiets geprobeert, ben toen begonnen met tekst (via source natuurlijk) te selecteren, en die geselecteerde tekst een kleur te geven.

Alleen is het me toen niet helemaal gelukt. Na het eerste woord dat ie vond dat ie kende, typte die opeens achteruit. Dus per letter ging de cursor naar links :?
Wel grappig effect, maar niet de bedoeling(8>

Acties:
  • 0 Henk 'm!

Anoniem: 10867

of na wat wijzigingen:
> How do I color text in a richedit control and I don't mean the whole text
> but only certain lines.

Set SelStart & SelLength to select the text that you want to color then set
SelAttributes.Color appropriately.
[quote]
> How do I use super and subscript in a TRichEdit control,
> like for the 2 in "e = mc2" or "H2O"

you should be able to set sub/superscripts by sending an
EM_SETCHARFORMAT message to a TRichedit. Something like this:

Var
format: TCharFormat; { defined in Unit RichEdit }

FillChar( format, sizeof(format), 0);
With format Do Begin
cbSize:= Sizeof(format);
dwMask:= CFM_OFFSET;
yOffset:= 60; { superscript by 60 twips, negative values give
subscripts}
End;
richedit1.Perform( EM_SETCHARFORMAT, SCF_SELECTION,
LongInt(@format));

The message affects the current selection.
[/quoye]

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:48
Op woensdag 13 maart 2002 08:45 schreef FoofMan het volgende:
Whoami, je kan bij zo'n TRichEdit veld het lettertype en de kleur wel aanpassen, maar dan van alle tekst, en niet van alleen 1 woord of regel of iets dergelijks.
Het is zeker mogelijk. Ik heb het al eens gedaan op ongeveer de manier die Cryothic eerder vermeldde, maar ik had die problemen niet die hij ervaarde.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:20

Creepy

Tactical Espionage Splatterer

selstart en sellength setten, en dan de kleur/font opmaak zetten.

Met een TRichEdit kan je gewoon RTF opmaken (zonder plaatjes erin dan). Dus alles qua font opmaak (grootte, type, bold/italic/underline, kleur etc.) kan allemaal, en per letter!

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Anoniem: 17304

Topicstarter
Wow, wat een knowledge hier op /14 :-)))))

Ik zal me wel eerst over een standaard TRichEdit buigen :)

Acties:
  • 0 Henk 'm!

Anoniem: 17304

Topicstarter
Jaaaaaa het kan met een RichEdit component *D :) B-)

Dit werkt bijvoorbeeld perfect:
code:
1
2
3
RichEdit1.SelStart := 1;
RichEdit1.SelLength := 10;
RichEdit1.SelAttributes.Color := clBlue;

Stom dat ik daar zelf niet op gekomen was...thxy all!

Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 22:11

BM

Moderator Spielerij
Geef hem ff een schop omhoog ;)

Ik zit met een soortgelijk probleem.
Ik heb een tekst waarvan de structuur enigzins vaststaat, en ik wil dus bepaalde woorden een andere kleur geven, maar heb eerlijk gezegt niet echt een id hoe dat werkt :?
Dat SelStart en Sellength werkt wel, maar ik snap ze nioet helemaal :)

Wie helpt me hier uit? :)

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:20

Creepy

Tactical Espionage Splatterer

Selstart is het begin van de selectie, selength is de lengte van de selectie. Met selattributes kan je de opmaak van de net geselecteerde text instellen.

Selstart en sellength zijn integers. Het eerste karakter in de trichedit is 1, het daarop volgende karakter 2 etc. etc. etc.

Duidelijk?

(zo nee...gooi een trichedit op een form, selecteer hem en druk op F1!)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 22:11

BM

Moderator Spielerij
Dat snap ik wel ja, maar ik bedoel meer het volgende:
hoe leg ik een lijst woorden vast die gekleurd moeten worden?
Dus een functie of procedure die gewoon door richedit loopt en dan controleerd of het woord erin zit, dat selecteerd, en van kleur veranderd.
Soort van syntax highlighting dus...

Heb al op google gezocht maar ik vond vrij weinig dingen waar ik mee uit de voeten kon...

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

Anoniem: 34614

Hm... ik denk toch dat het een stuk sneller en makkelijker zou zijn met TSynEdit (evt. gecombineerd met TSynAnySyn zodat je uiterst eenvoudig een highlighter kunt maken zonder je te verdiepen in grammatica's en andere ellende).

Als je zo gesteld bent op de RichEdit: het lijkt mij zo dat je gewoon een lijstje maakt van de woorden die je wilt inkleuren (bv. in een array of een TStringList).
Dan laat je met een for i:=0 to SyntaxList.Count-1 gecombineerd met Pos() statements elk van die woorden opzoeken (in feite een dubbele loop).

Nog ff wat opmerkingen bij deze:

- ik vermoed dat dit tamelijk traag kan zijn (ik heb eens een HTML-syntax highlighting component op basis van richedit gezien en het was afschuwelijk traag); je zou gebruik kunnen maken van FastPos uit the FastStrings library (ergens op torry.net) die bijzonder veel sneller is dan Pos en je bovendien op een willekeurige positie in de text laat beginnen met zoeken. Dan hoef je niet te spelen met Copy. Je laat FastPos dus gewoon lopen over de RichEdit.Lines.Text denk ik dan.
In dit verband heeft het waarschijnlijk ook zin om gebruik te maken van BeginUpdate (als je begint te zoeken) en EndUpdate (als je klaar bent) van de Lines property, zodat het beeld niet gaat flikkeren terwijl text aan het veranderen bent.

- als je een woordje gevonden hebt, moet je controleren of het een heel woord is (bv. als ik 'do' wil highlighten, moet 'komodovaraan' niet middenin vet+rood worden).
Dit kan redelijk eenvoudig: je controleert of zowel links als rechts van je woord een spatie of een #13#10 (regeleinde) zit.
Let op dat als het woord toevallig aan het begin staat, je niet probeert om Strings.Text[-1] of zo te benaderen (en idem voor woord helemaal aan einde string).

Als je syntax ook haakjes toelaat (bv. function() ) zul je dus ook moeten toestaan dat rechts van je woord niet alleen spatie/#13#10, maar ook een haakje verschijnt.
Indien aan deze voorwaarden niet wordt voldaan, is wat je hebt gevonden niet een element van je syntax, maar een deel van een of ander groter woord.

Nou, ik hoop dat je er wat aan hebt. Ik heb het niet geprobeerd, dus misschien lijkt het mij makkelijker dan het is.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:20

Creepy

Tactical Espionage Splatterer

Op vrijdag 17 mei 2002 02:12 schreef Ublis het volgende:
Een hele hoop text.
Uit de DELPHI Help
Searches a given range in the text for a target string.

type
TSearchType = (stWholeWord, stMatchCase);

TSearchTypes = set of TSearchType;

function FindText(const SearchStr: string; StartPos, Length: Integer; Options: TSearchTypes): Integer;
[/b]
TRichedit.findtext gebruiken om tekst te zoeken in een TRichedit dus.. opties als stWholeWord kan je dan ook aanzetten, zodat je geen delen van woorden pakt.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 22:11

BM

Moderator Spielerij
Misschien domme vraag.
Die integer geeft de startpositie van het woord terug?


Ziet er iig veel belovend uit, ga het eens checken.

edit:

domme vraag dus, werkt al, thanks :*

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:20

Creepy

Tactical Espionage Splatterer

Op vrijdag 17 mei 2002 10:50 schreef SpeedAddict het volgende:
Misschien domme vraag.
Die integer geeft de startpositie van het woord terug?


Ziet er iig veel belovend uit, ga het eens checken.

edit:

domme vraag dus, werkt al, thanks :*
Lang leve de Delphi help (de F1 knop is in Delphi je beste vriend he :P )

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 22:11

BM

Moderator Spielerij
uhm, ja ;)

Had beetje beter moeten zoeken ja :( my fault...

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

Anoniem: 34614

Op vrijdag 17 mei 2002 09:35 schreef Creepy het volgende:

[..]


[..]

TRichedit.findtext gebruiken om tekst te zoeken in een TRichedit dus.. opties als stWholeWord kan je dan ook aanzetten, zodat je geen delen van woorden pakt.
Ik doe graag moeilijk :).

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:20

Creepy

Tactical Espionage Splatterer

Op vrijdag 17 mei 2002 20:02 schreef Ublis het volgende:

[..]

Ik doe graag moeilijk :).
En je dan nog afvragen waarom het zo "langzaam" gaat dat je fastpos nodig hebt :)

Ik heb het motto "waarom moeilijk doen als het makkelijk kan", maar blijkbaar zijn er mensen die er anders over denken :P

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 22:11

BM

Moderator Spielerij
again een vraagje.
Ik heb hem nu zover dat ie woorden enzo kleurt, das niet zo'n probleem.
code:
1
2
3
4
5
6
7
8
9
procedure TForm1.KleurTekst(zoekwoord:string; Edit:TRichEdit; kleur:TColor);
var FoundAt:longInt;
begin
  FoundAt := Edit.Findtext(zoekwoord,0,length(edit.text), [stWholeWord]);
  Edit.Selstart:=FoundAt;
  Edit.Sellength:=length(zoekwoord);
  Edit.SelAttributes.Color:=kleur;
  Edit.SelAttributes.Style:= [fsBold];
end;

dat werkt opzich goed, op 1 ding na.
als ik procedure aanroep met een woord dat meerdere keren voorkomt, dan kleurt dus alleen de 1e :'(
code:
1
KleurTekst('test',RichEdit1,clRed);

als er dus 2 keer test in staat kleurt ie de 1e.

Iemand die me een duw in de goeie richting kan geven?

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 20-06 22:26

Knutselsmurf

LED's make things better

Op zaterdag 18 mei 2002 15:54 schreef SpeedAddict het volgende:
again een vraagje.
Ik heb hem nu zover dat ie woorden enzo kleurt, das niet zo'n probleem.
code:
1
2
3
4
5
6
7
8
9
procedure TForm1.KleurTekst(zoekwoord:string; Edit:TRichEdit; kleur:TColor);
var FoundAt:longInt;
begin
  FoundAt := Edit.Findtext(zoekwoord,0,length(edit.text), [stWholeWord]);
  Edit.Selstart:=FoundAt;
  Edit.Sellength:=length(zoekwoord);
  Edit.SelAttributes.Color:=kleur;
  Edit.SelAttributes.Style:= [fsBold];
end;

dat werkt opzich goed, op 1 ding na.
als ik procedure aanroep met een woord dat meerdere keren voorkomt, dan kleurt dus alleen de 1e :'(
code:
1
KleurTekst('test',RichEdit1,clRed);

als er dus 2 keer test in staat kleurt ie de 1e.

Iemand die me een duw in de goeie richting kan geven?
Als je woord niet gevonden is, zal foundAt 0 zijn. Je moet een while-lusje maken, waarbij je telkens de startpositie van je zoekopdracht ophoogt, namelijk met de som van de foundat van de vorige keer dat je het woord gevonden hebt en de langte van het woord. Dit doe je net zolang totdat er geen nieuwe gevallen gevonden worden.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 22:11

BM

Moderator Spielerij
Ik snap de bedoeling van die while, maar krijg hem niet echt uitgevoerd |:(
Geloof dat ik bij die lus helemaal verkeerd aan het werken ben.
Progje crasht iig als ik hem laat draaien. Hij start op, en na een tijdje reageerd ie niet meer :(
Ik probeer hier ook geen request van te maken, maar hier snap ik helaas niet veel meer van :'(

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • BM
  • Registratie: September 2001
  • Laatst online: 22:11

BM

Moderator Spielerij
Met wat hulp van anderen is er dit uitgekomen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.KleurTekst(zoekwoord:string; Edit:TRichEdit; kleur:TColor);
var start,foundat:integer;
begin
  start:=0;
  while start<=length(edit.text) do
  begin
    FoundAt := Edit.Findtext(zoekwoord,start,length(edit.text), [stWholeWord]);
    if FoundAt = -1 then
    start := length(edit.text) + 1
    else
    Begin
    Edit.Selstart:=FoundAt;
    Edit.Sellength:=length(zoekwoord);
    Edit.SelAttributes.Color:=kleur;
    Edit.SelAttributes.Style:= [fsBold];
    start:=foundat+length(zoekwoord);
    end;
  end;
end;

werkt perfect.
Hier ook bedankt voor de hulp :*

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


Acties:
  • 0 Henk 'm!

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 22:39

Tomatoman

Fulltime prutser

Bij toeval kwam ik een artikel tegen dat uitgebreid ingaat op zelfgebouwde syntax highlighting in Delphi. De titel van het artikel: 'Syntax Highlighting With RichEdit'. Lijkt me voldoende reden voor een schopje :)

Een goede grap mag vrienden kosten.

Pagina: 1