Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Вниз

Как сделать подсветку синтаксиса с помощью HIlightMemo?   Найти похожие ветки 

 
Greeg   (2006-12-11 11:45) [0]

Здравствуйте! Подскажите как правильно сделать подсветку синтаксиса в HIlightMemo! В OnScanToken как я не делал, всё не коректно получалось.


 
Vladimir Kladov   (2006-12-11 17:02) [1]

есть же пример вроде.


 
Greeg   (2006-12-11 21:53) [2]

Я не смог сделать, чтоб нормально подсвечивался синтаксис Паскаля! Была куча алгоритмов...Подсвечивается не всё! Мне нужен пример, чтоб хотябы begin подсвечивался нормально, иднентично Дельфийскому! Вот мой код...


function OnScanToken(Dumpy: Pointer; Sender: PControl; const FromPos: TPoint;
 var Attrs: TTokenAttrs): Integer;
var
 S, Word: String;
 Idx, Len, c: Integer;
 Ident: Boolean;
begin
 S := AnsiLowerCase(Editor.Edit.Lines[FromPos.Y]);
 Len := Length(S);
 Result := 0;
 Ident := FALSE;
 if S = "" then Exit;
 Idx := FromPos.X;
 for c := 0 to WordList.Count - 1 do begin //Список зарезе.слов
   Word := WordList.Items[c];
   if AnsiCompareStr(Copy(S, Idx + 1, Length(Word)), Word) = 0 then
     Ident := TRUE;

   while (Idx < Len) and not (S[Idx + 1] in TSynWordBreakChars) and (Length(Word) > Idx - FromPos.X) do
     Inc(Idx);
   if Ident then
     Break;
{    if Length(Word) < Idx - FromPos.X then
     Ident := FALSE;
}
 end;
//  Result := Idx - FromPos.X;
 Result := Length(Word);
 if Ident then begin
   Attrs.FontStyle := [fsBold];
   Attrs.FontColor := clNavy;
   Exit;
 end else begin
   Attrs.FontStyle := [];
   Attrs.FontColor := clWindowText;
 end;
 FormMain.StatusText[0] := PChar(Format("FromPos [%d, %d], Len %d", [FromPos.X, FromPos.Y, Len]));
end;


 
mdw ©   (2006-12-12 13:37) [3]

У меня примерно так реализовано. Не работают мнонгострочные коментарии, лениво делать:

type TTokens = (tNone, tReservedWord, tComment, tCharStr, tDigital);

const ReservedWordsCount = 72;
     ReservedWords: array [0..ReservedWordsCount-1]of string = (
                                              "and", "array", "as", "asm",
                                              "begin", "case", "class", "const",
                                              "constructor", "destructor", "dispinterface", "div",
                                              "do", "downto", "else", "end",
                                              "except", "exports", "file", "finalization",
                                              "finally", "for", "function", "goto",
                                              "if", "implementation", "in", "inherited",
                                              "initialization", "inline", "interface", "is",
                                              "label", "library", "mod", "nil",
                                              "not", "object", "of", "or",
                                              "out", "packed", "procedure", "program",
                                              "property", "raise", "record", "repeat",
                                              "resourcestring", "set", "shl", "shr",
                                              "string", "then", "threadvar", "to",
                                              "try", "type", "unit", "until",
                                              "uses", "var", "while", "with",
                                              "xor", "private", "protected", "public",
                                              "published", "automated", "at", "on"
                                              );

const Separators = " ;.,:=><()[]*+-/@^&#${}";

// {}  (* *)
function TCodesForm.ParseLine(ASource: String; APos: Integer; var ALength: Integer): TTokens;
var k: Integer;
   S: String;
begin
   Result:= tNone;
   ALength:= 1;
   ASource:= AnsiLowerCase(ASource);
   Delete(ASource, 1, APos-1);
   if ASource = "" then Exit;

   //Коментарии
   if Copy(ASource, 1, 2) = "//" then begin
     ALength:= Length(ASource);
     Result:= tComment;
     Exit;
   end;
   if (ASource[1] = "{") then begin
     ALength:= Pos("}", ASource);
     if ALength = 0 then ALength:= Length(ASource);
     Result:= tComment;
     Exit;
   end;

   //Строки
   if ASource[1] = """" then begin
     Delete(ASource, 1, 1);
     k:= Pos("""", ASource);
     if k = 0 then k:= Length(ASource);
     ALength:= k+1;
     Result:= tCharStr;
     Exit;
   end;
   if ASource[1] = "#" then begin
     ALength:= 1;
     while (Length(ASource)>ALength)and(ASource[ALength+1] in ["#", "0".."9"]) do inc(ALength);
     Result:= tCharStr;
     Exit;
   end;

   //Цифры
   if ASource[1] in ["$", "0".."9"] then begin
     ALength:= 1;
     while (Length(ASource)>ALength)and
           ((ASource[ALength+1] in [".", "0".."9"])or
            ((ASource[1]="$")and(ASource[ALength+1] in ["a".."f"]))) do inc(ALength);
     Result:= tDigital;
     Exit;
   end;

   S:= Parse(ASource, Separators);
   if FReservedWords.Find(S, k) then Result:= tReservedWord;
   ALength:= Max(1, Length(S));
end;

function TCodesForm.HEditScanToken(Sender: PControl; const FromPos: TPoint; var Attrs: TTokenAttrs): Integer;
begin
    Attrs.fontcolor := clWindowText;
    Attrs.fontstyle := [ ];
    case ParseLine(HEdit.Edit.Lines[FromPos.Y], FromPos.X+1, Result) of
      tReservedWord: Attrs.fontstyle:= [fsBold];
      tComment: begin
        Attrs.fontstyle:= [fsItalic];
        Attrs.fontcolor:= clGrayText;
      end;
      tCharStr: begin
        Attrs.fontstyle:= [];
        Attrs.fontcolor:= clFuchsia;
      end;
      tDigital: begin
        Attrs.fontstyle:= [];
        Attrs.fontcolor:= clBlue;
      end;
    end
end;


 
mdw ©   (2006-12-12 13:39) [4]

Де еще, где нибудь при создании:

   FReservedWords:= NewStrList;
   for i:= 0 to ReservedWordsCount-1 do ReservedWords.Add(ReservedWords[i]);
   FReservedWords.Sort(False);


 
Greeg   (2006-12-12 22:40) [5]

Большое спасибо, всё работает!!!



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

Форум: "KOL";
Текущий архив: 2007.07.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.036 c
2-1183133790
Nyo
2007-06-29 20:16
2007.07.22
Запуск внешнего приложения в окне своего


8-1161987342
Sergey_FV
2006-10-28 02:15
2007.07.22
ico -> Imagelist -> bitmap


15-1182519740
Petr V.Abramov
2007-06-22 17:42
2007.07.22
Посоветйте книжку по Access для чайников


15-1182798566
Kolan
2007-06-25 23:09
2007.07.22
Вернуться с D2007 на BDS2006&amp;#133


1-1175586374
Kolan
2007-04-03 11:46
2007.07.22
Свой ActionList





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский