300分高分求解!如何在TRichEdit中实现语法高亮、多重UNDO/REDO、行号(像Ultraedit中的)?最好有源码或资料,注意:不用某某控件来代替。

  • 主题发起人 主题发起人 卢周
  • 开始时间 开始时间

卢周

Unregistered / Unconfirmed
GUEST, unregistred user!
300分高分求解!如何在TRichEdit中实现语法高亮、多重UNDO/REDO、行号(像Ultraedit中的)?最好有源码或资料,注意:不用某某控件来代替。(300分)<br />300分高分求解!如何在TRichEdit中实现语法高亮(注意效率)、多重UNDO/REDO、行号(像Ultraedit
中的)?最好有源码或资料,注意:不用其他控件如MWEdit等,只用代码实现。
 
您提的问题相当于在问:
有谁能够给我的 Windows 3.2 打一个补丁,使其达到Windows 2K 或 XP 的功能,还不能重装系统!

您还是好好看一看RxLib的RxRichEdit的源代码吧,Copy+Paste. OK?
 
没有可能,最除自己改VCL,改动的当然就不叫RICHEDIT了。
 
既然有mwEdit,那你为什么不自己看看mwEdit的源码呢?顶级优秀啊!!
 
用MWEdit来改吧
 
可是mwEdit对中文的支持却还有问题
 
为什么不用其他的控件,?
象RXLIB中的一个不错,,呀,,很好用,,
而且,有源码,,,
 
那你还是找Hexedit的源码看看吧!
 
有没有中国人写的编辑控件?
高手们先别牛,从这些基本的事做起。
也许挣不到什么钱,但给咱中国人挣面子。
俄罗斯盗版情况与中国差不多,但人有aspack,有rxlib,中国有什么?
不爽。
 
我笔记本上的一段代码, 不知道是在那里抄来的了, [:)]

procedure CodeColors(Form : TForm;Style : String; RichE : TRichedit;
InVisible : Boolean);
const
// 符号...
CodeC1: array[0..20] of String = ('#','$','(',')','*',',',
'.','/',':',';','[',']','{','}','<','>',
'-','=','+','''','@');
// 保留字...
CodeC2: array[0..44] of String = ('and','as','begin',
'case','char','class','const','downto',
'else','end','except','finally','for',
'forward','function','if','implementation','interface',
'is','nil','or','private','procedure','public','raise',
'repeat','string','to','try','type','unit','uses','var',
'while','external','stdcall','do','until','array','of',
'in','shr','shl','cos','div');
var
FoundAt : LongInt;
StartPos, ToEnd, i : integer;
OldCap,T : String;
FontC, BackC, C1, C2 ,C3 ,strC, strC1 : TColor;
begin
OldCap := Form.Caption;
with RichE do
begin
Font.Name := 'Courier New';
Font.Size := 10;
if WordWrap then WordWrap := false;
SelectAll;
SelAttributes.color := clBlack;
SelAttributes.Style := [];
SelStart := 0;
if InVisible then
begin
Visible := False;
Form.Caption := 'Executing Code Coloring...';
end;
end;

BackC := clWhite; FontC := clBlack;
C1 := clBlack; C2 := clBlack; C3 := clBlack;
strC := clBlue; strC1 := clSilver;

if Style = 'Twilight' then
begin
BackC := clBlack; FontC := clWhite;
C1 := clLime; C2 := clSilver; C3 := clAqua;
strC := clYellow; strC1 := clRed;
end
else
if Style = 'Default' then
begin
BackC := clWhite; FontC := clBlack;
C1 := clTeal; C2 := clMaroon; C3 := clBlue;
strC := clMaroon; strC1 := clSilver;
end
else
if Style = 'Ocean' then
begin
BackC := $00FFFF80; FontC := clBlack;
C1 := clMaroon; C2 := clBlack; C3 := clBlue;
strC := clTeal; strC1 := clBlack;
end
else
if Style = 'Classic' then
begin
BackC := clNavy; FontC := clYellow;
C1 := clLime; C2 := clSilver; C3 := clWhite;
strC := clAqua; strC1 := clSilver;
end
else
begin
with RichE do
begin
T := '{'+Style+' = Invalid Style [Default,Classic,Twilight,Ocean] ONLY! }';
Lines.Insert(0,T);
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(T, StartPos, ToEnd, [stWholeWord]);
SelStart := FoundAt;
SelLength := Length(T);
SelAttributes.Color := clRed;
SelAttributes.Style := [fsBold];
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText('ONLY!', StartPos, ToEnd, [stWholeWord]);
SelStart := FoundAt;
SelLength := 4;
SelAttributes.Color := clRed;
SelAttributes.Style := [fsBold,fsUnderLine];
end;
end;

RichE.SelectAll;
RichE.color := BackC;
RichE.SelAttributes.color := FontC;

for i := 0 to 100 do
begin
with RichE do
begin
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(IntToStr(i), StartPos, ToEnd, [stWholeWord]);
while (FoundAt <> -1) do
begin
SelStart := FoundAt;
SelLength := Length(IntToStr(i));
SelAttributes.Color := C1;
SelAttributes.Style := [];
StartPos := FoundAt + Length(IntToStr(i));
FoundAt := FindText(IntToStr(i), StartPos, ToEnd, [stWholeWord]);
end;
end;
end;
for i := 0 to 20 do
begin
with RichE do
begin
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(CodeC1, StartPos, ToEnd, []);
while (FoundAt <> -1) do
begin
SelStart := FoundAt;
SelLength := Length(CodeC1);
SelAttributes.Color := C2;
StartPos := FoundAt + Length(CodeC1);
FoundAt := FindText(CodeC1, StartPos, ToEnd, []);
end;
end;
end;
for i := 0 to 44 do
begin
with RichE do
begin
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(CodeC2, StartPos, ToEnd, [stWholeWord]);
while (FoundAt <> -1) do
begin
SelStart := FoundAt;
SelLength := Length(CodeC2);
SelAttributes.Color := C3;
SelAttributes.Style := [fsBold];
StartPos := FoundAt + Length(CodeC2);
FoundAt := FindText(CodeC2, StartPos, ToEnd, [stWholeWord]);
end;
end;
end;
Startpos := 0;
with RichE do
begin
FoundAt := FindText('''', StartPos, Length(Text), []);
while FoundAt <> -1 do
begin
SelStart := FoundAt;
Startpos := FoundAt+1;
FoundAt := FindText('''', StartPos, Length(Text), []);
if FoundAt <> -1 then
begin
SelLength := (FoundAt - selstart)+1;
SelAttributes.Style := [];
SelAttributes.Color := strC;
StartPos := FoundAt+1;
FoundAt := FindText('''', StartPos, Length(Text), []);
end;
end;
end;

Startpos := 0;
with RichE do
begin
FoundAt := FindText('{', StartPos, Length(Text), []);
while FoundAt <> -1 do
begin
SelStart := FoundAt;
Startpos := FoundAt+1;
FoundAt := FindText('}', StartPos, Length(Text), []);
if FoundAt <> -1 then
begin
SelLength := (FoundAt - selstart)+1;
SelAttributes.Style := [];
SelAttributes.Color := strC1;
StartPos := FoundAt+1;
FoundAt := FindText('{', StartPos, Length(Text), []);
end;
end;
end;

if InVisible then
begin
RichE.Visible := True;
Form.Caption := OldCap;
end;
RichE.SelStart := 0;
end;
 
有这样的单元的,他的作用就是给TRichEdit加亮,提供源代码的,叫做richsyntax
和psvdialogs是同一个作者,你看看人家怎么做的吧,其实可以直接使用的,直接就是
标准的TRichEdit。

这个问题应该可以结了吧,这么久了!
 
学习了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部