Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Syntax-Highlighting mit einem Richedit?


Palmetshofer - Fr 09.08.02 14:09
Titel: Syntax-Highlighting mit einem Richedit?
Ich habe einen Editor für eine Programmiersprache geschrieben und möchte eine Syntaxhighlightfunktion einbauen. Das heist wenn ich zum Beispiel { eingebe soll das dann blau sein aber nur das zeichen!
Gibts eventuell auch eine Komponente dafür??


Danke im Voraus für eure Hilfe!


Klabautermann - Fr 09.08.02 14:11

Hallo,

da gibt es einige. Die beliebteste ist SynEdit [http://synedit.sourceforge.net].

Gruß
Klabautermann


Palmetshofer - Fr 09.08.02 14:33

HHm kann ich da meine eigene Syntax mit eigenen farben und den zu erkennenden zeichen einstellen??? Hab nämlich einen Editor für Macromedia Flash MX ActionScript programmiert bzw. programmiere daran. Ist erst v 1.0 und die nächste version sollte dann Syntaxhighlight beherschen!!

Mfg Matthias


Tino - Fr 09.08.02 17:32

Palmetshofer hat folgendes geschrieben:
HHm kann ich da meine eigene Syntax mit eigenen farben und den zu erkennenden zeichen einstellen
Ja! Du musst dafür aber eine Ableitung von TSynCustomHighlighter erstellen. Schau Dir am besten vorher einmal die mitgelieferten Highlighter-Klassen (für Pascal, C++, ...) an.

Gruß
TINO


Palmetshofer - Fr 09.08.02 21:09

Hmm die sind ziemlich schwierig aufgebaut. Gibts da nichts einfacheres wo man die keywords einstallen kann und die Farbe dazu ?

mfg matthias


MathiasH - Fr 09.08.02 21:49

selber bauen :wink:

es ist zwar ne ganze menge QT den du da schreiben musst, aber besonder kompliziert müsste er wohl ich nicht sein, er liefert Stellen die dann im Richedit umgefärbt werden müssen, du musst dich halt mit der Unit "StrUtils" und ähnlichem auskennen..... :wink:


MathiasH


Palmetshofer - Sa 10.08.02 09:30

Hab erst angefangen delphi zu programmieren. Einfache sachen bekomm ich ja hi aber wenns dann schwierig wird wie sowas da komm ich nicht mehr mit!!


MathiasH - Sa 10.08.02 09:43

also die schlüsselwörter uä lassen sich über nen simplen such alog finden, und fett (oder sonst was) machen, das schwierige wären wohl die (und auch string) Kommentar-Umfärbungen, da diese auch über mehrere Zeilen gehen können

Mal schaun, vielleicht poste ich mal ein bisschen code dazu...*denk*

MathiasH


MathiasH - Sa 10.08.02 10:38

so da binn ich wieder
ich hab ein kleines Progi gebaut das keywords fett darstellt, af dieser basis müsstast du den rest selbst schaffen
hier also die zentrale procedure:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure searchkeywords;
var k: integer;
Foundpos: integer;
begin
with Form1 do begin
for k := 0 to Memo1.Lines.Count do begin

  Foundpos := RichEdit1.FindText(memo1.Lines[k], 0, Length(RichEdit1.Text), [stMatchCase]);

  while foundpos <> -1 do begin

    //keyword gefunden
    RichEdit1.selstart := Foundpos;
    RichEdit1.SelLength := Length(Memo1.Lines[k]);
    Richedit1.SelAttributes.Style := [fsBold];
    Foundpos := RichEdit1.FindText(memo1.Lines[k], Richedit1.SelStart+1, Length(RichEdit1.Text), [stMatchCase]);
  end;

end;
end;
end;


in Memo1 stehen untereinander die keywords und in Richedit1 steht der QT

Viel Spaß damit, ich hoffe ich konnte dir helfen :wink:

MathiasH


MathiasH - So 11.08.02 10:36

Da ich heut gut drauf bin gibts das mit den Klammern auch noch dazu!:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure searchchains(char1, char2: Char);
var
Foundposopen, Foundposclose: integer;
begin
with Form1 do begin

  Foundposopen := RichEdit1.FindText(Char1, 0, Length(RichEdit1.Text), [stMatchCase]);
  if Foundposopen <> -1 then begin
    Foundposclose := Richedit1.FindText(Char2, Foundposopen, Length(Richedit1.Text), [stMatchCase])
  end;
  while foundposopen <> -1 do begin

    //keyword gefunden
    RichEdit1.selstart := Foundposopen;
    RichEdit1.SelLength := Foundposclose-Foundposopen+1;
    Richedit1.SelAttributes.Style := [fsItalic];
    Richedit1.SelAttributes.Color := clGreen;
    Foundposopen := RichEdit1.FindText(Char1, Richedit1.SelStart+Richedit1.SelLength+1, Length(RichEdit1.Text), [stMatchCase]);
    if Foundposopen <> -1 then begin
    Foundposclose := Richedit1.FindText(Char2, Foundposopen, Length(Richedit1.Text), [stMatchCase])
  end;
  end;

end;
end;


Char1 und 2 sind die Anfangs-und end-Zeichen

MathiasH


Palmetshofer - So 11.08.02 12:00

Herzlichen dank!!! Werd mich mit deinem code ein bisschen auseinandersetzen!!! danke!!


MathiasH - So 11.08.02 15:56

Wenn du was mit dem Actionscript nicht formatiert bekommst, poste gleich wieder hier, Ich konnte das an Flsh nicht anpassen weil ich davon keinen Schimmer hab :oops:

Mathaish


Tino - Mo 12.08.02 11:52

Schau Dir doch mal diese Dokumentation an: Syntaxhighlighting im RichEdit [http://www.thedelphimagazine.com/Samples/1465/1465.htm]!

Gruß


MrKnogge - Sa 14.12.02 19:26

Hi

Was ist eigentlich der Unterschied zwischen
SynEdit und SynMemo ?

Könnte mir jemand ein Beispiel zeigen
wie man einen Quelltext dann ausdruckt ?