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

Вниз

Вопрос про подсветку в 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 вся ветка

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

Наверх




Память: 0.48 MB
Время: 0.032 c
1-1110901761
xsh
2005-03-15 18:49
2005.03.27
Stringgrid и Edit


6-1106804544
ТехникПТО
2005-01-27 08:42
2005.03.27
Создание TWebBrowser


3-1109152622
Adil
2005-02-23 12:57
2005.03.27
работать с Баз данными не используя BDE


14-1109840007
Marser
2005-03-03 11:53
2005.03.27
Хочу извиниться


9-1104334185
-=SS=-
2004-12-29 18:29
2005.03.27
GLScene освещение