Avatar billede MrJ Praktikant
04. december 2000 - 18:33 Der er 16 kommentarer og
1 løsning

Skriftfarve

Hejsa.

Jeg er rimelig ny inden for Delphi, og jeg har set at der ligger en demo i Delphi der hedder RichEdit, det er et tekstprogram, det ligner Notepad ret meget.
Mit spørgsmål:
Hvordan gør man sådan så at nogen tekster bliver f.eks. grønne?
Jeg vil gerne bruge det som HTML program nemlig, og det ville være dejligt hvis kommandoer som <br> o.lign. var farvet.

How do I do?

mvh Effer
Avatar billede borrisholt Novice
04. december 2000 - 18:37 #1
download et komponent der kan
Avatar billede horsmark Nybegynder
04. december 2000 - 18:43 #2
hvis du skal skrive HTML hvorfor så ikke bruge en HTML editor der farver koderne?

Check denne, der er gratis i 90 dage.

www.ultraedit.com

Mvh.
HorsMark

Jeg bruger den også til VBscript mm. Ellers er der Micro$oft Visual InterDev
Avatar billede hatecaps Nybegynder
04. december 2000 - 23:25 #3
du kan bruge baltic solutions colormemo, http://www.balticsolutions.com 
det er freeware hvis du ikke behøver koden til komponentet
Avatar billede zerohero Nybegynder
05. december 2000 - 09:04 #4
Her er et lille sjovt eksempel for at ændre farven i en Trichedit:

Du skal bruge en Trichedit og Tbutton til denne eksempel.

skriv denne lille kode i Tbuttonclick procedure:

procedure Button1Click(Sender: TObject);
begin
richedit1.defattributes.color := clgreen;
richedit1.selattributes.color := clred;
end;

når du klikker på knappen vil alt tekst i Richedit blive grønt, men hvis du kun vælger en del af teksten, vil det valgte tekst blive rødt.

på samme måde kan du få forskellige skrift-typer
i en TRichedit.

ZeroHero
Avatar billede MrJ Praktikant
05. december 2000 - 17:04 #5
Tak for eksemplet, men jeg vil have at den skal farve alle <br> grønne, uden at man skal trykke på en knap.

Avatar billede zerohero Nybegynder
05. december 2000 - 18:39 #6
Eksemplet var sådan set kun for at vise dig hvordan koden så ud for at ændre skriftfarven i en Trichedit, i håb om at du blev inspireret til at arbejde videre på egen hånd... da dette ikke lykkedes helt så... :o)

Nå, men det er ret indelysende du skal såmænd bare søge efter alle <br> i din tekst, markere dem og så farve dem grønne...

eksempelvis noget lign. dette:

procedure TForm1.RichEdit1Change(Sender: TObject);
var i, i1 : integer;
begin
with richedit1 do begin
i := findtext(\'<br> \',0,length(richedit1.text),[stWholeWord]);
if i <> -1 then begin
selstart := i;
sellength := 5;
selattributes.color := clgreen;
sellength := 0;
selstart := i+5;
sellength := 0;
selattributes.color := clwindowtext;
end;
end;
end;

Eksemplet skulle meget gerne virke sådan, at når du har skrevt et <br> et eller andet sted i teksten så bliver <br> farvet grøn...

ZeroHero
Avatar billede horsmark Nybegynder
06. december 2000 - 13:48 #7
5
Avatar billede borrisholt Novice
06. december 2000 - 13:50 #8
hest
Avatar billede zerohero Nybegynder
06. december 2000 - 14:25 #9
Hejsa Effer...
I går sad jeg lige legede lidt med din idé og kom frem til et resultat du muligvis kan bruge.
I eksemplet bliver alt i en Trichedit som starter med < og slutter med > fremhævet, sådan så når du skriver en HTML side og anvender <br>, <Form>, <Body> osv. bliver de fremævet.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, Menus;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    ListBox1: TListBox;
    procedure RichEdit1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure RichEdit1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  i, i1, formtagbegin : integer; formtag : boolean;
implementation

{$R *.DFM}

procedure TForm1.RichEdit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var xpos, ypos : integer;
begin

with richedit1 do begin
i := findtext(\'<\',selstart-1,1,[stMatchCase]);

if (key = vk_left) or (key = vk_right) then else
if (formtag = false) and (i <> -1) then begin
formtagbegin := i;
formtag := true;
end;

i1 := findtext(\'>\',selstart-1,1,[stMatchCase]);

if (key = vk_left) or (key = vk_right) then else
if (formtag = true) and (i1 <> -1) then
begin
selstart := formtagbegin;
sellength := i1-formtagbegin+1;
selattributes.style := [fsbold];
formtag := false;
selstart := i1+3;
sellength := 0;
formtagbegin := i1+3;
selattributes.style := [];
end;

end;
end;

end.

NB: Læg mærke til at der bliver benyttet proceduren RichEdit1KeyDown og ikke RichEdit1Change som jeg brugte i min aller første eksempel.

God fornøjelse.

ZeroHero

Har du spørsmål er min email:
info@electronicbugs.org
Avatar billede stalle Nybegynder
22. januar 2001 - 10:11 #10
Jeg sidder med noget ligende det samme problem!
Jeg har lavet et program, der henter en almindelig txt fil ind i en RichEdit.
Nu vil jeg gerne, at når filen bliver hentet ind, så kigger mit program filen igennem, og giver en farve hvis en linie indeholder et bestemt tegne i starten. Her er et eksempel på en linie der skal skifte farve.
* Farver er lige \"lidt\" fraværende...arbejdet kalder!
Denne linie skal så blive LILLA. Det skal den så gøre ved alle linier der indholder en *
Avatar billede zerohero Nybegynder
22. januar 2001 - 13:15 #11
Kan du ikke bare bruge mit eksempel og istedet for
< & > skrive *.... og eventuel sæt koden i en repeat lykke lige efter at du har loaded teksten ind i din TRichEdit....
Avatar billede stalle Nybegynder
22. januar 2001 - 14:40 #12
Det virker lidt uoverskueligt for mig. Jeg skriver her, den provedure, hvori jeg gerne vil have lagt funktionen ind. Hvis ikke det er for meget forlangt!
procedure TForm1.Openlog(Sender: TObject);
var
  f: file;
  size : Longint;
  dato : Longint;
begin
//Fil Størrelse
AssignFile(f, FileListBox1.FileName);
Reset(f);
size := FileSize(f);
Label4.Caption:= IntToStr(size) + \' bytes\';
//Fil Dato
dato := FileAge(FileListBox1.FileName);
Label6.Caption := DateTimeToStr(FileDateToDateTime(dato));
CloseFile(f);
//Åbn Fil i RichEdit1
RichEdit1.Lines.LoadFromFile(FileListBox1.FileName);
Label2.Caption:= FileListBox1.FileName;
ToolButton2.Enabled := True;
ToolButton3.Enabled := True;
ToolButton6.Enabled := True;
end;

Hvis du kan hjælpe mig med det ville jeg blive glad!

Torben
Avatar billede zerohero Nybegynder
22. januar 2001 - 23:02 #13
>> stalle (Torben). Prøv denne procedure jeg håber det var sådan du gerne ville have det dit program til fungere... Jeg er lidt nysgerrig efter hvad det er for et program du er ved at lave, så hvis du vil fortælle mig lidt mere omkring meningen med den eller sende mig et færdigt resultat (når den tid kommer) ville JEG blive meget glad *S*

procedure TForm1.Openlog(Sender: TObject);
var
  f: file;
  size, dato, foundat : Longint;
  i, i1 : integer;
begin
//Fil Størrelse
AssignFile(f, FileListBox1.FileName);
Reset(f);
size := FileSize(f);
Label4.Caption:= IntToStr(size) + \' bytes\';
//Fil Dato
dato := FileAge(FileListBox1.FileName);
Label6.Caption := DateTimeToStr(FileDateToDateTime(dato));
CloseFile(f);
//Åbn Fil i RichEdit1
RichEdit1.Lines.LoadFromFile(FileListBox1.FileName);
Label2.Caption:= FileListBox1.FileName;
ToolButton2.Enabled := True;
ToolButton3.Enabled := True;
ToolButton6.Enabled := True;
//finder * og ændre farven på teksten i hele linien til lilla
i := 0;
repeat
with richedit1 do begin
foundat := findtext(\'*\',i,length(richedit1.text),[stMatchCase]);
if foundat <> -1 then begin
selstart := foundat;
i1 := caretpos.y;
sellength := length(lines[i1]);
selattributes.color := clpurple;
i := foundat+1;
end; end;
until foundat = -1;

end;

PS: Torben du burde sku at give mig nogle point en dag for denne indsats *G*...

ZeroHero
Avatar billede stalle Nybegynder
22. januar 2001 - 23:12 #14
Hej ZeroHero.

Jeg siger MANGE tak...2 ting...(bare lige for at være besværlig!)
1. Den tager også linier hvor der er to eller tre *\'er.
2. Det tager LANG tid hvis der er mere end 10-15 linier der skal farves.

Du skal nok få nogle point....hvordan ordner vi det!?
Avatar billede zerohero Nybegynder
23. januar 2001 - 14:30 #15
1. prøv denne procedure og se om det var sådan du havde tænkt dig... Proceduren farver kun linier hvis der er en * i starten af linien...Hvis du vil have dit program til kun at farve linier når de indeholder én (og kun én) stjerne bliver du nødt til at lave en ny søgning efter andre stjerner i den linie (og kun den linie)...
2. angående det du nævner at det tager LANG tid, hvis der er mere end 10-15 linier der skal farves
er mig simpelthen ubegribeligt. Måske kan det være at du har sat andre løkker eller procedure igang før (søgningen efter *\'er) som tager den lange tid. For selve proceduren der søger efter *\'er tager overhovedet ingen tid på min computer uanset hvor mange *\'er der findes i txt\' filen (har prøvet)... Men send mig HELE projectet + et eksempel af en txt-fil så vil jeg med glæde kigge nærmere på problemet min mail adresse er: info@electronicbugs.org ...

Opret et spørgsmål som hedder \"Point til ZeroHero\"
og giv \"spørgsmålet\" det antal point du synes jeg fortjener (ca. 300 *G*) så vil jeg \"svare på spørsmålet\" så du kan tildele mig dine points.

procedure TForm1.Openlog(Sender: TObject);
var
  f: file;
  size, dato, foundat : Longint;
  i, i1 : integer;
begin
//Fil Størrelse
AssignFile(f, FileListBox1.FileName);
Reset(f);
size := FileSize(f);
Label4.Caption:= IntToStr(size) + \' bytes\';
//Fil Dato
dato := FileAge(FileListBox1.FileName);
Label6.Caption := DateTimeToStr(FileDateToDateTime(dato));
CloseFile(f);
//Åbn Fil i RichEdit1
RichEdit1.Lines.LoadFromFile(FileListBox1.FileName);
Label2.Caption:= FileListBox1.FileName;
ToolButton2.Enabled := True;
ToolButton3.Enabled := True;
ToolButton6.Enabled := True;
//finder * og ændre farven på teksten i hele linien til lilla
i := 0;
repeat
with richedit1 do begin
foundat := findtext(\'*\',i,length(richedit1.text),[stMatchCase]);
if (foundat <> -1) then begin
//forbereder i1
i1 := foundat-1;
selstart := i1;
i1 := caretpos.y;
//kun hvis * er som første tegn i linien vil linien blive farvet
selstart := foundat;
if caretpos.y-1 = i1 then begin
sellength := length(lines[caretpos.y]);
selattributes.color := clpurple; end;
//gør det muligt for søgningen efter *\'er at fortsætte
i := foundat+1;
end; end;
until foundat = -1;
end;

Hilsen ZeroHero
Avatar billede stalle Nybegynder
23. januar 2001 - 17:02 #16
Den farver stadig linierne hvis der er mere end én * i en linie!

Skal nok lige få lavet så du kan få nogle point...
Avatar billede zerohero Nybegynder
23. januar 2001 - 20:24 #17
SÅ HØR DOG EFTER: (citat) \"Hvis du vil have dit program til kun at farve linier når den indeholder én og kun én stjerne, bliver du nødt til at lave en ny søgning efter andre stjerner i den linie (og kun den linie)...\"

Hilsen ZeroHero
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