Code: delete(all, Pos(res, all), 1); Последний параметр функции delete - это длина подстроки для удаления начиная с позиции удаления. Если тебе нужно удалить рандомный символ, то его длина БУДЕТ 1, в силу того, что по определению символ не может быть длиной больше одного, т.к в этом случаи это уже не символ, а подстрока. В противном случаи ты обрезаешь всю строку all до твоего рандомного символа. Пример: Предположим, что строка all равна сл. значению: all := 'abcdefghi'; Рандом пускай выдал позицию символа 'e'; То есть res := 'e'; n = 5; Если делать так: delete(all,Pos(res,all), Pos(res,all) + 1); То из строки all удалится 6 символов начиная с 5 позиции. То есть значение строки all в результате окажется 'abcd', вместо 'abcdfghi'. Учите банальную алгоритмизацию. Это не дело.
WendM Спасибо за ответ) Проблема как оказалось была не в этом. Я новичок поэтому не ругайте сильно) Для авторизации на сайте есть такой параметр как ajax=true, так вот если его передавать то перестает парсить ответ. Почему так и как это обойти? Заранее спасибо.
Возможно ты не проинициализировал random. При использовании функции random нужно вызывать процедуру randomize; Вызывать ее нужно один раз. Если random используешь в объекте класса TForm, то процедуру нужно вызвать в любом методе этого класса, если random используешь в потоке, то randomize вызывать соответственно в потоке.
В HTTP.Response.ResponseText будут только заголовки ответа. То есть какой-то такой вид: Code: HTTP/1.1 200 OK Server: nginx/1.2.4 Date: Wed, 15 Jan 2014 17:54:17 GMT Content-Type: text/plain; charset=windows-1251 Content-Length: 1050 Connection: keep-alive X-Powered-By: PHP/3.4151 Pragma: no-cache Cache-control: no-store Content-Encoding: gzip Твоя строка {"action":"needLogin","success":true,"message" не похожа на элемент заголовка, поэтому ее нужно парсить/проверять в самом теле ответа, то есть из примера WendM'а нужно проверять в переменной html: Code: if Pos('{"action":"needLogin","success":true,"message"', html)<>0 then
Вопрос остается в силе, хелп. Буду очень благодарен. Неверно работает. Должен в result выводить перемешанные символы из all . Code: all:=str+coun+strU; // str:=''; coun:=''; strU:=''; // for v:=0 to 8 do begin res:=all[random(Length(all))+1]; result:=result+res; if Pos(res,all)>0 then delete(res,Pos(res,all),Pos(res,all)+1); res:=''; end; mmo1.lines.Add(result);
Protocoler, вообще не улавливаю логику работы. ты же в res закидаешь один символ, потом используешь функцию Pos скорее всего неправильно (Pos(substr, str) - возвращает первое вхождение подстроки substr в строку str, потому у тебя условие всегда возвращает true) и удаляешь непонятное количество символов начиная с хрен знает какой позиции, хотя res хранит только один символ...
Так, нашел ошибку. Спасибо. А то голова совсем не варит уже.. исправил delete не от туда удалял, но всеравно не так... хм.. Как должно работать строка all в которой 9 символов, в цикле res рендомно получает 1 символ из all , вставляет его в result и этот символ удаляет из all чтобы снова его рендом не словил. И так до конца. НО пример : gqv85OYHZ - изначально all vHqgggggg - прога выдает в конце как результат Получается что не верно работает delete . При if Pos(res,all)>0 access violetion вылетает, значит логика не правильная если > 1 то все норм. Бляя.. Хелп Code: all:=str+coun+strU; // str:=''; coun:=''; strU:=''; // mmo1.lines.Add(all); // проверочка for v:=0 to 8 do begin res:=all[random(Length(all))+1]; result:=result+res; if Pos(res,all)>1 then delete([COLOR=Yellow]all[/COLOR],Pos(res,all),Pos(res,all)+1); res:=''; end; mmo1.lines.Add(result);
Protocoler, для delete 3-им параметром передается количество удаляемых символов, в твоем случае должно быть 1, то есть Code: delete(all,Pos(res,all),[COLOR=Red]1[/COLOR]);
та это я уже исправил как поменял res на all . Но всеравно не работает... какая-то банальная ошибка я уверен, но голова уже болит думать.
надеюсь про randomize ты не забыл? update. нащел выше, что randomize есть. тогда - хз, я брал твой код, добавил randomize и исправил ошибку с delete - и все заработало как надо
Protocoler я же тебе уже давно указал правильный вариант http://forum.antichat.ru/showpost.php?p=3654297&postcount=9525
Всеравно не верно работает rec71XEEM - строка all изначально 7rcEEX - результат который вышел, хотя должно было по сути просто перемешать символы
Protocoler, можно как-то так без copy и delete перемешать символы для строки длиной не более 31 символа: Code: function getRandomStr(const Src: String): String; var id, iSet, cdLen: Cardinal; begin Randomize; cdLen:= Length(Src); if (cdLen > 31) then cdLen:= 31; iSet:= not ($FFFFFFFF shl cdLen); while True do begin id:= Random(cdLen); if (((iSet shr id) and 1) = 1) then begin iSet:= iSet and not (1 shl id); Result:= Result + Src[id+1]; end; if (iSet = 0) then Break; end; end;
Этого киллера нет, но написал по-своему: Code: program ProcessGuard; {$APPTYPE CONSOLE} uses SysUtils, Windows, TlHelp32; // by Stas'M (aka binarymaster) type TProcessEntry = record PID: DWORD; Name: String; end; TProcessList = Array of TProcessEntry; procedure WriteToLog(S: String); var Timestamp: String; begin DateTimeToString(Timestamp, 'yyyy.mm.dd hh:mm:ss', Now); S := '[' + Timestamp + '] ' + S; Writeln(S); end; procedure GetProcessList(var ProcList: TProcessList); var hSnapshot: THandle; pe32: TProcessEntry32; begin SetLength(ProcList, 0); hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot = INVALID_HANDLE_VALUE) then Exit; pe32.dwSize := SizeOf(TProcessEntry32); if Process32First(hSnapshot, pe32) then repeat SetLength(ProcList, Length(ProcList) + 1); ProcList[Length(ProcList) - 1].PID := pe32.th32ProcessID; ProcList[Length(ProcList) - 1].Name := pe32.szExeFile; until not Process32Next(hSnapshot, pe32); CloseHandle(hSnapshot); end; function KillByPID(PID: DWORD): Boolean; var hProc: THandle; begin Result := False; hProc := OpenProcess(PROCESS_TERMINATE, False, PID); if hProc = 0 then Exit; Result := TerminateProcess(hProc, 0); CloseHandle(hProc); end; function KillByWindow(ClassName, WindowName: PWideChar): Boolean; var Wnd: HWND; PID: DWORD; begin Result := False; Wnd := FindWindow(ClassName, WindowName); if Wnd = 0 then Exit; if GetWindowThreadProcessId(Wnd, PID) = 0 then Exit; if PID = 0 then Exit; Result := KillByPID(PID); if Result then WriteToLog('Process #' + IntToStr(PID) + ' killed by window ('+ClassName+', '+WindowName+').'); end; function KillByName(Name: String; var ProcList: TProcessList): Boolean; var I: Integer; begin Result := False; Name := LowerCase(Name); for I := 0 to Length(ProcList) - 1 do if LowerCase(ProcList[I].Name) = Name then begin Result := KillByPID(ProcList[I].PID); if Result then WriteToLog('Process #' + IntToStr(ProcList[I].PID) + ' killed by name ('+Name+').'); end; end; var ProcList: TProcessList; begin try { TODO -oUser -cConsole Main : Insert code here } while True do begin GetProcessList(ProcList); // Your processes here KillByName('miniperl.exe', ProcList); KillByName('httpd.exe', ProcList); KillByName('mysqld.exe', ProcList); KillByName('ollydbg.exe', ProcList); KillByName('HttpAnalyserStdV7.exe', ProcList); KillByName('HttpAnalyserStdV6.exe', ProcList); KillByName('HttpAnalyserStdV5.exe', ProcList); KillByName('Charles.exe', ProcList); KillByName('wireshark.exe', ProcList); // Your windows here KillByWindow(nil, 'HTTP Analyzer V6'); KillByWindow(nil, 'HTTP Analyzer V5'); KillByWindow(nil, 'HTTP Analyzer V7'); KillByWindow(nil, 'OllyDbg'); KillByWindow(nil, 'Charles 3.6'); KillByWindow(nil, 'httpd.exe -w'); Sleep(10); end; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.