[ 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
    Не помогло весь мусор убирал потоки прыгают как хотят и всё (
     
  2. Matrix001

    Matrix001 Active Member

    Joined:
    18 Aug 2016
    Messages:
    262
    Likes Received:
    146
    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 ? Как работать с регресными выражениями ?
     
  3. 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.
  4. 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]);
     
  5. #colorblind

    #colorblind Moderator

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

    triblekill Member

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

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Задумано, что ты букве присваиваешь строку?
    Нельзя впихнуть невпихуемое (с)
     
    binarymaster likes this.
  8. 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
  9. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Фризить может где угодно, отладчик в руки и дебажить по строчке. При правильном использовании потоков, WndProc главной формы не может тормозить. Убери все обращения к элементам формы из ThreadProc и проверь.
     
  10. 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
    
     
  11. r1ddl3

    r1ddl3 New Member

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

    triblekill Member

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

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    Reputations:
    42
    Pos, не?
     
  14. 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.
  15. 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); // Только первый символ перед запятой и циклом не выходит :-(
    
     
  16. binarymaster

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

    Joined:
    11 Dec 2010
    Messages:
    4,717
    Likes Received:
    10,195
    Reputations:
    126
    Изменять исходную строку в while цикле по мере получения значений, например.
     
  17. 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
  18. binarymaster

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

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

    triblekill Member

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

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    634
    Likes Received:
    246
    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.