![]() |
Reservierte Wörter hervorheben [RichEdit]
Hallo Leute
Ich wollte im RichEdit Reservierte Wörter hervorheben das klappt auch Soweit. Jetzt hätte Ich es gern schon bei Eingabe des Textes, also zur Laufzeit. Hätte da Jemand eine Idee und könnte Mir auf die Sprünge helfen. Blackheart
Delphi-Quellcode:
var
Form1: TForm1; Reserviert: Array [0..2] of String= ('begin', 'end', 'end.'); implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i,j: Integer; s: String; begin for j:=0 to 2 do begin s:=Reserviert[j]; for i:= Length(RichEdit1.Text)-1 downto 0 do begin RichEdit1.SelStart:=i; RichEdit1.SelLength:=Length(s); if (Uppercase(RichEdit1.SelText)=Uppercase(s)) then begin RichEdit1.SelAttributes.Style:=[fsBold]; end; end; end; end; |
Re: Reservierte Wörter hervorheben [RichEdit]
Warum machst du dir die Mühe und nimmst nicht gleich fertige Komponenten wie das Synedit, da sowas von alleine können? ;)
|
Re: Reservierte Wörter hervorheben [RichEdit]
Delphi-Quellcode:
unit ufoMain;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) private { Private declarations } function IsReservedWord(const aReservedWord: String): Boolean; function SpecialCases(const aReservedWord: String): Boolean; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} { TForm1 } function TForm1.IsReservedWord(const aReservedWord: String): Boolean; const coReserved: Array[1..115] of String = ('and', 'else', 'inherited', 'packed', 'then', 'array', 'end', 'end;', 'end.', 'initialization', 'procedure', 'threadvar', 'as', 'except', 'inline', 'program', 'to', 'asm', 'exports', 'interface', 'property', 'try', 'begin', 'file', 'is', 'raise', 'type', 'case', 'final', 'label', 'record', 'unit', 'class', 'finalization', 'library', 'repeat', 'unsafe', 'const', 'finally', 'mod', 'resourcestring', 'until', 'constructor', 'for', 'nil', 'sealed', 'uses', 'destructor', 'function', 'not', 'set', 'var', 'dispinterface', 'goto', 'object', 'shl', 'while', 'div', 'if', 'of', 'shr', 'with', 'do', 'implementation', 'or', 'static', 'xor', 'downto', 'in', 'out', 'string', 'absolute', 'dynamic', 'local', 'platform', 'requires', 'abstract', 'export', 'message', 'private', 'resident', 'assembler', 'external', 'name', 'protected', 'safecall', 'automated', 'far', 'near', 'public', 'stdcall', 'cdecl', 'forward', 'nodefault', 'published', 'stored', 'contains', 'implements', 'overload', 'read', 'varargs', 'default', 'index', 'override', 'readonly', 'virtual', 'deprecated', 'package', 'register', 'write', 'dispid', 'library', 'pascal', 'reintroduce', 'writeonly'); var CaseWord: String; ReservedWord: String; begin CaseWord := LowerCase(Trim(aReservedWord)); Result := False; for ReservedWord in coReserved do begin if ( ReservedWord = CaseWord ) then begin Result := True; Exit; end; end; end; function TForm1.SpecialCases(const aReservedWord: String): Boolean; var CaseWord: String; begin CaseWord := LowerCase(aReservedWord); Result := (Pos('class(', CaseWord) > 0) or (Pos('array[', CaseWord) > 0); end; end. |
Re: Reservierte Wörter hervorheben [RichEdit]
Das wollt Ich eigentlich vermeiden, das mit Pascal war jetzt nur ein Beispiel.
Hab ungefähr 10 Wörter die Fett dargestellt werden sollen und wollte dafür nicht unbedingt SynEdit einsetzen. Blackheart |
Re: Reservierte Wörter hervorheben [RichEdit]
Zitat:
|
Re: Reservierte Wörter hervorheben [RichEdit]
Hab mal die Unit von Mackhack ausprobiert krieg aber immer Fehlermeldungen
Operator ist auf Diesen Operandentyp nicht anwendbar. for ReservedWord in coReserved do Wollte Synedit eigentlich nicht einsetzen weil es das Prog unnötig groß macht. Blackheart |
Re: Reservierte Wörter hervorheben [RichEdit]
Ja, er benutzt eine for-in Schleife ... die gibt es glaube ich erst seit ... :gruebel: ... Delphi 2005 ?
Wenn du eine ältere Version hast,musst du wohl oder übel die Elemente herkömlich durchiterieren ;) |
Re: Reservierte Wörter hervorheben [RichEdit]
Hi,
der Code von MackHack verwendet ein language feature, welches in deiner Delphi-Version noch nicht existiert. Wenn du deine Delphi-Version in deinem DP-Profil nachträgst, dann kann man darauf Rücksicht nehmen. Bei einem simplen interaktivem HighLighter musst du bei jeder Änderung des Textes den entsprechenden Textbereich so erweitern, dass Wörter, die an die Bereichsgrenzen anschließen, für die nachfolgende Analyse mit eingeschlossen werden. Ob dieser simple Ansatz bei dir trägt, das hängt von der Grammatik deines Textes ab. Freundliche Grüße |
Re: Reservierte Wörter hervorheben [RichEdit]
Ahso benutze Delphi 7 dann erstmal Danke für die Antworten.
Habs hinbekommen.
Delphi-Quellcode:
Blackheart
procedure ReserviertBold(RichEdit1: TRichedit);
var i,j:Integer; Bold, str: String; begin for i:= 1 to length(RichEdit1.Text) do for j:= 0 to High(Reserviert) do begin Bold:= Reserviert[j]; str:= Copy(RichEdit1.text, i, Length(Bold)); if (str = Bold) then begin RichEdit1.SelStart:= i - 1; RichEdit1.Sellength:= length(Bold); RichEdit1.SelAttributes.style:= [fsbold]; RichEdit1.SelStart:=length(RichEdit1.Text)-1; RichEdit1.SelAttributes.Style:= []; end; end; end; |
Re: Reservierte Wörter hervorheben [RichEdit]
Klappt doch noch nicht ganz so, weil Ich ja SelStart immer ans Ende des Textes setze, kann Ich jetzt nicht mehr zb. - wenn Ich Fünf Zeilen hab in der Ersten Zeile was eingeben.
Habs schon mit RichEdit1.CaretPos.x probiert klappt aber auch nicht so Recht. Vieleicht hat ja von Euch noch wer eine Idee. Hier nochmal der Quelltext zur Zeit.
Delphi-Quellcode:
var
Form1: TForm1; Reserviert: array[0..2] of string =('begin', 'end', 'end.'); implementation {$R *.dfm} procedure ReserviertBold(RichEdit1: TRichedit); var i,j:Integer; Bold, Str: String; begin for i:= 1 to length(RichEdit1.Text) do for j:= 0 to High(Reserviert) do begin Bold:= Uppercase(Reserviert[j]); Str:= Uppercase(Copy(RichEdit1.text, i, Length(Bold))); if (Str = Bold) then begin RichEdit1.SelStart:= i - 1; RichEdit1.Sellength:= Length(Bold); RichEdit1.Text:=StringReplace(RichEdit1.Text,Bold,Uppercase(Bold),[rfReplaceAll, rfIgnoreCase]); RichEdit1.SelAttributes.Color := clBlue; RichEdit1.SelAttributes.Style:= [fsbold]; RichEdit1.SelStart:=Length(RichEdit1.Text)-1; RichEdit1.SelAttributes.Style:= []; end; end; end; procedure TForm1.RichEdit1Change(Sender: TObject); begin ReserviertBold(RichEdit1); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz