Avatar billede jes_petersen Nybegynder
18. august 2000 - 20:48 Der er 2 kommentarer og
1 løsning

Farve bestemt tekst

Hvordan giver jeg en tekst i et rich-edit-felt en bestemt farve, alt eftr hvilke tegn, de står imellem, f.eks. grøn farve til tekst mellem [ og ], rød til tekst mellem ( og ) osv.
Avatar billede sjensen Nybegynder
18. august 2000 - 20:58 #1
Du er nødt til at lave en såkaldt Parser. D.v.s en funktion der finder start/slut på de tekster der er mellem dine \"tags\" og returnerer hhv. start og slut pos. Herefter kan du bruge Selstart og sellength til at ændre på font/farve o.s.v.

Men hvis du ikke absolut har brug for rich-edit komponenten kan jeg varmt anbefale en freeware (tror jeg) komponent der hedder \"colormemo\".

Den kan lige det du vil og ganske enkelt også.

Prøv at søge efter den i Delphi Super Page (http://sunsite.icm.edu.pl/delphi/) og hvis du ikke finder noget så sig til, så skal jeg give dig url på ham der har lavet den. Jeg har den hjemme så derfor kan jeg ikke give dig den nu.
Avatar billede jes_petersen Nybegynder
19. august 2000 - 23:41 #2
Okay, men hvordan laver man så sådan en parser
Avatar billede sjensen Nybegynder
20. august 2000 - 09:38 #3
En parser (i dette tilfælde) er jo bare en funktion eller procedure der checker en streng for nogle bestemte tegn og returnerer positionen for hvert tegn. I dette tilfælde skal den dog checke efter både start og stop, og da samme tegn kan formentligt findes flere gange i samme streng, er der også brug for at vide hvor i strengen søgningen skal starte for ikke at få returneret samme start/stop pos hver gang den kaldes:

Du ved at din richedit har en property der hedder text og som indeholder al teksten, ikke ?

Altså richedit.text er alle tegnene i hele richediten som en lang streng. Den kan du så sende som tekst til proceduren (procedure fordi den skal returnere 2 værdier i hver sin var og ikke en streng/et tal eller en boolean:

procedure Soeg_Start_Stop(tekst                : string;
                          soeg_fra_pos_i_streng : integer;
                          soeg_starttegn,
                          soeg_stoptegn        : char;
                      var start_pos, slut_pos  : integer);
var i : integer;
    l : integer;
begin
  start_pos := 0;
  stop_pos  := 0;
  l        := length(tekst);              // sæt antal tegn i strengen ind i l
  if l < soeg_fra_pos_i_streng then exit;  // ikke flere tegn at søge i så afbryd
  for i := soeg_fra_pos_i_streng to l do
  begin
    if tekst[i] = soeg_starttegn then
    begin                                  // fandt starttegn
      start_pos := i; // gem position
      soeg_fra_pos_i_streng := i;          // sæt søg fra til denne pos for søgning efter et stoptegn
      break;                              // afslut søgning da vi ikke vil have mere end 1. starttegn
    end;
  end;
  for i := soeg_fra_pos_i_streng to l do
  begin
    if tekst[i] = soeg_stoptegn then
    begin                                  // fandt stoptegn
      stop_pos := i; // gem position
      break;                              // afslut søgning da vi ikke vil have mere end 1. stoptegn
    end;
  end;
end;

og i det program kalder du proceduren således:

procedure saet_farve;
var startpos, stoppos : integer;
    soegfra          : integer;
    tekstlen          : integer;
    soegtegn1,
    soegtegn2        : char;
begin
  tekstlen  := length(richedit.text);  // så kender vi antal tegn i teksten
  soegfra  := 0;                      // søg fra starten første gang
  soegtegn1 := #91;                    // tegnet [
  soegtegn2 := #93;                    // tegnet ]
  while soegfra < tekstlen do          // udføres kun hvis richeditten er udfyldt, d.v.s antal tegn er større end 0
  begin
    Soeg_Start_Stop(richedot.text,    // søg i hele teksten
                    soegfra,          // start fra pos 0 første gang
                    soegtegn1,        // start tegn at søge efter
                    soegtegn2,        // stop  tegn at søge efter
                    startpos,          // position for starttegn i streng når proceduren returnerer
                    stoppos);          // position for stoptegn  i streng når proceduren returnerer
    if (startpos <> 0) and
      (stoptpos <> 0) then            // ok, både start og stop tegn er fundet
    begin
      richedit.selstart  := startpos;
      richedit.sellength := (stoppos-startpos) +1; // forskellen på tallene +1 er afstenden i tegn mellem tegnene
      // sæt farven til det du vil
    end;
    soegfra := stoppos;                // sæt soegfra til sidst kendt pos i strengen og søg videre derfra
  end;
end;

NB! Jeg har ikke prøvet at compilere procedurerne kun skrevet dem af efter mit hoved, så der er muligvis nogle få syntax fejl m.m, men dem kan du hurtigt finde og selv rette til.  Nu har du ihvertfald noget at arbejde videre med.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester