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 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 микросекунд при загруженности проца) а сколько делает это твой код - я хз. потому что надоело ждать. Вывод такой - если нужно чтото искать, вырезать и копировать, то лучше работать с памятью напрямую чем через строки.
Интересная зависимость при тестировании скорости работы со строками. 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 раз.
Подскажите как можно получить код изображения под делфи ? Вот короткий пример формы куда будет вставлятся изображение: 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 Может немного тупой вопрос ... но не судите строго, я только начал разбираться в делфях ...
так в image есть свойство Picture и там выбирается картинка. А тут(в исходнике формы) таже самая картинка только переведенная в hex можеш взять WinHex и перевести сам. Вот тока там скорее всего не сама может быть картнка а уже готовый битмап
Картинка в исходнике примерно в таком виде была : Code: 0A544A504547496D616765B4090100FFD8FFE000104A46494600010101006000 600000FFDB0043000503040404030504040405050506070C08070707070F0B0B скопировал пару строчек ... попробовал рисунок в hex перевести ... и форма что то не компилится ... видимо что то не так.
toxa001, я правильно тебя понял тебе надо сохранить рисунок с формы или что? Если так, то это проще сделать открыв в эту форму в delphi, и где загружается картинка есть кнопочка 'сохранить', насколько я помню)
мне надо сменить рисунок ... сейчас открыл форму в делфи ... но чего то не пойму как рисунок вставить =)
В контроле TImage есть свойство Picture кликни в этом поле 2 раза появится окно загрузки картинки далее думаю понятно все)
Есть такой код на С++: 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; подскажите =)
Ну кто нибудь все таки знает, как можно прочитать или скопировать файл открытый монопольно другим приложением? OpenReadOnly и fmSharedDenyNone не подходят!
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;
Здравствуйте, господа.. НЕбольшой вопрос.. Пытаюсь авторизоваться на 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 (другие варианты пока не рассматриваются)..?! Да, и если я прямо откровенно туплю, не судите строго... Только начал с Делфи разбираться.. ПС: В пхп смотрел, сразу после запроса выдаёт что-то вроде: HTML: <HTML>http://win.mail.ru/cgi-bin/checkcookie?id=02727a43776c7a54190502190a1d00041c05020b4966535c465d050306020816020304165a4a54405445461658505d5b174345</HTML>