[ Delphi / Pascal ] — начинающим: задаем вопросы

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by begin_end, 28 Apr 2015.

  1. rtyy

    rtyy Member

    Joined:
    8 Mar 2008
    Messages:
    12
    Likes Received:
    7
    Reputations:
    -2
    Code:
    ...
    for i:=1 to length(banned) do
     str:=str+banned[i];
    showmessage(str);
    ...
     
    triblekill likes this.
  2. rtyy

    rtyy Member

    Joined:
    8 Mar 2008
    Messages:
    12
    Likes Received:
    7
    Reputations:
    -2
    Code:
    ...
    for i:=1 to length(banned) do
     str:=str+banned[i];
    showmessage(str);
    ...
     
  3. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Не работает
    Code:
    str:=str+banned[i];
    Array type required
     
  4. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Кто вас учил тому, что set=array? o_O
    Конечно не работает, человек не видит разницы между двумя разными типами элементов.
     
    crystalbit and vasykas like this.
  5. vasykas

    vasykas Banned

    Joined:
    7 Mar 2011
    Messages:
    963
    Likes Received:
    137
    Reputations:
    37
  6. rtyy

    rtyy Member

    Joined:
    8 Mar 2008
    Messages:
    12
    Likes Received:
    7
    Reputations:
    -2
    Конечно не вижу, у меня компилятора под рукой нет. )
    Во всяком случае, объявляется как массив.
    Тут нужна конструкция наподобие "For each".
    Посмотрим что за "наборы" такие хитрые...
     
  7. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Прежде чем давать глупые советы, изучите для начала, как объявляются массивы.
     
  8. crystalbit

    crystalbit Elder - Старейшина

    Joined:
    6 Jun 2008
    Messages:
    212
    Likes Received:
    88
    Reputations:
    8
    Могу предложить задавать banned строкой const banned='!@#$%^&*()' и условие Edit1.Text in banned заменить на Pos(Edit1.Text, banned)<>0.
    Если в дальнейшем нужно будет заменять не по одному символу, то лучше так не делать
     
    #28 crystalbit, 18 Jun 2015
    Last edited: 18 Jun 2015
  9. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Да вот в том то и дело что пришлось отказаться от:
    Code:
    for i:=1 to Length(Edit2.text) do
    str:=StringReplace(str,Edit2.text[i],'+',[rfReplaceAll, rfIgnoreCase]);
    
    А мудрения с if я не пойму:
    Code:
    for i:=1 to Length(Edit7.text) do
      if Edit6.Text[i] = Edit7.text
      then str:=Edit7.Text+'Sym'
      else str:=Edit6.Text+Edit6.Text[i];
    Edit1.text:=str;
     
  10. rtyy

    rtyy Member

    Joined:
    8 Mar 2008
    Messages:
    12
    Likes Received:
    7
    Reputations:
    -2
    Тьфу ты. Ну конечно, запутали в конец...
    Тут никаких set'ов не нужно.
    Всё делается простым регэкспом.
     
  11. rtyy

    rtyy Member

    Joined:
    8 Mar 2008
    Messages:
    12
    Likes Received:
    7
    Reputations:
    -2
    Code:
    var RE: variant;
    begin
    re:= CreateOLEObject("VBScript.RegExp");
    re.global :=true;
    re.pattern := '^[0-9]'; //подгоните шаблон как вам надо
    Showmessage (re.replace ( text1.text, 'Sym'));
    
    примерно так.
     
  12. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Да не vb script ну зачем антивирусы ещё ругаться будут !
     
  13. rtyy

    rtyy Member

    Joined:
    8 Mar 2008
    Messages:
    12
    Likes Received:
    7
    Reputations:
    -2
    А где вы сдесь вбскрипт увидели?
    :facepalm:
     
  14. crystalbit

    crystalbit Elder - Старейшина

    Joined:
    6 Jun 2008
    Messages:
    212
    Likes Received:
    88
    Reputations:
    8
    Code:
    const banned='!@#$%^&*()';
    ........
    str:='';
    for i:=1 to Length(Edit7.text) do
      if Pos(Edit7.Text[i], banned)<>0 then
        str:=str.Text+'Sym'
      else
        str:=str+Edit7.Text[i];
    Edit7.text:=str;
    Лучше б ты поднапрягься и понял суть) У тебя хрень написана совсем не логичная
     
  15. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Дело в том что мне не надо const мне надо чтобы это брало из edit1.text !
     
  16. crystalbit

    crystalbit Elder - Старейшина

    Joined:
    6 Jun 2008
    Messages:
    212
    Likes Received:
    88
    Reputations:
    8
    Ну дык замени banned на Edit1.Text
     
  17. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Изначально правильно поставленный вопрос, содержит в себе половину ответа.
    Вот тебе готовая функция:
    PHP:
    function CheckSym(Filter,Str:string):string;
    var
    i,j:integer;
    begin
      
    for i:=1 to length(Filter) do
      for 
    j:=1 to length(Str) do
      If 
    Str[j]=Filter[i]
      
    Then begin
      Delete
    (Str,j,1);
      
    Insert('SYM',Str,j);
      
    end;
      
    Result:=Str;
    end;
    Во вложенном цикле, каждый символ строки Str, прогоняется по фильтру Filter и при совпадении, символ удаляется, а на его место записывается SYM
    Юзать надо так:
    PHP:
    Edit2.Text:=CheckSym(Edit1.TextEdit2.Text);
    Edit1 - содержит запрещенные символы
    Edit2 - содержит проверяемую строку
     
    triblekill likes this.
  18. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
  19. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Есть ещё одна проблема которую никак не могу придумать как решить:
    Code:
    var
    Filter,str:string;
    i,j:integer;
    begin
    str:=Edit6.text;
    filter:=Edit7.text;
      for i:=1 to length(Edit6.text) do
      for j:=1 to length(Edit6.text) do
      If Edit6.text[j]=Edit7.text[i]
      Then begin
      Delete(Edit6.text,j,1);
      Insert('.',Str,j);
      end;
      Edit1.text:=str;
    end;
    
    Delete(Edit6.text,j,1);>
    Constant object cannot be passed as var parameter
    Дело в том что в программе задумывается несколько таких условий только замена происходит разными символами ! А под каждый Edit очень не хочется string писать:
    Code:
    var
    s:string;
    str:=Edit1.text;
    Delete(str,j,1);>
     
  20. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Именно поэтому замена символов была выведена мной в отдельную функцию. Не вижу никакой проблемы.