Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.20;
Скачать: CL | DM;

Вниз

Подсветка синтаксиса в Richedit   Найти похожие ветки 

 
Сергей Резников ©   (2003-11-09 14:34) [0]

Согласен, вопрос старый, но в поиске ничего хорошего не нашёл поэтому решил спросить.
Как обеспечить подсветку синтаксиса в richedit`e (как в delphi) ?


 
Сергей Резников ©   (2003-11-09 15:04) [1]

Подскажите, плиз или хоть линк дайте на то, где можно об этом прочесть !


 
Palladin ©   (2003-11-09 15:10) [2]

TRichEdit.SelAttributes


 
Слава   (2003-11-09 15:12) [3]

SelAttributes это если слов мало, введи слово highlight в поиске, есть такой компонент, токо правильно напиши его


 
Palladin ©   (2003-11-09 15:15) [4]


> SelAttributes это если слов мало

Чем обосновано?


 
Сергей Резников ©   (2003-11-09 15:22) [5]

Да ясно что SelAttributes ! Не ясно как выделять !


 
Palladin ©   (2003-11-09 15:23) [6]

Ну а другие методы на Sel начинающиеся в ломы посмотреть?!


 
mOOx_ ©   (2003-11-09 15:35) [7]

SelAttributes - это конечно круто, только если слова большие, то моргает сильно. К тому же проверка идет при каждом нажатии на клавишу. Можно себе представить, что я вижу :)


 
Palladin ©   (2003-11-09 15:43) [8]

А ты не выделяй все слово, а проверяй вхождение введенного символа в слово и выделяй только символ.


 
Слава   (2003-11-09 15:52) [9]

Что б не моргало отключай перерисовку. Так и быстрее будет.


 
mOOx_ ©   (2003-11-09 15:55) [10]

Это я только сейчас подумал. А тогда... :). Действительно, сильно моргать не должно. Так что. Кстати, уж раз пошел разговор, то доделаю я эту апликуху :). Что лучше использовать: OnChange or OnKeyPress?


 
Слава   (2003-11-09 15:56) [11]

Где-то так, перед этим запрети перерисовку окна а потом включи.
richedit.selstart:=i;
richedit.sellenght:=k;
richedit.selatribute.color:=clred;


 
mOOx_ ©   (2003-11-09 15:56) [12]

Отключу, и что? Когда отключить, когда включить?


 
mOOx_ ©   (2003-11-09 15:57) [13]

А, ясен пень :). Дело. Перерисовка - это типа BeginUpdate and EndUpdate?


 
Palladin ©   (2003-11-09 15:58) [14]

Отключение включение перерисовки не имеет смысла при вводе текста. А вот при массовом парсинге и выделении еще как имеет.


 
mOOx_ ©   (2003-11-09 16:07) [15]

Вот такая байда

...
with FViewWnd do
begin
SelStart:=KeyWord.LIndex;
SelLength:=KeyWord.RIndex-KeyWord.LIndex;
SelAttributes.Color:=clRed;
SelStart:=CurPos.X;//CurPos - старое положение курсора
SelLength:=0;
SelAttributes:=DefAttributes;
end;
...

После выделения на второй строке перескакивает на первую в позицию Х. СедСтарт - это что, позиция символа во всем тексте. Типа в свойстве Text?


 
Palladin ©   (2003-11-09 16:09) [16]

да


 
mOOx_ ©   (2003-11-09 16:11) [17]

Черт, придется через ж... :). Ну ладно. Теперь вроде все понятно :). Спасибо.


 
Palladin ©   (2003-11-09 16:22) [18]

Вообще конечно рекомендую SynEdit.


 
Zew ©   (2003-11-09 20:58) [19]

Примерно так

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, ComCtrls;

type
TForm1 = class(TForm)
RichEdit1: TRichEdit;
Button1: TButton;
OpenDialog1: TOpenDialog;
Button2: TButton;
procedure RichEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure HighLight;
function CheckList(InString: string): boolean;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.CheckList(InString: string): boolean;
const TheList: array[1..13] of string = ("begin", "or", "end","end.",
"end;", "then", "var", "for", "do", "if", "to", "string", "while");
var X: integer;
begin
Result := false;
X := 1;
InString := StringReplace(InString, " ", "",[rfReplaceAll]);
InString := StringReplace(InString, #$A, "",[rfReplaceAll]);
InString := StringReplace(InString, #$D, "",[rfReplaceAll]);
while X < High(TheList) + 1 do
if TheList[X] = lowercase(InString) then
begin
Result := true;
X := High(TheList) + 1;
end
else inc(X);
end;

procedure TForm1.RichEdit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
var WEnd, WStart, BCount: integer;
Mark: string;
begin
if (ssCtrl in Shift) and (Key = ord("V")) then Button2Click(Self);
if (Key = VK_Return) or (Key = VK_Back) or (Key = VK_Space) then
begin
if RichEdit1.SelStart > 1 then
begin
WStart := 0;
WEnd := RichEdit1.SelStart;
BCount := WEnd - 1;
while BCount <> 0 do
begin
Mark := copy(RichEdit1.Text, BCount, 1);
if (Mark = " ") or (Mark = #$A) then
begin
WStart := BCount;
BCount := 1;
end;
dec(BCount);
end;
RichEdit1.SelStart := WEnd - (WEnd - WStart);
RichEdit1.SelLength := WEnd - WStart;
if CheckList(RichEdit1.SelText) then
RichEdit1.SelAttributes.Style := [fsBold]
else RichEdit1.SelAttributes.Style := [];
RichEdit1.SelStart := WEnd;
RichEdit1.SelAttributes.Style := [];
end;
end;
end;

function SearchFor(WorkSpace, Search: string; Start: integer): integer;
var Temp: string;
begin
Temp := copy(WorkSpace, Start, length(WorkSpace));
Result := pos(Search, Temp);
end;

procedure TForm1.HighLight;
var WStart, WEnd, WEnd2: integer;
WorkSpace, SWord: string;
begin
WStart := 1;
WEnd := 1;
with RichEdit1 do
begin
WorkSpace := Text + " " + #$D#$A;
while WEnd > 0 do
begin
WEnd := SearchFor(WorkSpace, " ", WStart);
WEnd2 := SearchFor(WorkSpace, #$A, WStart);
if WEnd2 < WEnd then WEnd := WEnd2;
SWord := copy(WorkSpace, WStart, WEnd - 1);
if (SWord <> " ") and (SWord <>"") then
if CheckList(SWord) then
begin
SelStart := WStart - 1;
SelLength := length(SWord);
SelAttributes.Style := [fsBOLD];
SelStart := WStart + length(SWord) + 1;
SelAttributes.Style := [];
end;
WStart := WStart + WEnd;
end;
SelStart := length(Text);
SetFocus;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
HighLight;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
RichEdit1.PasteFromClipboard;
HighLight;
end;

end.


 
Ugh   (2003-11-11 02:30) [20]

не парьтесь посмотрите на www.delphi3000.com



Страницы: 1 вся ветка

Текущий архив: 2003.11.20;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
7-66146
Zero Ice
2003-09-11 17:43
2003.11.20
Printers


1-65881
Win error
2003-11-09 08:25
2003.11.20
консольное приложение


1-65917
mc_duck
2003-11-08 12:45
2003.11.20
Сохранение объектов.


1-65841
Кен
2003-11-09 01:39
2003.11.20
Как сделать парсинг html-странички, на предмет вытаскивания всех


14-66074
Izyum
2003-10-29 17:24
2003.11.20
Оформление форума