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

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

  1. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Не помогло весь мусор убирал потоки прыгают как хотят и всё (
     
    1. Matrix001

      Matrix001 Active Member

      Joined:
      18 Aug 2016
      Messages:
      257
      Likes Received:
      141
      Reputations:
      3
      Есть код на python для "парсинга" заголовка.
      Code:
      import urllib.request urlopen 
      from re import findall as fa #Библиотека регресных выражений
      
      url = "http://ram.by"
      htmltext = urlopen(url).read().decode() #грубо говоря открытие и чтение
      f = fa(r'<title>(.*?)</title>', htmltext) #находит все между тегами title
      for title in f:
        print(title)
      Как парсить на Delphi ? Как работать с регресными выражениями ?
       
      1. spiner

        spiner Member

        Joined:
        8 Jul 2015
        Messages:
        74
        Likes Received:
        56
        Reputations:
        4
        начиная с версии XE:
        Code:
        uses ..., RegularExpressions;
        ..................
        var regex : TRegEx;
            htmltext : string;
            matches : TMatchCollection;
            i : integer;
        begin
        .....
        .....
        regex := TRegEx.Create('<title>(.*?)</title>');
        matches := regex.Matches(htmltext);
          for i := 0 to matches.Count-1 do
            writeln(matches[i].Groups.Item[1].Value);
        
         
        Matrix001 likes this.
        1. triblekill

          triblekill Member

          Joined:
          21 Aug 2011
          Messages:
          351
          Likes Received:
          94
          Reputations:
          1
          Здравствуйте, не могу разобраться Incompatible types: 'Char' and 'String'

          Code:
          function only_alphabets(str:string):string;
          
          var buf:string;
              i:integer;
          begin
          buf:='';
          for i:=1 to length(str) do
            if str[i] in ['a'..'Z'] then buf:=buf+str[i];
          
          Result:=buf;
          end;
          
          var
          R:string;
          int:integer;
          begin
          R[Int]:=only_alphabets(Edit1.text[x.IntVal(Length(sEdit1.text))+1]);
           
          1. #colorblind

            #colorblind Moderator

            Joined:
            31 Jan 2014
            Messages:
            631
            Likes Received:
            245
            Reputations:
            42
            Ни о чем тебе не говорит?
             
            1. triblekill

              triblekill Member

              Joined:
              21 Aug 2011
              Messages:
              351
              Likes Received:
              94
              Reputations:
              1
              Но так задумано
               
              1. #colorblind

                #colorblind Moderator

                Joined:
                31 Jan 2014
                Messages:
                631
                Likes Received:
                245
                Reputations:
                42
                Задумано, что ты букве присваиваешь строку?
                Нельзя впихнуть невпихуемое (с)
                 
                binarymaster likes this.
                1. vasykas

                  vasykas Banned

                  Joined:
                  7 Mar 2011
                  Messages:
                  963
                  Likes Received:
                  137
                  Reputations:
                  37
                  Всем привет.
                  Сильно тормозят обе формы при автозаполнении формы в TWebbrowser...
                  Пробовал из потоков то же самое
                  открываю form2 из form1
                  Code:
                  Form1
                  .....
                   Form2.Show;
                   Form2.BitBtn1Click(Sender);
                  код form2:
                  Code:
                  procedure TForm2.BitBtn1Click(Sender: TObject);
                  var WBThread: TWBThread;
                  begin
                     CoInitialize(nil);
                     Label1.Caption:=Form2NameIP;
                     Form2.Width := Round(Width1 /2.3);
                     Form2.Height := Round(Height1 /1.5);
                      WBThread:=TWBThread.Create(false);
                      WBThread.FreeOnTerminate:=true;
                      WBThread.Resume;
                    CoUninitialize;
                  ...
                  procedure TForm2.WBDocumentComplete(ASender: TObject; const pDisp: IDispatch;
                    const [Ref] URL: OleVariant);
                    var i:integer;
                  begin
                  
                    if (pDisp = CurDispatch) then
                    begin
                        CurDispatch := nil; {ќчищаем временную переменную}
                  
                      html_tag:=WB.OleObject.Document.getelementsbytagname('input');
                      For i:=0 To (html_tag.Length-1) Do
                      Begin
                  
                        If (html_tag.item(i).id='username') Then html_tag.item(i).value:=login;
                         If (html_tag.item(i).id='password') Then html_tag.item(i).value:=password;
                  
                        end;
                      html_tag:=WB.OleObject.Document.getelementsbytagname('button');
                       For i:=0 To (html_tag.Length-1) Do
                      Begin
                  
                        If (html_tag.item(i).id='loginBT') Then html_tag.item(i).click;
                  
                     end;
                       WB.Show;
                     // InvalidateRect(0, nil, True);
                    end;
                  
                  end;
                  
                  procedure TForm2.WBNavigateComplete2(ASender: TObject; const pDisp: IDispatch;
                    const [Ref] URL: OleVariant);
                  begin
                  
                    if CurDispatch = nil then
                      CurDispatch := pDisp; {IDispatch страницы котора¤ грузитс¤}
                       //WB.OleObject.Document.Cookie:=CM.CookieCollection.Cookies[0].ClientCookie;
                      // InvalidateRect(0, nil, True);
                  end;
                  procedure TWBThread.Execute;
                  begin
                    //Synchronize(OpenURL);
                     Form2.WB.Navigate(PChar('http://'+Form2NameIP));
                     Form2.WB.Hide;
                  end;
                  
                  подскажите пж что можно сделать?
                   
                  #308 vasykas, 30 Mar 2018
                  Last edited: 30 Mar 2018
                  1. #colorblind

                    #colorblind Moderator

                    Joined:
                    31 Jan 2014
                    Messages:
                    631
                    Likes Received:
                    245
                    Reputations:
                    42
                    Фризить может где угодно, отладчик в руки и дебажить по строчке. При правильном использовании потоков, WndProc главной формы не может тормозить. Убери все обращения к элементам формы из ThreadProc и проверь.
                     
                    1. triblekill

                      triblekill Member

                      Joined:
                      21 Aug 2011
                      Messages:
                      351
                      Likes Received:
                      94
                      Reputations:
                      1
                      Здравствуйте как поменять у ip предпоследние цифры перед точкой
                      Code:
                      например сделать +4 цифры перед последней точкой:
                      94.130.12.146 //оригинал
                      94.130.16.146 //+4
                      
                      5.189.133.153 //оригинал
                      5.189.137.153 //+4
                      
                      194.243.192.60 //оригинал
                      194.243.196.60 //+4
                      
                       
                      1. r1ddl3

                        r1ddl3 New Member

                        Joined:
                        31 Aug 2017
                        Messages:
                        12
                        Likes Received:
                        2
                        Reputations:
                        0
                        вот тебе идея : сплить по точке и прибавляй к 3 числу +4, потом собирай обратно результат. Насколько я помню, сплита в делфи нету, можешь вместо него использовать регулярку, суть та же
                         
                        1. triblekill

                          triblekill Member

                          Joined:
                          21 Aug 2011
                          Messages:
                          351
                          Likes Received:
                          94
                          Reputations:
                          1
                          Так вот использовал проблема регулярки заключалась что точки 3 и она находит значение между первой и второй точкой
                           
                          1. #colorblind

                            #colorblind Moderator

                            Joined:
                            31 Jan 2014
                            Messages:
                            631
                            Likes Received:
                            245
                            Reputations:
                            42
                            Pos, не?
                             
                            1. spiner

                              spiner Member

                              Joined:
                              8 Jul 2015
                              Messages:
                              74
                              Likes Received:
                              56
                              Reputations:
                              4
                              Code:
                              program Project1;
                              
                              {$APPTYPE CONSOLE}
                              
                              uses
                                System.SysUtils;
                              
                              type
                                TStrArray = array of string;
                              
                              function Explode(Delimiter : string; Str : string) : TStrArray;
                              var s : string;
                              begin
                                SetLength(Result, 0);
                                s := Str;
                                while Pos(Delimiter, s) > 0 do
                                begin
                                  SetLength(Result, Length(Result) + 1);
                                  Result[High(Result)] := Copy(s, 1, Pos(Delimiter, s) - 1);
                                  Delete(s, 1, Pos(Delimiter, s) +Length(Delimiter) - 1);
                                end;
                                SetLength(Result, Length(Result) + 1);
                                Result[High(Result)] := s;
                              end;
                              
                              function Implode(Delimiter : string; Pieces : TStrArray) : string;
                              var i : integer;
                              begin
                                result := '';
                                for i := 0 to High(Pieces) do
                                begin
                                  result := result + Pieces[i];
                                  if i <> High(Pieces) then
                                    result := result + Delimiter;
                                end;
                              end;
                              
                              var ip : string;
                                  a : TStrArray;
                              begin
                                  ip := '94.130.12.146';
                                  writeln(ip);
                                  a := Explode('.', ip);
                                  a[2] := IntToStr(StrToInt(a[2]) + 4);
                                  ip := Implode('.', a);
                                  writeln(ip);
                                  writeln('');
                              
                                  ip := '5.189.133.153';
                                  writeln(ip);
                                  a := Explode('.', ip);
                                  a[2] := IntToStr(StrToInt(a[2]) + 4);
                                  ip := Implode('.', a);
                                  writeln(ip);
                                  writeln('');
                              
                                  ip := '194.243.192.60';
                                  writeln(ip);
                                  a := Explode('.', ip);
                                  a[2] := IntToStr(StrToInt(a[2]) + 4);
                                  ip := Implode('.', a);
                                  writeln(ip);
                                  writeln('');
                                  readln;
                              end.
                              
                               
                              triblekill likes this.
                              1. triblekill

                                triblekill Member

                                Joined:
                                21 Aug 2011
                                Messages:
                                351
                                Likes Received:
                                94
                                Reputations:
                                1
                                Как взять следующую или конечную строку разделённую , ?
                                Code:
                                Source:='123,668,352,1055';
                                Source:=copy(Source,1,pos(',',Source)-1);
                                showmessage(Source); // Только первый символ перед запятой и циклом не выходит :-(
                                
                                 
                                1. binarymaster

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

                                  Joined:
                                  11 Dec 2010
                                  Messages:
                                  4,717
                                  Likes Received:
                                  10,195
                                  Reputations:
                                  126
                                  Изменять исходную строку в while цикле по мере получения значений, например.
                                   
                                  1. triblekill

                                    triblekill Member

                                    Joined:
                                    21 Aug 2011
                                    Messages:
                                    351
                                    Likes Received:
                                    94
                                    Reputations:
                                    1
                                    Нет смотри:

                                    Code:
                                    procedure TForm1.Button1Click(Sender: TObject);
                                    var
                                    R:string;
                                    begin
                                    R:='123,668,352,1055';
                                    while pos(',',R)<>0 do
                                    R:=StringReplace(R, ',',#13#10,[]); // разбиваю на строки
                                    Showmessage(R[1]); // Результат 1 символ первой строки, а мне нужно целиком строки [1] [2] и тд
                                    end;
                                    
                                    А применять memo или tstringlist не хочется
                                     
                                    #317 triblekill, 10 Jun 2018
                                    Last edited: 10 Jun 2018
                                    1. binarymaster

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

                                      Joined:
                                      11 Dec 2010
                                      Messages:
                                      4,717
                                      Likes Received:
                                      10,195
                                      Reputations:
                                      126
                                      В одной строке невозможно иметь несколько строк, создавай массив тогда. Без TStringList не получится просто взять, и разделить текст переносами строк.
                                       
                                      1. triblekill

                                        triblekill Member

                                        Joined:
                                        21 Aug 2011
                                        Messages:
                                        351
                                        Likes Received:
                                        94
                                        Reputations:
                                        1
                                        Ну ты даёшь..
                                         
                                        1. #colorblind

                                          #colorblind Moderator

                                          Joined:
                                          31 Jan 2014
                                          Messages:
                                          631
                                          Likes Received:
                                          245
                                          Reputations:
                                          42
                                          PHP:
                                          program Project2;

                                          {
                                          $APPTYPE CONSOLE}

                                          uses
                                            SysUtils
                                          ;
                                          var
                                          source,tmp:string;
                                          p,i,c:integer;
                                          begin
                                          source
                                          :='123,668,352,1055';
                                          tmp:=source;
                                          while 
                                          i<>do
                                          begin
                                            i
                                          :=pos(',',tmp);
                                            if 
                                          i<>0
                                            then begin
                                                 delete
                                          (tmp,1,i);
                                                 
                                          inc(c);
                                                 
                                          end;
                                            
                                          end;
                                          writeln('Data: '+source);
                                          writeln('Kol-vo elementov: ',c+1);

                                          tmp:=source;
                                          for 
                                          i:=1 to c do
                                            
                                          begin
                                            p
                                          :=pos(',',tmp);
                                            
                                          Writeln('Element #',i,': ',copy(tmp,1,p-1));
                                            
                                          Delete(tmp,1,p);
                                            
                                          end;
                                            
                                          Writeln('Element #',c+1,': ',tmp);
                                          readln;
                                          end.
                                           
                                          triblekill and binarymaster like this.