| | | | |
Компоненты для подсветки синтаксиса. Альтернативное развитие. | Полный текст материала
Другие публикации автора: Вадим Балашов
Цитата или краткий комментарий: «... Cтатья является продолжением статьи Максима Парфентьева "Компоненты для
подсветки синтаксиса. Новый взгляд" ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 13 | 100% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 13 | | | Все понятно, материал читается легко | [1] | 12 | 100% | | | | Есть неясности в изложении | [2] | 0 | 0% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 12 |
[Подсвеченный синтаксис]
Отслеживать это обсуждение
Всего сообщений: 2816-08-2009 09:01Спасибо, за интересный компонент! |
|
28-12-2007 13:33При подключении компонента в Delphi 7 возникает ошибка "Resourse BOOKMARKS not found". Что это? |
|
14-11-2007 14:05ну так очень интересно - публикуй! :) |
|
08-11-2007 10:55Интересный компонент, недавно внедрил в свои проекты, сделал возможность подключать подсветки, пришлось переделать парсинг (был слишком ориентирован на синтаксис pascal/c), поправил несколько ошибок, сделал DB контрол. Работал с версией без юникода. Сделал подсветки SQL, XML, Pascal. Если интересно, могу поделится своей версией. У кого будет интерес можно продолжить развитие.
atruhin1973(...)mail.ru |
|
31-08-2007 08:43сообщение от автора материала Нет, к сожалению, уже не будет.
Тогда для меня это было проектом на интерес, когда было свободное время. В момент написания юникодовой версии времени не стало, поэтому она осталась незаконченной и видимо такой и останется...
Спасибо всем, кто когда-либо проявил интерес... |
|
31-08-2007 03:40
27-12-2006 23:18Спасибо за хороший компонент.
Наблюдал следующие косячки:
1. При удалении всех строк (Lines.Clear) строчки остаются на экране. Надо вручную вызвать Repaint. Кроме того, не изменяется позиция курсора (т.е. если курсор стоял в 10:5, то эти цифры не изменятся).
2. Не знаю, глюк или нет - но в пустом memo набрать ничего не получается. Надо вставить строку программно, после этого можно что-то набирать.
Мне надо использовать компонент не для подстветки синтаксиса теста на языке программирования, а для подстветки жестко структурированного лога. Соответственно, я решил переопределить ф-цию ParseLine и ParseLineEx класса TMPSyntaxParser (они кстати объявлены виртуальными). Но не смог подключить свой производный класс к компоненту. Пришлось добавить
TMPSyntaxParserClass = class of TMPSyntaxParser;
TMPCustomSyntaxMemo = class(TCustomControl)
private
fSPFactory : TMPSyntaxParserClass;
....
property SPFactory : TMPSyntaxParserClass read fSPFactory write fSPFactory;
constructor TMPCustomSyntaxMemo.Create(AOwner: TComponent);
var F: TFont;
begin
inherited Create(AOwner);
fSPFactory := TMPSyntaxParser;
....
и все обращения к конструктору делать через fSPFactory. Может конечно я не заметил уже имеющегося способа подключить свой парсер? |
|
09-12-2006 18:54сообщение от автора материала Там есть некоторые недоделки, связанные с одной строкой при подобной прокрутке и при нажатии Enter если курсор располагается в последней строке текста, если она последняя на экране. Тогда курсор вообще пропадет.
З.Ы. Еще раз повторюсь, что версия сырая, но времени так и нет - раньше февраля обновление не обещаю =( |
|
09-12-2006 14:45Как я понимаю, это глюк:
1) Запускаем тестовую программу, разворачиваем на весь экран (Чтобы тестовый пример полностью помещался в окне).
2) Передаем фокус компоненту (например, щелкаем мышью).
3) Нажимаем Alt+Вниз - текст прокручивается вверх (только на одну строку).
Вопрос - Почему прокручивается текст, который целиком помещается в окне?
Если текст и должен прокручиватся, то почему скролбары Disabled и почему только на одну строку? (Например, редактор Delphi позволяет прокручивать текст, который и так помещается в окне)
P.S. Если я немного непонятно написал, то спрашивайте. |
|
24-11-2006 03:50но будет визуальная реализация для этого компонента?
так она-же имеется уже.
Выбираешь в меню Component, Install component, Into new package, выбираешь этот pas файл, указываешь имя packag'a, OK.
Сессия у меня, курсовик - нет времени дописать =)
Удачи в сессии и значит будем ждать stable version! ;-) |
|
23-11-2006 08:13Извениете за глупый вопрос - но будет визуальная реализация для этого компонента? (в Disign Time)
Очень бы хотелось увидеть такую реализацию - реализацию ввиде визуального самостоятельного компонента. |
|
23-11-2006 04:20сообщение от автора материала Сессия у меня, курсовик - нет времени дописать =)
Сейчас версия сырая - есть еще некторые мементы которые нужно исправить и оптимизировать.
Не хотел пока выкладывать, но все-таки сделаю это.
На данный момент компонент требует пакет TNTUnicode (ссылку на сайт "производителя" можно найти на Королевстве). В будущем все необходимые процедуры будут добавлены в сам компонент.
О нововведениях написано в отдельном файле в архиве.
Архив с примером можно найти тут: http://www.sionyx.ru/SyntaxMemoU.zip
|
|
23-11-2006 03:50ждать или не ждать обновленную версию?! :) Сообщение не подписано |
|
11-11-2006 09:03
06-11-2006 05:22Пусть "пролежала полгода тихо", но идея хороша.
И доброго здоровья автору (авторам) за то что все же возращаются к этой теме.
Три года использую в своем приложении SynEdit. И постоянно ищу ему замену.
Всем он хорош, только вяло продвигается и масса недоделок. До смешного доходит: нет, например, метода, с помощью которого можно было бы вставлять куски текста в редактируемый текст (не через clipboard - это то есть, конечно). Самому доделывать приходится.
А вот чего нет в обсуждаемом компоненте (насколько я понял, просмотрев исходники) по сравнению с SynEdit, - это возможности так называемого Completion proposal, как в Дельфи, когда при определенных условиях выскакивает окно с перечнем возможных продолжений набираемого кода.
Без этой фичи редактор много теряет, во всяком случае, в моем приложении это используется и очень даже. |
|
02-11-2006 06:46сообщение от автора материала Что-то все последнее время заинтересовались компонентом - даже удивительно - полгода пролежал практически тихо =)
На самом деле есть уже обновленная версия, но не опубликованная. Я ее еще разок посмотрю, применю апдейты, которые тут были предложены и опубликую ближайшее время.
Тогда можно будет обсуждать, что еще сделать... |
|
02-11-2006 06:37Сам не большой спец... Но вот попробовал юзать и...
Есть такой ГЛЮК!
Ставим курсор в нижнюю видимую строку текста, жмем ENTER и ... ужас куда делся курсор???
Может кто таблетку уже написал?
Подскажите.
|
|
25-10-2006 08:10А не могли бы вы здесь подробно описать как можно исспользовать этот компонент в другом проете. А именно:
- как подключить модуль в качестве объекта который бы отображался на тулбаре - ComponentPalete, в дельфе (просто нету ни .dpk не .bpl файлов) и возможно ли это в принципе?
- не помешало бы добавить Функцию PosEx в сам юнит (для тех у кого 6 дельфа - чтоб не мучиться и не искать\добавлять эту функцию отделно)
- и хотелось бы увидеть какой ниб простой текстовый файлик с хелпой - для начинающих программистов (типа меня), который бы прояснил пару скользких моментов - как исспользовать этот компонент в своем проекте.
Извените если написал сообщение не в то место... просто здесь его я надеюсь точно заметят :-)
|
|
25-10-2006 03:19Было бы неплохо:
1) иметь возможность отключать работу с брейкпойнтами
2) реализовать Redo (наверное, можно использовать уже имеющийся в компоненте механизм Undo, но заносить новый элемент в список отмен при вызове метода Undo)
3) иметь возможность сохранять данные в буфере в формате CF_RTF или CF_HTML (думаю, будет лучше, если это будет отдельный метод)
4) При увеличении размера шрифта прямоугольник, символизирующий свёрнутость секции, отрисовывается не слишком красиво |
|
16-10-2006 03:47Думаю, надо по аналигии с MPSyntaxMemo.Range.CanUndo добавить
MPSyntaxMemo.range.CanPaste: Boolean возвращающий true, если есть что вставить из
буфера обмена и данные в нем имеют правильный формат (CF_TEXT или CF_SYNTAX). |
|
10-10-2006 12:311)
А компонент та течёт!!!
В TMPSynMemoStrings, производном от TStringList кроме строк также хранятся объекты (Objects[i]),
которые при уничтожении не удаляются.
Solution:
destructor Destroy; override;
destructor TMPSynMemoStrings.Destroy;
var
i: Integer;
begin
for i := Count - 1 downto 0 do
Objects[i].Free;
inherited;
end;
2)
Если кто-то видел кроме меня, отзовитесь:
В Windows Vista RC1 при загрузке проекта с TMPSyntaxMemo, а также при запуске приложения
возникает "Range Check Error" - судя по Call Stack в Delphi 2006 где-то внутри системы.
При динамическом создании компонента проблем нет.
Sorry, сейчас у меня нет времени на более глубокое исследование проблемы, но у кого есть Vista проверьте. |
|
19-08-2006 06:31сообщение от автора материала В компоненте используется режим, аналогичный "smart tab" в Дельфи. Обычный режим, когда делает смещение на фиксированые расстояния я пока не знаю как сделать, но посмотрю.
Спасибо всем откликнувшимся.
Вскоре постараюсь внести поправки, реализовать некоторые пожелания.
Если у кого-то есть какие-то доработки или пожелания на доработки - присылайте.
Еще вопрос - если кто-то реализовавыл работу с BreakPoints - удобно ли? Может что-то исправить/дополнить? |
|
18-08-2006 05:07Все понравилось, вот только не хватает "полной" поддержки символов TAB (#9). Т.е. чтобы они правильно отображались (сейчас отображаются как один пробел) и при вводе сохранялись в исходном виде а не заменялись пробелами.
|
|
01-08-2006 10:01По поводу проблемы с отрисовкой предлагаю изменить пару методов:
function TMPCustomSyntaxMemo.IsLineVisible(const Row: Integer; const PScreenRow: PInteger = nil): Boolean;
var sr: Integer;
begin
sr := RangeRowToScreenRow(Row);
Result := InRange(sr, 0, ClientLines - 1);
if Assigned(PScreenRow) then
PScreenRow^ := sr;
end;
procedure TMPCustomSyntaxMemo.NeedReDrawLE(const Row: Integer);
var Index: Integer;
begin
if Parent = nil then Exit;
LogFmt('Memo.NeedRedrawLE %d', [Row]);
if IsLineVisible(Row, @Index) or (Index<0) then
begin
if Index<0 then Index := 0;
while Index <= High(fScreenLines) do begin
fScreenLines[Index] := True;
Inc(Index);
end;
end;
ReDraw;
end;
Кто заинтересован, прошу проверить не отвалилось ли что еще.
Вообще вещь хорошая! |
|
27-07-2006 03:41Как и у компонента-прародителя (см. последнее сообщение в обсуждении http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=1148)
свойство Color не сохраняет в dfm значение clWindow, из-за чего цвет компонента после запуска программы становится таким же как у его родителя.
Для лечения необходимо опубликовать свойство ParentColor:
property ParentColor default False;
и внести в конструктор строку:
ParentColor := False; |
|
28-06-2006 02:02Установка опции Ovwerwrite не изменяет режима ввода текста |
|
22-06-2006 13:08Очень хорошая наработка:) Думаю, проект должен и даже обязан развиваться. Можно внести еще ряд полезных нововведений. Автору респект. За переделку отдельный респект:) Подчеркивание волнистой линией - отличное нововведение;) В синэдите такого не видел. |
|
21-06-2006 07:59Есть еще проблемы с отрисовкой. Иногда она лажает. В чем дело - не очень понятно, глубоко не копал. Пришлось ставить вот такую некрасивую заплатку. Так текст перерисовывается весь.
procedure TMPCustomSyntaxMemo.ReDraw;
var i: Integer;
begin
if (Parent = nil) or (Lines.UpdateCount > 0) then Exit;
HideCaret;
for i := Low(fScreenLines) to High(fScreenLines) do
begin
PaintLineEx3(i, FindVisibleRow(OffsetY, i, False));
fScreenLines[i] := False;
end;
ShowCaret;
end;
|
|
|
|