Форум: "KOL";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизВопрос про подсветку в Rich Edit (прикладываю полный проект) Найти похожие ветки
← →
=Sniper= (2004-08-24 00:04) [0]Что тут такое!?
http://www.ogldelphi.km.ru/pub/vopros.zip
← →
=Sniper= (2004-08-24 15:52) [1]Для тех кто думает что там вирь (или ещё чего) выкладываю просто текст модуля:
{ KOL MCK } // Do not remove this line!
{$DEFINE KOL_MCK}
unit Unit1;
interface
{$IFDEF KOL_MCK}
uses Windows, Messages, ShellAPI, KOL {$IFNDEF KOL_MCK}, mirror, Classes, Controls, mckControls, mckObjs, Graphics,
mckCtrls {$ENDIF};
{$ELSE}
{$I uses.inc}
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, mirror;
{$ENDIF}
type
{$IFDEF KOL_MCK}
{$I MCKfakeClasses.inc}
{$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
{$IFDEF KOLCLASSES}{$I TForm1.inc}{$ELSE} TForm1 = object(TObj) {$ENDIF}
Form: PControl;
{$ELSE not_KOL_MCK}
TForm1 = class(TForm)
{$ENDIF KOL_MCK}
KOLProject1: TKOLProject;
KOLForm1: TKOLForm;
RichEdit1: TKOLRichEdit;
Button1: TKOLButton;
procedure Button1Click(Sender: PObj);
procedure RichEdit1Change(Sender: PObj);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TDelim= Set of char;
var
Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;
Delims: TDelim=[" ","[","]","(",")",":",";",".",#13,#10,#09,"=","<",">","/"];
StartPos: Integer;
{$IFDEF KOL_MCK}
procedure NewForm1( var Result: PForm1; AParent: PControl );
{$ENDIF}
implementation
{$IFNDEF KOL_MCK} {$R *.DFM} {$ENDIF}
{$IFDEF KOL_MCK}
{$I Unit1_1.inc}
{$ENDIF}
procedure SetBold(re: TKolRichEdit;const aPos,aLen: Integer);
begin
with form1^ do
begin
RichEdit1.SelStart := aPos;
RichEdit1.SelLength := aLen;
RichEdit1.RE_FmtFontColor := clGreen;
RichEdit1.RE_FmtBold := true;
RichEdit1.SelLength := 0;
end;
end;
function isTags(const aSrc: String;aPos,MaxLen: Integer ): Integer;
const aTagsWord: array[0..25] of String=(
"TYPE","CONST","FUNCTION","STRING","WHILE",
"VAR","INTEGER","PROCEDURE","BEGIN","END",
"CLASS","INITIALIZATION","FINALIZATION","UNIT","IMPLEMENTATION",
"STRING","TRY","FINALLY","EXCEPT","FOR",
"IF","THEN","ELSE","PROGRAM","USES",
"CASE"
);
var
i: Integer;
s: String;
LenTag: Integer;
LenASrc: Integer;
begin
Result := 0;
LenASrc := Length(aSrc);
for i := 0 to High(aTagsWord) do
begin
LenTag := Length(aTagsWord[i]);
s :=UpperCase(Copy(aSrc,aPos,LenTag));
if s=aTagsWord[i] then
begin
if LenASrc>=aPos+LenTag then
begin
if aSrc[aPos+LenTag] in Delims then
begin
if aPos>1 then
begin
if aSrc[aPos-1] in Delims then
begin
Result := LenTag;
Exit;
end
else continue;
end
else
begin
Result := LenTag;
Exit;
end;
end;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: PObj);
var
i: Integer;
Len,LenStr: Integer;
s: String;
begin
i := 1;
s := RichEdit1.Text;
LenStr := Length(s);
while i<=LenStr do
begin
if (s[i] = #13) or (s[i] = #10) then
begin
Inc(i);
continue;
end;
Len := isTags(s,i,50);
if Len<>0 then
begin
SetBold(RichEdit1,i-1,Len);
Inc(i,Len);
end
else Inc(i);
end;
end;
procedure TForm1.RichEdit1Change(Sender: PObj);
var
Pos1: Integer;
begin
RichEdit1 := TKolRichEdit(Sender);
StartPos := RichEdit1.SelStart;
end;
end.
Причём прикол! Первая строчка нормально выделяется а на второй всё сбивается!
← →
Vladimir Kladov (2004-08-24 16:11) [2]наверное, дело в том, что в коде индексы вычисляются от строки, а передаются в richedit, у которого своя индексация символов. Надо написать небольшую функцию, которая бы сначала находила индекс первого символа в нужной строке, а потом от него считала символы в строке. В VCL этой проблемы нет, потому что там используется Lines, которое и выполняет эту работу. На самом деле, можно попробовать из индекса вычитать (номер строки - 1), т.е. количество предшествующих #10.
← →
=Sniper= (2004-08-25 00:58) [3]Спасибо поковыряюсь!
Но вообще лучше чтобы KOL была похожа на VCL - т.е lines появилась бы в KOLе (она ведь не только для этого полезна)! %-)
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.042 c