Вверх ↑
Пакеты 
HiAsm4
Windows 
Компоненты 
Cтpoки 
Замена - MultiReplace

MultiReplace
Краткое описание
  Компонент предназначен для множественной замены в тексте
Параметры
  • ReplaceList - Список замен по умолчанию
  • Delimiter - Разделитель элементов в каждой строке замены
  • EndSymbol - Символ окончания каждой строки замены
  • EnterTag - Тег замещения перевода строки для мультистрочных замен
  • Mode - 1-Way - однопроходный режим (режим последовательных замен, не исключает возникновение эффекта "замена в замене"); 2-Way - двухпроходный режим (режим независимых замен, исключает возникновение эффекта "замена в замене")
  • Методы
  • doMultiReplace - Начинает множественную замену в тексте ARG(Text, ReplaceList)
  • События
  • onResult - Событие происходит всякий раз после окончания множественной замены, выдавая полученный текст в поток ARG(Text)
  • Свойства
  • Result - Содержит результат множественной замены
  • Данные
  • Text - Текст для множественной замены
  • ReplaceList - Список замен
  • Пример
      Пример транслита с русского языка на английский язык

    
    Add(MainForm,2953706,252,385)
    {
    Width=505
    Height=516
    }
    Add(TimeCounter,3921649,427,357)
    {
    Precision=1
    link(onStop,2437858:doText,[])
    }
    Add(Hub,13279769,203,434)
    {
    link(onEvent1,3921649:doStart,[(230,440)(230,363)])
    link(onEvent2,13466306:doMultiReplace,[])
    }
    Add(Hub,9957346,378,441)
    {
    link(onEvent1,3921649:doStop,[(406,447)(406,370)])
    link(onEvent2,8892279:doText,[])
    }
    Add(Label,2437858,483,364)
    {
    Left=90
    Top=10
    Caption=""
    }
    Add(StrList,13260997,308,371)
    {
    FileName="License.txt"
    Strings=#47:







    ==|40: HiAsm 4.04 build 184|47:







    ==|24:  Лицензионное соглашение|092: Программа HiAsm (в дальнейшем "Программный продукт") создан Dilma (в дальнейшем "Автор").|90: Настоящим лицензионным соглашением удостоверяются права на "Программный продукт" Dilma.|111: "Программный продукт" "Автора" предназначен для конструирования программ без знаний языков программирования.|413: Программа распространяется по принципу "AS IS", что значит, что при правильном или неправильном использование программы "Автор" ответственности не несет. Вы устанавливаете программу под свою ответственность. За ВСЕ сбои после установки программы "Автор" ответственности не несет. Вы устанавливаете программу на свой страх и риск, хотя "Автором" было сделано все возможное, чтобы ошибок, сбоев, поломок не было.|103: Программа распространяется по принципу "Freeware", что означает, что программа абсолютно бесплатная.|107: По всем вопросам и предложениям связанным с программой, а также недоработках, просьба сообщать "Автору".|2: |55: Домашняя страница в Интернете: http://www.hiasm.com|56: Электронная почта проекта (E-Mail): hiasm@hiasm.com|039: "Автор": Dilma - dilma@hiasm.com|0047:







    [tab]Формат строки замены в списке замен: [color=#000080][b]<Заменяемая строка><Delimiter><Строка1><<Enter> или EnterTag>...<Ст
    Краткое описание
    [tab]Компонент предназначен для множественной замены в тексте
    Параметры
    [*] [color=blue]ReplaceList[/color] - Список замен по умолчанию [*] [color=blue]Delimiter[/color] - Разделитель элементов в каж
    Методы
    [*] [color=blue]doMultiReplace[/color] - Начинает множественную замену в тексте [color=#008000][b]ARG(Text, ReplaceList)[/b][/co
    События
    [*] [color=blue]onResult[/color] - Событие происходит всякий раз после окончания множественной замены, выдавая полученный текст
    Свойства
    [*] [color=blue]Result[/color] - Содержит результат множественной замены
    Данные
    [*] [color=blue]Text[/color] - Текст для множественной замены [*] [color=blue]ReplaceList[/color] - Список замен
    Пример
    [tab]Пример транслита с русского языка на английский язык [code] Add(MainForm,2953706,252,385) { Width=505 Height=516







    ==|40: HiAsm 4.04 build 184|47:







    ==|24:[tab]Лицензионное соглашение|0:|92: Программа HiAsm (в дальнейшем "Программный продукт") создан Dilma (в дальнейшем "Авт







    ==|
    }
    Add(Button,15343263,140,434)
    {
    Left=15
    Top=10
    TabOrder=-1
    link(onClick,13279769:doEvent1,[])
    }
    Add(Memo,8892279,427,427)
    {
    Left=15
    Top=45
    Width=455
    Height=425
    ScrollBars=2
    }
    Add(MultiReplace,13466306,329,441)
    {
    link(onResult,9957346:doEvent1,[])
    link(Text,13260997:Text,[(335,429)(314,429)])
    link(ReplaceList,14255948:Text,[(342,429)(363,429)])
    }
    Add(StrList,14255948,357,371)
    {
    Strings=#53:а=a; б=b; в=v; г=g; д=d; е=e; ё=yo; ж=zh; з=z;|53:и=i; й=y; к=k; л=l; м=m; н=n; о=o; п=p; р=r;|56:с=s; т=t; у=u; ф=f; х=h; ц=c; ч=ch; ш=sh; щ=shch;|53:ь='; ы=q; ъ='; э=ye; ю=yu; я=ya; А=A; Б=B; В=V;|53:Г=G; Д=D; Е=E; Ё=Yo; Ж=Zh; З=Z; И=I; Й=Y; К=K;|53:Л=L; М=M; Н=N; О=O; П=P; Р=R; С=S; Т=T; У=U;|53:Ф=F; Х=H; Ц=C; Ч=Ch; Ш=Sh; Щ=Shch; Ь='; Ы=Q; Ъ=';|17:Э=Ye; Ю=Yu; Я=Ya;|
    }

    Список замен для транслита с английского языка на русский язык
    
    #sha
    

    Add(StrList,4872241,315,357)
    {
    @Hint=#17:translit en -> ru|
    Strings=#9:shch = щ;|11:tsya = тся;|12:dniy = дный;|10:aya = ая;|10:iya = ия;|10yu = ою;|10ya = оя;|11:tst = тст;|11:tsk = тск;|9:tch = ч;|11:dya = дья;|11:tya = тья;|10yo = оё;|11:liy = лый;|10:nb = нь;|9:ya = я;|9:yo = ё;|9:yu = ю;|9:ja = я;|10:je = же;|10:ju = жу;|10:ji = жи;|9:kh = х;|9:zh = ж;|9:ts = ц;|9:tz = ц;|9:tc = ц;|9:ch = ч;|9:sh = ш;|10:zj = зь;|10:ay = ай;|10:ey = ей;|10:iy = ий;|10y = ой;|10:uy = уй;|10:yy = ый;|9:q = к;|9:w = в;|9:e = е;|9:r = р;|9:t = т;|9:y = ы;|9:u = у;|9:i = и;|9 = о;|9:p = п;|9:a = а;|9:s = с;|9:d = д;|9:f = ф;|9:g = г;|9:h = х;|9:j = й;|9:k = к;|9:l = л;|9:z = з;|10 = кс;|9:c = ц;|9:v = в;|9:b = б;|9:n = н;|9:m = м;|9:' = ь;|
    AddHint(52,-28,84,13,@Hint)
    }

    Замечания
      Формат строки замены в списке замен:
    <Заменяемая строка><Delimiter><Строка1><<Enter> или EnterTag>...<СтрокаN><EndSymbol>.

      Например, где знак "=" - Delimiter, ";" - EndSymbol; "<#13#10>" - EnterTag:

      Однострочная замена:

    Подпись1=Все хорошо, что хорошо кончается;

      Многострочная замена;

    Подпись2=Все течет, все изменяется
    А лучшее, все же - враг хорошего!;
      или
    Подпись2=Все течет, все изменяется<#13#10>А лучшее, все же - враг хорошего!;

      Разрешается писать замены в строку с отделением разделителя и символа окончания пробелами

    а = a; б = b; в = v; г = g; д = d; е = e; ё = yo; ж = zh; з = z;
    и = i; й = y; к = k; л = l; м = m; н = n; о = o; п = p; р = r;

      Для экранирования пробелов в начале или конце блока поиска используется обратная наклонная черта (backslash), например:
      ... \  - экранирование пробелов справа;
      \ ...  - экранирование пробелов слева;
      \ ... \  - экранирование пробелов с обеих сторон. В данных примерах три точки означают любой текст
      Для замены самого символа слеша \ необходимо применить следующую последовательность, состоящую из трех слешей подряд - \\\

      Если требуется замена длинных лексем, содержащие в себе более короткие лексемы, которые также необходимо заменить, то необходимо располагать замену длинных лексем перед короткими. Те расставлять замены в списки надо по мере убывания длины лексем (правило длинных лексем). Например: надо заменить 50 и 5, сначала в списке надо поставить замену 50, а после 5, если же поставить наоборот -- 5 перед 50, то замена 5 приведет к замене 5 в 50 исходного текста, и замена 50 не отработает.

      По умолчанию компонент работает в однопроходном режиме (1-Way), что можно представить себе как работу множества последовательных элементов Replace. В таком режиме работы могут возникать эффекты "замена в замене", тк компонент последовательно заменяет найденные лексемы во всем тексте. К примеру, необходимо сделать вот такую замену -- a = b; b = c; c = d; в строке abc, компонент сначала заменит все a, на выходе получится bbc, после чего заменит все b, на выходе получится ccc, и наконец, производится замена всех c, на выходе получится ddd, что не совсем соответствует ожидаемуому результату. Для исключения возникновения эффекта "замена в замене" необходимо применять двухпроходный режим (2-Way). В таком режиме, в первом проходе, происходит маркирование лексем в исходном тексте, затем , во втором проходе, маркеры меняются на соответствующие замены. Если применить двухпроходный режим к нашему примеру со строкой abc и списком замен a = b; b = c; c = d;, то на выходе получим bcd. Но тут надо учитывать тот факт, что однопроходный режим работает быстрее двухпроходного.

    Внимание! Правило длинных лексем распространяется и на однопроходный, и на двухпроходный режим.

      Пример работы компонента в однопроходном и двухпроходном режиме с эффектом "замена в замене"
    
    Add(MainForm,4056909,112,140)
    {
    Width=565
    Height=400
    Caption="MultiReplace 1&2-Way"
    Position=1
    }
    Add(Button,14455952,112,189)
    {
    Left=245
    Top=335
    TabOrder=-1
    Data=String()
    link(onClick,1935334:doEvent1,[])
    }
    Add(Hub,1935334,175,189)
    {
    link(onEvent1,14699846:doEnum,[])
    link(onEvent2,15583860:doEnum,[(207,202)(207,258)])
    }
    Add(ListBox,12472830,203,91)
    {
    Left=5
    Top=5
    Width=130
    Height=325
    Font=[Courier New,10,0,0,204]
    Strings=#3:1=b|3:1=B|9:cdfghijkl|
    }
    Add(ListBox,14423470,273,91)
    {
    Left=140
    Top=5
    Width=130
    Height=325
    Font=[Courier New,10,0,0,204]
    Strings=#12:1=b~test1=B§|12:1=B~TEST1=b§|4:t~1§|4:e~2§|4:s~3§|4:T~4§|4:E~5§|4:S~6§|4:c~d§|4:d~f§|4:f~g§|4:g~h§|4:h~i§|4:i~j§|4:j~k§|4:k~l§|4:l~m§|0:|0:|
    }
    Add(Label,10866566,105,91)
    {
    Left=275
    Top=5
    Width=268
    Height=17
    Font=[MS Sans Serif,10,1,0,1]
    Caption="1-Way"
    AutoSize=1
    Alignment=2
    }
    Add(Memo,951728,357,189)
    {
    Left=275
    Top=30
    Width=270
    Height=135
    Font=[Courier New,10,0,0,204]
    ScrollBars=3
    }
    Add(ArrayEnum,14699846,217,189)
    {
    link(onItem,10281728:doMultiReplace,[])
    link(Array,10244938:Var2,[])
    }
    Add(MultiReplace,10281728,266,189)
    {
    Delimiter="~"
    EndSymbol="§"
    link(onResult,951728:doAdd,[])
    link(ReplaceList,401679:Var2,[])
    }
    Add(Label,11240987,112,98)
    {
    Left=280
    Top=170
    Width=268
    Height=20
    Font=[MS Sans Serif,10,1,0,1]
    Caption="2-Way"
    AutoSize=1
    Alignment=2
    }
    Add(Memo,11718519,357,252)
    {
    Left=275
    Top=195
    Width=270
    Height=135
    Font=[Courier New,10,0,0,204]
    ScrollBars=3
    }
    Add(ArrayEnum,15583860,252,252)
    {
    link(onItem,7356010:doMultiReplace,[])
    link(Array,10244938:Var3,[(258,159)])
    }
    Add(MultiReplace,7356010,301,252)
    {
    Delimiter="~"
    EndSymbol="§"
    Mode=1
    link(onResult,11718519:doAdd,[])
    link(ReplaceList,401679:Var3,[(314,159)])
    }
    Add(GetDataEx,10244938,217,154)
    {
    link(Data,12472830:Array,[])
    }
    Add(GetDataEx,401679,273,154)
    {
    link(Data,14423470:Text,[])
    }

    Обновление элемента: [svn]MultiReplace.pas[/svn]
    BB-code статьи для вставки
    Всего комментариев: 0
    (комментарии к статье еще не добавлены)
    Комментарий
    ...