Модераторы: Vitalik

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SynEdit2.0.3stable + CodeFolding(MyStix0.31), совместный пакет 
:(
    Опции темы
Vitalik
Дата 1.7.2006, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Гм.. Там какая-то запара с этим объектом TSynEditCodeFoldingPlugin.. 
Закоментил все, что его касается этого "плагина" и заработало нормально..

P.S. Жаль, что изменения становятся видными только после переустановки компонента.. smile 
PM MAIL WWW ICQ YIM   Вверх
Vitalik
Дата 2.7.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Цитата(Sep. @  25.5.2006,  13:05 Найти цитируемый пост)
Неверное положение хинта на экране при наведении мышки на [...] (//###mod wrong place on hint over [...])

Гм.. Я бы тот код
Код
FoldRange.HintMarkLeft := ((nTokenPos + nTokenLen) * CharWidth)
заменил не на 
Код
FoldRange.HintMarkLeft := ((nTokenPos - 5) * CharWidth)
а на 
Код
FoldRange.HintMarkLeft := ((nTokenPos - 9) * CharWidth) + Gutter.Width
Так у меня лучше работает.. 
Но опять же все это только на вскидку, цифра "9" подобрана также как и, я думаю, "5" - опытным путем, а не путем логических изысканий... smile 
PM MAIL WWW ICQ YIM   Вверх
Sep.
Дата 2.7.2006, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: 6
Всего: 6



Цитата(Vitalik @  2.7.2006,  13:35 Найти цитируемый пост)
Неверное положение хинта на экране при наведении мышки на [...] (//###mod wrong place on hint over [...])

Это немного не тот мод. Тот о котором идет речь - это:
Переместить [...] между откр. и закр. тегами при фолдинге строки (//###mod pos of [...] to left)
и он находится в категории улучшения, т.е. мод чисто для себя =)
Работает правильно когда стоит Gutter.Autosize=true и Gutter.DigitCount=2
Цифра 5 там стоит потому как я ниже в строке 11282 добавляю 5 пробелов и на их место значек [...] и выводится
Код

Lines[FromLine-1] := Lines[FromLine-1] + '     '; //###mod pos of [...] to left

Если поставить Gutter.DigitCount=8 то конечно положение значка [..] неверно. Можно конечно дописать там еще
Код

+((Gutter.DigitCount - 2)*Charwidth) 

но это будет корректно только если ширина шрифта на гуттере такая же, как и в зоне редактирования. А как узнать ширину шрифта на гуттере не известно.
Короче говоря, одноразовый это мод...для себя делался. =) 
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Sep.
Дата 8.7.2006, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: 6
Всего: 6



Т.к. в версии 2.0beta появилась возможность получить аттрибуты подсветки для любой позиции в тексте, то теперь можно доработать GetMatchingBracketEx. Чтобы парная скобка не была найдена внутри коментария или строковой переменной. 
Код

                  if (Test = BracketInc) or (Test = BracketDec) then
                  begin
                    if GetHighlighterAttriAtRowCol( p, vDummy, attr ) then
                     // isCommentOrString:=                                                          //###mod bracket search improve
                     //  (attr = Highlighter.StringAttribute) or (attr=Highlighter.CommentAttribute) //###mod bracket search improve
                     begin                                                                           //
                       attr.Name:=LowerCase(attr.Name);                                              //
                       if (pos('remark',attr.Name)<>0 )or                                            //
                          (pos('string',attr.Name)<>0 )or                                            //
                          (pos('comment',attr.Name)<>0)then isCommentOrString:=true                  //
                       else isCommentOrString:=false;                                                //
                     end                                                                             //###mod bracket search improve
                    else isCommentOrString:=false;
                    if (Test = BracketInc) and (not isCommentOrString) then
                      Inc(NumBrackets)
                    else if (Test = BracketDec) and (not isCommentOrString) then

... и чуть ниже еще раз

                  if (Test = BracketInc) or (Test = BracketDec) then
                  begin
                    if GetHighlighterAttriAtRowCol( p, vDummy, attr ) then
                     // isCommentOrString:=                                                          //###mod bracket search improve
                     //  (attr = Highlighter.StringAttribute) or (attr=Highlighter.CommentAttribute) //###mod bracket search improve
                     begin                                                                           //
                       attr.Name:=LowerCase(attr.Name);                                              //
                       if (pos('remark',attr.Name)<>0 )or                                            //
                          (pos('string',attr.Name)<>0 )or                                            //
                          (pos('comment',attr.Name)<>0)then isCommentOrString:=true                  //
                       else isCommentOrString:=false;                                                //
                     end                                                                             //###mod bracket search improve
                    else isCommentOrString:=false;
                    if (Test = BracketInc) and (not isCommentOrString) then
                      Inc(NumBrackets)

Будет работать если подсветка написана в хорошем тоне как все стандартные, и коментарии там названы как Remark или Comment, a строки как String. 
Сам код для подсветки парных скобок приводился здесь, в нем тоже можно доработать чтобы внутри коментарием даже не начинался поиск парных скобок. 
Но не хватает мне левела чтобы исправить тот же баг с поиском границ фолдинга внутри комментов и строк. Код находится в SynEdit.pas, procedure ScanUsingFoldRegions. Может кто поглядит из отцов?  

Это сообщение отредактировал(а) Sep. - 9.7.2006, 09:26
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Quadr0
Дата 14.7.2006, 17:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 15.7.2011, 11:36
  Вверх
Sep.
Дата 15.7.2006, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: 6
Всего: 6



Баг с подсказкой по [...]:
Если используете SynCompletionProposal то после вывода подсказки при наведении мышки на [...] текст в подсказке по Ctrl-Space не ваш а от хинта [...]
Пока решил только полной чисткой InsertList и ItemList. В вашем SynCompletionProposal.onExecute прийдется заново заполнять листы. Если кто знает как решить лучше - велкам =)
Код
 
procedure AfterCollapsedHintCleanUp;
begin
  if Cursor <> crIBeam then
    Cursor := crIBeam;

  if TSynCompletionProposal(fHint).Tag = 1 then
  begin
    TSynCompletionProposal(fHint).Tag := 0;
    TSynCompletionProposal(fHint).CancelCompletion;
    TSynCompletionProposal(fHint).ItemList.Clear;    //###mod clear [...]hint
    TSynCompletionProposal(fHint).InsertList.Clear;  //###mod clear [...]hint
    //Refresh;
  end;
end;
  
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Vitalik
Дата 22.7.2006, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Цитата(Quadr0 @  14.7.2006,  16:59 Найти цитируемый пост)
Цитата(Sep. @  8.7.2006,  18:06 Найти цитируемый пост)
Может кто поглядит из отцов?
Если только Vitalik. У меня сейчас времени просто нет. Попробуй стукнуть ему в асю или лучше в YIM...

У меня к сожалению тоже сейчас нет времени на CodeFolding.. Я ведь в его внутренностях пока что совсем не разбираюсь, а на это нужно определенное время.. smile
А появившееся время очень хочется все же потратить на родной компонент smile 
PM MAIL WWW ICQ YIM   Вверх
Vitalik
Дата 22.7.2006, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Кстати, получилось ликвидировать некоторые утечки памяти в CodeFolding'е! smile
Вроде бы это основные утечки, остались только какие-то совсем небольшие и что самое печальное - непонятные smile

Файл SynEdit.pas

Код
destructor TCustomSynEdit.Destroy;
var
  i: integer;
begin
  //### Code Folding ###
  fCodeFolding.Free(); //###mod memory leak
  fAllFoldRanges.Free;
...
end

Код
procedure TCustomSynEdit.ReScanForFoldRanges;
var
...
begin
...
  TemporaryAllFoldRanges := fAllFoldRanges;
  TemporaryAllFoldRanges.Clear;
  fAllFoldRanges := TSynEditAllFoldRanges.Create;
  ScanForFoldRanges(fAllFoldRanges, TemporaryLines);
  FreeAndNil(TemporaryLines); //###mod memory leak
  TemporaryAllFoldRanges.Ranges.Assign(fAllFoldRanges.Ranges);
...
end

Код
procedure TCustomSynEdit.ScanForFoldRanges(
  var TopFoldRanges: TSynEditAllFoldRanges; Strings: TStrings);
var
...
  procedure ScanUsingFoldRegions(FoldRegions: TFoldRegions;
    ParentRegion: TFoldRegionItem);
  begin
  ... //большой кусок кода
  end;
begin
...
  if (CodeFolding.HighlighterFoldRegions) and (Assigned(Highlighter)) then
    ScanUsingFoldRegions(Highlighter.FoldRegions, nil)
  else
    ScanUsingFoldRegions(CodeFolding.FoldRegions, nil);

  Parents.Free(); //###mod memory leak
end;


Файл SynEditCodeFolding.pas

Код
//###mod functions for clearing and freeing list and it's items
procedure ClearList(var List: TList);
var i: Integer;
begin
  if not Assigned(List) then Exit;
  for i := 0 to List.Count-1 do TObject(List[i]).Free();
  List.Clear();
end;

procedure FreeList(var List: TList);
var i: Integer;
begin
  if not Assigned(List) then Exit;
  for i := 0 to List.Count - 1 do TObject(List[i]).Free();
  FreeAndNil(List);
end;
//###mod functions for clearing and freeing list and it's items


Код
procedure TSynEditAllFoldRanges.ClearAll;
begin
  //###mod memory leaks
  //fAllRanges.Clear;
  ClearList(fAllRanges);
  //###mod memory leaks
end;

...

destructor TSynEditAllFoldRanges.Destroy;
begin
  //###mod memory leaks
  //fAllRanges.Free();
  FreeList(fAllRanges);
  //###mod memory leaks
  inherited;
end;
 
PM MAIL WWW ICQ YIM   Вверх
Sep.
Дата 22.7.2006, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: 6
Всего: 6



2Vitalik
Мегареспект за исправление утечек памяти!

Версия от 22.07
Включает все предыдущиеисправления в этой теме плюс:
  • //###mod IndentGiudes calculation fix
    Исправление расчета положения подсказки по отступу.
  • //###mod collapsed line edit
    запрет редактирования свернутой строки
  • //###mod <40 lines in hint
    В хинте появляющемся при наведении мышки на [..] не более 40 строк
  • //###mod change cursor on [..]
    Смена курсора мышки когда она наведена на [..] на вопросительный
  • //###mod wrong place of hint over [...]
    Наконец смог правильно расположить хинт по [...] ! =)
  • //###mod black frame around [...] и //###mod black dots in [...]
    Сбивался при некоторых настроках цвет значка [..] и он выводился цветом RightMargin
  • //###mod IndentGiudes change highlight
    подсветка отступа подсвечивается пожирней
  • //###mod select yo
    Даблклик на слове в котором есть Ё или Й не выделял слово целиком.
  • //###mod caret beyond EOL
    В свернутой строке при CursorBeyondEOL и курсоре стоящем за концом строки по нажатию Enter строка не переносилаь
  • //###mod collapse current - moves cursor
    Когда выполяется CollapseCurrent то курсор встает на свернутую строку
К сожалению делал еще какие то исправления но не обозначил их =(. Диффом пройтись лень, если кто найдет то отпишитесь и я обьясню для чего это было.
Качаем там же  

Это сообщение отредактировал(а) Sep. - 22.7.2006, 23:00
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
Vitalik
Дата 23.7.2006, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Цитата(Vitalik @  22.7.2006,  20:51 Найти цитируемый пост)
Вроде бы это основные утечки, остались только какие-то совсем небольшие и что самое печальное - непонятные

Ура! Теперь и с этими утечками покончено! smile
Они оказались зашитыми в PChar и GetMem smile

Файл SynEditCodeFolding.pas

Код
  TSkipRegionItem = class(TCollectionItem)
  private
  ...
  public
    destructor Destroy(); override; //#mod memory leak
    property Open: PChar read fOpen write SetOpen;

Код
destructor TFoldRegionItem.Destroy;
begin
  //#mod memory leak
  if fOpen <> nil then FreeMem(fOpen);
  if fClose <> nil then FreeMem(fClose);
  if fRegExpOpen <> nil then FreeMem(fRegExpOpen);
  if fRegExpClose <> nil then FreeMem(fRegExpClose);
  //#mod memory leak
  fSubFoldRegions.Free;
  inherited;
end;

Код
function TFoldRegions.Add(AType: TFoldRegionType; AAddEnding,
    ANoSubFoldRegions, AWholeWords: Boolean; AOpen, AClose: PChar;
  AParentRegion: TFoldRegionItem): TFoldRegionItem;
begin
  ...
  //#mod memory leak
  //GetMem(Result.fOpen, StrLen(AOpen) + 1);
  //StrCopy(Result.fOpen, AOpen);
  Result.Open := AOpen;
  //GetMem(Result.fClose, StrLen(AClose) + 1);
  //StrCopy(Result.fClose, AClose);
  Result.Close := AClose;
  //#mod memory leak

  Result.fParentRegion := AParentRegion;
end;

Код
procedure TFoldRegionItem.SetClose(const Value: PChar);
begin
  if fClose <> nil then FreeMem(fClose); //#mod memory leak
  GetMem(fClose, StrLen(Value) + 1);
  StrCopy(fClose, Value);
end;

Код
procedure TFoldRegionItem.SetOpen(const Value: PChar);
begin
  if fOpen <> nil then FreeMem(fOpen); //#mod memory leak
  GetMem(fOpen, StrLen(Value) + 1);
  StrCopy(fOpen, Value);
end;

Код
procedure TFoldRegionItem.SetRegExpClose(const Value: PChar);
begin
  if fRegExpClose <> nil then FreeMem(fRegExpClose); //#mod memory leak
  GetMem(fRegExpClose, StrLen(Value) + 1);
  StrCopy(fRegExpClose, Value);
end;

Код
procedure TFoldRegionItem.SetRegExpOpen(const Value: PChar);
begin
  if fRegExpOpen <> nil then FreeMem(fRegExpOpen); //#mod memory leak
  GetMem(fRegExpOpen, StrLen(Value) + 1);
  StrCopy(fRegExpOpen, Value);
end;

Код
procedure TSkipRegionItem.SetEscape(const Value: PChar);
begin
  if fEscape <> nil then FreeMem(fEscape); //#mod memory leak
  GetMem(fEscape, StrLen(Value) + 1);
  StrCopy(fEscape, Value);
end;

Код
destructor TSkipRegionItem.Destroy(); //#mod memory leak
begin
  if fOpen <> nil then FreeMem(fOpen);
  if fClose <> nil then FreeMem(fClose);
  if fEscape <> nil then FreeMem(fEscape);
end;


Но должен заметить, что если CodeFolding проглючит и безвозвратно потеряется скрытый текст, то произойдут утечки.. 
Но я думаю это именно баг CodeFolding'а и с его исправлением исчезнут и утечки smile

Добавлено @ 11:54 
Вот еще забыл:

Файл SynEdit.pas

Код
procedure TCustomSynEdit.InitCodeFolding;
var
  fr: TFoldRegions;
  
  procedure MakeFRCaseInsensitive(aFoldRegions: TFoldRegions);
  var
    i: Integer;
  begin
    begin
      if aFoldRegions[i].SubFoldRegions.Count > 0 then
        MakeFRCaseInsensitive(aFoldRegions[i].SubFoldRegions);

      //#mod memory leak (indirect)
      //aFoldRegions[i].Open := StrUpper(aFoldRegions[i].Open);
      //aFoldRegions[i].Close := StrUpper(aFoldRegions[i].Close);
      StrUpper(aFoldRegions[i].Open);
      StrUpper(aFoldRegions[i].Close);
      //#mod memory leak
      ...
    end;
  end;
...
 
PM MAIL WWW ICQ YIM   Вверх
Vitalik
Дата 23.7.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12



Sep., а тебе мегареспект за:

Цитата(Sep. @  22.7.2006,  21:59 Найти цитируемый пост)
//###mod select yo
Даблклик на слове в котором есть Ё или Й не выделял слово целиком.

user posted image

Очень уж досадный баг был smile 
PM MAIL WWW ICQ YIM   Вверх
Vitalik
Дата 1.8.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Координатор проекта
Сообщений: 653
Регистрация: 8.11.2004
Где: Ukraine, Kharkov

Репутация: 9
Всего: 12




M
Vitalik
English part of this discussion was moved to the new subject "SynEdit2.0.3stable + CodeFolding(MyStix0.31) [ENG]".
That subject was created specially for english-speaking users ;-)


Это сообщение отредактировал(а) Vitalik - 2.8.2006, 11:51
PM MAIL WWW ICQ YIM   Вверх
SergV
Дата 4.8.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



Извиняюсь если не туда. У меня проблемма с этим SynEdit2.0.3, пока в дельфине запускаю, всё работает, но стоит закрыть, и запустить ексешник, всё работает до момента сохранения, и попытке открыть новый документ, на этом прога просто вылетает без предупреждения. С темже кодом и стандартным TRichEdit без проблем. Код стандартный для сохранить как, 
Код

procedure TForm1.FileSaveAs1Accept(Sender: TObject);
begin
memo1.Lines.SaveToFile(FileSaveAs1.Dialog.FileName);
end;

да вот ток, чтот не так. Могу открыть хот 100 раз документ без сохранения, но достаточно одного раза с сохранением и всё.
Думал проблемма в компаненте с сайта производителей, посмотрел тут у вас, вы его вовсю правите этот набор, скачал от вас, переустановил, нечего не изменилось. В чём может быть проблемма, у меня Delphi 2005.
PM   Вверх
Sep.
Дата 5.8.2006, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 22.7.2004

Репутация: 6
Всего: 6



версия от 04.08.06
 * улучшено редактирование около свернутой строки    (DavidCl0nel)
 * добавлены исправления утечек памяти (Vitalik)
 * убран лишний индент строк (от 2 до 4 пробелов в начале каждой строки)
 * стирание свернутой строки если она была в выделении
 * при выключении кодфолдинга выполняется UncollapseAll (DavidCl0nel)
 по старому адресу
 
 
Цитата

 В чём может быть проблемма, у меня Delphi 2005.
 

 А если стандартный LightEditor скомпилить который с UniHighlighter идет, или демку с сохранением из дистрибутива SynEdit ? Там тоже сохранение багает? У меня BDS2006 - все ок.
--------------------
Syn - TotalCommander lister plugin |  SynTree - coders sourcebook  
PM MAIL   Вверх
SergV
Дата 5.8.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 197
Регистрация: 4.8.2006
Где: Германия

Репутация: нет
Всего: 1



Sep., из демок я не всё посмотрел, то что глянул, там небыло сохранения, надо поглядеть остальное.
А UniHighlighter я ещё не пробовал, щас посмотрю что там.
Спасибо за наводку.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | SynUniHighlighter и SynEdit | Следующая тема »


 




[ Время генерации скрипта: 0.1915 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.