[ Delphi / Pascal ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by banned, 6 May 2007.

Thread Status:
Not open for further replies.
  1. Nullsleep

    Nullsleep Member

    Joined:
    2 Jun 2009
    Messages:
    67
    Likes Received:
    26
    Reputations:
    0
    Code:
    function PosCount(const Substr, Str: string): Integer;
    var
      i, p: Integer;
      s: string;
    begin
      s := Str;
      Result := 0;
      for i := 1 to Length(s) do
      begin
        p := Pos(Substr, s);
        if p <> 0 then Inc(Result);
        Delete(s, 1, p);
      end;
    end;
    
     
  2. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Nullsleep твой код конечно очень наглядный, но увы очень медленный ((
    Работа со строками в делфи - это очень медленная вешь. Вот банальный пример.

    Твоя функция(PosCount) - основанная на работе со строка и
    моя(mPosCount) основанная на работе с память. ПРи больших размерах строки скорость реально заметна.
    Code:
    function PosCount(const Substr, Str: string): Integer;
    var
      i, p: Integer;
      s: string;
    begin
      s := Str;
      Result := 0;
      for i := 1 to Length(s) do
      begin
        p := Pos(Substr, s);
        if p <> 0 then Inc(Result);
        Delete(s, 1, p);
      end;
    end;
    
    function mPosCount(const Substr, Str: string): Integer;
    var
      s: pchar;
      len: integer;
      sublen: integer;
    begin
      s := @str[1];
      sublen := length(substr);
      len := length(str) - sublen + 1;
      result := 0;
      while len > 0 do
      begin
        if CompareMem(s, @substr[1], sublen) then
        begin
         inc(result);
         len := len - sublen;
         s := s + sublen;
        end
        else
        begin
          dec(len);
          inc(s);
        end;
      end;
    end;
    
    
    И вот тестирование работы:
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     x:integer;
     s1,s2:string;
     start, stop:dword;
     cnt:integer;
    begin
     s1 := 'dfgdfklgjkfdg8fdg8f0dg09g0f9d0g';
     s2 := '';
     for x:=1 to 20000 do s2:=s2+s1;
     start := GetTickCount;
     cnt := mPosCount(s1, s2);
     stop := GetTickCount;
     memo1.Lines.Add(inttostr(stop - start));
     memo1.Lines.Add('CNT: '+inttostr(cnt));
    
     start := GetTickCount;
     cnt := PosCount(s1, s2);
     stop := GetTickCount;
     memo1.Lines.Add(inttostr(stop - start));
     memo1.Lines.Add('CNT: '+inttostr(cnt));
    end;
    
    Результаты видны сразу
    0
    CNT: 20000
    1578
    CNT: 20000
    т.е. мой код данные действия сделал меньше чем за 1 микросекунду.
    А твой код делал 1578 микросекунд что примерно равно 1,5 секунды
    При кол-во повторов 100k мой код выполнил данные действия также меньше микросекунды (иногда 16 микросекунд при загруженности проца) а сколько делает это твой код - я хз. потому что надоело ждать.

    Вывод такой - если нужно чтото искать, вырезать и копировать, то лучше работать с памятью напрямую чем через строки.
     
    1 person likes this.
  3. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Интересная зависимость при тестировании скорости работы со строками.

    CNT: 5000 - 94
    CNT: 10000 - 406
    CNT: 20000 - 1578
    CNT: 40000 - 6297

    т.е. видно что увеличении длинный строки в 2 раза уменьшает скорость в 4 раза.

    CNT: 80000 - 35609 - хотя я хз почему тут не в 4 раза больше предыдущего а в 5,7 раз.


    Вот так вот и доверяй делфи и её скорости. Если работать с память то скорость выходит:
    CNT: 10 000 000 - 407
    как видно что за 407 микросекунд тут обработалось 10 миллионов повторов, в на строках тока 10 тысяч.
    Вот и выходит что разница по скорости - в 1000 раз.
     
  4. toxa001

    toxa001 New Member

    Joined:
    8 Jul 2008
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Подскажите как можно получить код изображения под делфи ?

    Вот короткий пример формы куда будет вставлятся изображение:
    Code:
    object Form1: TForm1
      Left = 0
      Top = 0
      BorderStyle = bsNone
      ClientHeight = 413
      ClientWidth = 549
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      Position = poDesktopCenter
      PixelsPerInch = 96
      TextHeight = 13
      object Image1: TImage
        Left = 0
        Top = 0
        Width = 549
        Height = 413
        Align = alClient
        Picture.Data = {код изображения}
        ExplicitWidth = 553
        ExplicitHeight = 378
      end
    end
    Может немного тупой вопрос ... но не судите строго, я только начал разбираться в делфях ...
     
  5. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    так в image есть свойство Picture и там выбирается картинка.
    А тут(в исходнике формы) таже самая картинка только переведенная в hex
    можеш взять WinHex и перевести сам. Вот тока там скорее всего не сама может быть картнка а уже готовый битмап
     
  6. toxa001

    toxa001 New Member

    Joined:
    8 Jul 2008
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    Картинка в исходнике примерно в таком виде была :
    Code:
          0A544A504547496D616765B4090100FFD8FFE000104A46494600010101006000
          600000FFDB0043000503040404030504040405050506070C08070707070F0B0B
    скопировал пару строчек ...

    попробовал рисунок в hex перевести ... и форма что то не компилится ... видимо что то не так.
     
  7. toxa001

    toxa001 New Member

    Joined:
    8 Jul 2008
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    PS: строчки в сорце слитно написаны ... форум их разбил на 2 столбца
     
  8. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    toxa001, я правильно тебя понял тебе надо сохранить рисунок с формы или что? Если так, то это проще сделать открыв в эту форму в delphi, и где загружается картинка есть кнопочка 'сохранить', насколько я помню)
     
  9. toxa001

    toxa001 New Member

    Joined:
    8 Jul 2008
    Messages:
    0
    Likes Received:
    0
    Reputations:
    0
    мне надо сменить рисунок ... сейчас открыл форму в делфи ... но чего то не пойму как рисунок вставить =)
     
  10. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    В контроле TImage есть свойство Picture кликни в этом поле 2 раза появится окно загрузки картинки далее думаю понятно все)
     
  11. miqo

    miqo Banned

    Joined:
    18 Nov 2008
    Messages:
    100
    Likes Received:
    0
    Reputations:
    -1
    Как можно редактировать элемент TListBox при двойном шелчке
     
  12. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Есть такой код на С++:
    Code:
    for (r = 0; r < ClCount; r++, FileSize -= BlockSize)
    {
    	Offset.QuadPart = ClusterSize * Clusters[r];
    	SetFilePointer(hDrive, Offset.LowPart, &Offset.HighPart, FILE_BEGIN);
    	ReadFile(hDrive, Buff, ClusterSize, &Bytes, NULL);
    	BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize;
    	WriteFile(hFile, Buff, BlockSize, &Bytes, NULL);
    }
    
    Как перевести его на Delphi, точнее не сам цикл, а всего лишь вот эту строчку:
    Code:
    BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize;
    
    подскажите =)
     
  13. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Code:
    if FileSize < ClusterSize then BlockSize := FileSize
    else BlockSize := ClusterSize;
     
  14. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Пасиб) razb, я в принципе так и думал, но лучше уточнить, чем гадать так или не так)!
     
  15. miqo

    miqo Banned

    Joined:
    18 Nov 2008
    Messages:
    100
    Likes Received:
    0
    Reputations:
    -1
    Как в ListBox-е вставить строку после определенной строки ?
     
  16. Nullsleep

    Nullsleep Member

    Joined:
    2 Jun 2009
    Messages:
    67
    Likes Received:
    26
    Reputations:
    0
    ListBox1.Items.Insert(5, 'stroka')
    5 - индекс строки
     
    #4216 Nullsleep, 21 Sep 2009
    Last edited: 22 Sep 2009
  17. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Ну кто нибудь все таки знает, как можно прочитать или скопировать файл открытый монопольно другим приложением?
    OpenReadOnly и fmSharedDenyNone не подходят!
     
  18. Nullsleep

    Nullsleep Member

    Joined:
    2 Jun 2009
    Messages:
    67
    Likes Received:
    26
    Reputations:
    0
    alexey-m, попробуй этот код, но я не уверен, что поможет (это почти тоже самое, что и у тебя)
    Code:
    var
      whole: file;
      buf: array[1..8192] of Byte;
    begin
      AssignFile(whole, whole_name);
      FileMode := 0; //только чтение
      Reset(whole, 1);
      BlockRead(whole, buf, 8192);
      CloseFile(whole);
    end;
    
     
  19. alexey-m

    alexey-m Elder - Старейшина

    Joined:
    15 Jul 2009
    Messages:
    518
    Likes Received:
    100
    Reputations:
    37
    Да любым приложением), надо прочитать\ скопировать файл не убивая этот процесс
     
  20. Fepsis

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

    Joined:
    17 Sep 2008
    Messages:
    791
    Likes Received:
    391
    Reputations:
    72
    Здравствуйте, господа.. НЕбольшой вопрос.. Пытаюсь авторизоваться на mail.ru так:
    Code:
    var
    tst : TStringList;
    ex: string;
    begin
     tst :=  TStringList.Create;
     tst.Add('Login=логин');
     tst.Add('Domain=домен');
     tst.Add('Password=пароль');
     ex := Form1.IdHTTP1.post('http://win.mail.ru/cgi-bin/auth',tst);
    end;
    Так вот какое дело, если логин с паролем валидные выдаёт ошибку
    Code:
    HTTP/1.1 302 OK
    Если не валид - то в ex страница авторизации (что логично)

    Как решить эту проблему через indy (другие варианты пока не рассматриваются)..?!
    Да, и если я прямо откровенно туплю, не судите строго... Только начал с Делфи разбираться.. :rolleyes:


    ПС: В пхп смотрел, сразу после запроса выдаёт что-то вроде:
    HTML:
    <HTML>http://win.mail.ru/cgi-bin/checkcookie?id=02727a43776c7a54190502190a1d00041c05020b4966535c465d050306020816020304165a4a54405445461658505d5b174345</HTML>
     
Thread Status:
Not open for further replies.