Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Reservierte Wörter hervorheben [RichEdit] (https://www.delphipraxis.net/82281-reservierte-woerter-hervorheben-%5Brichedit%5D.html)

Blackheart 10. Dez 2006 09:00


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;

Balu der Bär 10. Dez 2006 09:07

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? ;)

Mackhack 10. Dez 2006 09:08

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.

Blackheart 10. Dez 2006 09:13

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

Elvis 10. Dez 2006 09:24

Re: Reservierte Wörter hervorheben [RichEdit]
 
Zitat:

Zitat von Blackheart
Hab ungefähr 10 Wörter die Fett dargestellt werden sollen und wollte dafür nicht unbedingt SynEdit einsetzen.

Falls du denkst, dass SynEdit mehr Ressourcen frisst als ein RichEdit, dann bist du auf'm Holzweg. ;)

Blackheart 10. Dez 2006 09:37

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

jfheins 10. Dez 2006 09:42

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 ;)

marabu 10. Dez 2006 09:44

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

Blackheart 10. Dez 2006 09:49

Re: Reservierte Wörter hervorheben [RichEdit]
 
Ahso benutze Delphi 7 dann erstmal Danke für die Antworten.
Habs hinbekommen.

Delphi-Quellcode:
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;
Blackheart

Blackheart 10. Dez 2006 14:40

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 22:20 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz