Delphi-PRAXiS

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;

alzaimar 10. Dez 2006 16:09

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.

Blackheart 11. Dez 2006 16:00

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.

rawsoul 6. Feb 2007 14:03

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

Klaus01 6. Feb 2007 14:06

Re: Reservierte Wörter hervorheben [RichEdit]
 
Vielleicht ist es dieser hier:-> http://groups.google.de/group/de.com...e23ca8195aa5a1

Der Highlighter von Martin heißt jetzt wohl SynEdit -> http://www.delphipraxis.net/internal...ct.php?t=61765

Grüße
Klaus

rawsoul 6. Feb 2007 14:54

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

alzaimar 7. Feb 2007 08:30

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

Zitat von rawsoul
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...

Das glaube ich nicht: "Martin Waldenburg" mwEdit in Google eintippen und Enter drücken.

Seine Homepage ist aber offline, die Sourcen habe ich aber gefunden. Dann schaffst Du das auch.

sniper_w 1. Mär 2007 11:55

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

Das glaube ich nicht: "Martin Waldenburg" mwEdit in Google eintippen und Enter drücken.
Das habe ich aus langweile getan, und nach einigen Klicks habe ich hier folgende auswahl zu Verfühgung:

» Free Nudist Picture
» Single Girls
» Teen Nudist
» Hairy Girls
» Mens Underwear
» Russian Women

Nicht gerade ein Auswahl.... :roll:

Namenloser 1. Mär 2007 12:08

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

Zitat von rawsoul
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

o.O SynEdit ist doch das einfachste was es gibt. Du tust ein TSynEdit auf Formular und einen highlighter. Dann Wählst du bei der Eigenschaft "Highlighter" vom SynEdit deinen Highlighter aus. Fertig. Mehr musst du nicht machen.

Blackheart 1. Mär 2007 12:36

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

Zitat von NamenLozer
o.O SynEdit ist doch das einfachste was es gibt. Du tust ein TSynEdit auf Formular und einen highlighter. Dann Wählst du bei der Eigenschaft "Highlighter" vom SynEdit deinen Highlighter aus. Fertig. Mehr musst du nicht machen.

Wenn man auf forgefertigte Sprachen wie html, pas etc. zugreift magst Du recht haben, ansonsten doch eher nicht.
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 15:43 Uhr.

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