![]() |
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; |
Re: Reservierte Wörter hervorheben [RichEdit]
@Blackheart: auch wenn das Dein Problem nicht direkt löst: Es gibt von Martin Waldenburg einen Syntax-Highlighter, der an ein TRichEdit angeschlossen wird. Auf dieser Komponente basiert übrigens das TSynEdit. Du müsstest es noch auf seiner Homepage finden.
|
Re: Reservierte Wörter hervorheben [RichEdit]
Hab jetzt einen Tip von Lannes bekommen Mir Selstart im OnChange
zu merken und das klappt, hab immer an der Procedur gewerkelt - auf das einfachste kommt man nicht. Edit Wie kann Ich Fragen als beantwortet markieren, find nirgends was. |
Re: Reservierte Wörter hervorheben [RichEdit]
Sorry, dass ich nochmal pushen muss... Bin an dem Higlighter von Martin Waldenburg interessiert, finde aber nirgends seine Homepage, geschweigedenn seinen Namen ;)
Gegoogelt hab ich, hier in der DP finde ich auch nur diesen Thread... Hat den Link noch wer? LG |
Re: Reservierte Wörter hervorheben [RichEdit]
Vielleicht ist es dieser hier:->
![]() Der Highlighter von Martin heißt jetzt wohl SynEdit -> ![]() Grüße Klaus |
Re: Reservierte Wörter hervorheben [RichEdit]
Hm, so ein Mist :(
SynEdit ist für meine Verhältnisse zu kompliziert - oder ich stelle mich doof an. Hatte nach etwas simplem gesucht. Trotzdem Danke für die Mühen :D |
Re: Reservierte Wörter hervorheben [RichEdit]
Zitat:
Seine Homepage ist aber offline, die Sourcen habe ich aber gefunden. Dann schaffst Du das auch. |
Re: Reservierte Wörter hervorheben [RichEdit]
Zitat:
![]() » Free Nudist Picture » Single Girls » Teen Nudist » Hairy Girls » Mens Underwear » Russian Women Nicht gerade ein Auswahl.... :roll: |
Re: Reservierte Wörter hervorheben [RichEdit]
Zitat:
|
Re: Reservierte Wörter hervorheben [RichEdit]
Zitat:
Es gibt zwar die Möglichkeit und auch ein Demo zum erstellen von eigenen Sachen aber... Ich werd daraus nicht Schlau. Wenn das so einfach ist, könntest Du vieleicht mal ein kleines Tutorial dazu erstellen denn im Netz ist darüber auch nichts zu finden. :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:14 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