Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1110867080
Alex_C
2005-03-15 09:11
2005.03.27
Конвертация из большого текстового вайла


3-1109087328
Dyusha
2005-02-22 18:48
2005.03.27
Удаление всех записей при помощи ADOQuery


1-1110614327
New_user
2005-03-12 10:58
2005.03.27
как можно загрузить web страницу из интернета в tmemo,


1-1111063405
randomize
2005-03-17 15:43
2005.03.27
Проблема с компонентами


9-1104546897
Xerx
2005-01-01 05:34
2005.03.27
OpenGL и вывод текста GDI





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский