Возникла небольшая проблема с HTTP запросами/ответами через Wnisock, При отправки запроса через HTTP Sender слеша, к примеру такова запроса: Ответ придет с HTML кодом за 4 сек А если убрать в коде эти строчки: Code: function send_packs(ip:string; port:word; send_buf:string; var recv_buf:string):integer; var SockAddrIn:TSockAddrIn; tmp_buf:array[0..1024] of char; len:longint; socket_id:LongWord; begin result:=-10; socket_id:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if socket_id=LongWord(-1) then exit; SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_port := htons(port); SockAddrIn.sin_addr.s_addr := inet_addr(Pansichar(GetIPAddress(ip))); result:=-20; if Connect(socket_id, SockAddrIn, SizeOf(SockAddrIn))<>0 then begin closesocket(socket_id); exit; end; send(socket_id,send_buf[1],length(send_buf),0); recv_buf:=''; [COLOR=Red][B] repeat[/B][/COLOR] len:=recv(socket_id,tmp_buf,1024,0); recv_buf:=recv_buf+copy(tmp_buf,0,len); [COLOR=Red][B] until len<=0;[/B][/COLOR] result:=length(recv_buf); closesocket(socket_id); end; То ответ придет за 200 Ms, но без HTML кода... Также если отправлять запросы через синфер, то ответ приходит за 1сек и с HTML кодом Как можно отправить и получить ответ от сервера за минимальное время и с HTML кодом???
1) считываеш первый пакет. там будет HTTP заголовок который записал сервак. Анализируеш поле Contend-Length и если оно есть, то береш из него число переданных данныех. Затем считываеш их и разрываеш соединение. В противном случае придется читать данные пока сервак не разорвет соединение сам. А разорвет он быстро соединение тока тогда, когда будет в твоем заголовке чтото типа Connection: Close
2 UnknownZZZ Я разбираюсь. Тебе достаточно будет такого ответа на вопрос? По этому не задавай глупых вопрос, а сразу по теме пиши.
Всем привет, вот у меня вопрос : как запретить ввоод всех символом кроме цыфр и знака "-" минус ? для всех едитов. спс
поставь для них один обработчик KeyPress и там пропиши код if (Key in ['0'..'9', '-', #8] = false) then Key := #0; #8 - это символ бакспейса (чтобы можно было стереть написанное)
2 UnknownZZZ я просто не понимаю твоей проблемы. Или опиши полностью где какая кнопка и что должно убраться или зающай функцию скрывания элементов и окон - ShowWindow(H, SW_HIDE) где H - дискриптор твоей кнопки
Лучше SetWindowLong(Edit2.Handle, GWL_STYLE, GetWindowLong(Edit2.Handle, GWL_STYLE) or ES_NUMBER); Но тут только цифры.
HELP парсю эту строку в label Дохожу до Начинаю удалять </b> И удаляется нужный текст... Что делать ? Заранее оч. благодарен !
s:='<tr><td>Ïîëüçîâàòåëü</td><td align=center><b>iGlass</b></td></tr>'; delete(s, 1, pos('<b>', s)+2); delete(s, pos('</b>', s), length(s));
Народ! Привет, есть проблемка, горит очень =) Возможно ли на обжект паскале сделать следующее: реализовать интерфейс с помощью классов, но так, чтобы класс был сделегирован (т.е. в теле интерфейса сделать ссылку на него) и самое главно, что, чтобы этот класс не объйявлять! Я вот не могу разобраться! Помогите! Вопщем в кратце, написать интерфейс методом делегирования без объявления класса.
Через выше описаный метод не канает... Код проги HTML: var S: TStringList; P,I: integer; user,balans,credit: string; begin S:=TStringList.Create; //Создаём Строковый листок Memo1.Text:=idHttp1.Get('http://stat.elcity.ru/showstat.php?'+'uid='+login.Text+'&pwd='+password.Text); // Получаем страницу S.Text:=Memo1.Text; P:=S.IndexOf('<!--Вставка блока PHP -->'); // if not (P=-1) then begin for i:=0 to 3 do begin inc(P); if Pos('Пользователь',S.Strings[p])>0 then user:=S.Strings[p]; if Pos('Текущий кредит',S.Strings[p])>0 then credit:=S.Strings[p]; if Pos('Баланс',S.Strings[p])>0 then balans:=S.Strings[p]; end; end; Delete(user,1,pos('<',user)); Delete(user,1,pos('td',user)); Delete(user,1,pos('>',user)); Delete(user,1,pos('b',user)); Delete(user,pos('/',user),20); Delete(user,1,pos('<',user)); Delete(user,1,pos('td',user)); Delete(user,1,pos('>',user)); Delete(user,1,pos('b',user)) Delete(user,pos('/',user),20); Label1.Caption:='Пользователь: '+user+#10#13+'Текущий кредит: '+credit+#10#13; Не показывает текущий кредит и баланс тоже... Но имя пользователя приходит... В чём проблема, помогайте плиз! От меня + В репу Код странички Code: <!--Вставка блока PHP --> <h2><font color=darkred size=+1 face=Arial>Общая информация</font></h2> <table width=400 cellspacing=0 cellpadding=3 border=1> <tr><td>Пользователь</td><td align=center><b>iglass</b></td></tr> <tr><td>Ф.И.О.</td><td align=center><b>Иван</b></td></tr> <tr><td>Лицевой счет</td><td align=center><b>10854</b></td></tr> <tr><td>Тариф</td><td align=center><b>Безлимитный 560</b></td></tr> <tr><td>Абонентская плата</td><td align=center><b>900 руб/месяц</b></td></tr> <tr><td>Текущий кредит</td><td align=center><b>0 руб.</b></td></tr><tr><td>Сумма на счету</td><td align=center><b><font color=green>524.52</font> руб.</b></td></tr>
Народ подскажите как на дельфи узнать серийник харда (не серийник тома) чтобы на любой ОС пахало! спасиб
спс за ответ. с вводом букв розобрался, еще вопрос: есть функцыя SetFocus мне надо зделать чтобы курсор переводился на следующий едит когда в него ввели допустим 2 цыфры..
2 Mykola-bas ну в томже onkeypress обработчике делай чтото типа этого if length(edit1.Text) = 1 then Edit2.SetFocus;
slesh вижу ты всезнающий =) не подскажеш как получить инфу о харде? (типа как Hardware_IDExtractor.dll)
это довольно геморно и под разные накопители по разному получается можно читать SMART. МОжно через WMI. В инете вроде были исходники и того и другова. Вот пример для IDE дисков под XP/2003 кода там очень мало. в осномном только описание структур. У меня вывел - WD-WCAH81202167 Code: function GetIdeDiskSerialNumber(disk:byte): string; type TSrbIoControl = packed record HeaderLength: ULONG; Signature: array[0..7] of Char; Timeout: ULONG; ControlCode: ULONG; ReturnCode: ULONG; Length: ULONG; end; SRB_IO_CONTROL = TSrbIoControl; PSrbIoControl = ^TSrbIoControl; TIDERegs = packed record bFeaturesReg: Byte; // Used for specifying SMART "commands". bSectorCountReg: Byte; // IDE sector count register bSectorNumberReg: Byte; // IDE sector number register bCylLowReg: Byte; // IDE low order cylinder value bCylHighReg: Byte; // IDE high order cylinder value bDriveHeadReg: Byte; // IDE drive/head register bCommandReg: Byte; // Actual IDE command. bReserved: Byte; // reserved for future use. Must be zero. end; IDEREGS = TIDERegs; PIDERegs = ^TIDERegs; TSendCmdInParams = packed record cBufferSize: DWORD; // Buffer size in bytes irDriveRegs: TIDERegs; // Structure with drive register values. bDriveNumber: Byte; // Physical drive number to send command to (0,1,2,3). bReserved: array[0..2] of Byte; // Reserved for future expansion. dwReserved: array[0..3] of DWORD; // For future use. bBuffer: array[0..0] of Byte; // Input buffer. end; SENDCMDINPARAMS = TSendCmdInParams; PSendCmdInParams = ^TSendCmdInParams; TIdSector = packed record wGenConfig: Word; wNumCyls: Word; wReserved: Word; wNumHeads: Word; wBytesPerTrack: Word; wBytesPerSector: Word; wSectorsPerTrack: Word; wVendorUnique: array[0..2] of Word; sSerialNumber: array[0..19] of Char; wBufferType: Word; wBufferSize: Word; wECCSize: Word; sFirmwareRev: array[0..7] of Char; sModelNumber: array[0..39] of Char; wMoreVendorUnique: Word; wDoubleWordIO: Word; wCapabilities: Word; wReserved1: Word; wPIOTiming: Word; wDMATiming: Word; wBS: Word; wNumCurrentCyls: Word; wNumCurrentHeads: Word; wNumCurrentSectorsPerTrack: Word; ulCurrentSectorCapacity: ULONG; wMultSectorStuff: Word; ulTotalAddressableSectors: ULONG; wSingleWordDMA: Word; wMultiWordDMA: Word; bReserved: array[0..127] of Byte; end; PIdSector = ^TIdSector; const IDE_ID_FUNCTION = $EC; IDENTIFY_BUFFER_SIZE = 512; DFP_RECEIVE_DRIVE_DATA = $0007C088; IOCTL_SCSI_MINIPORT = $0004D008; IOCTL_SCSI_MINIPORT_IDENTIFY = $001B0501; DataSize = sizeof(TSendCmdInParams) - 1 + IDENTIFY_BUFFER_SIZE; BufferSize = SizeOf(SRB_IO_CONTROL) + DataSize; W9xBufferSize = IDENTIFY_BUFFER_SIZE + 16; var hDevice: THandle; cbBytesReturned: DWORD; pInData: PSendCmdInParams; pOutData: Pointer; // PSendCmdInParams; Buffer: array[0..BufferSize - 1] of Byte; srbControl: TSrbIoControl absolute Buffer; procedure ChangeByteOrder(var Data; Size: Integer); var ptr: PChar; i: Integer; c: Char; begin ptr := @Data; for i := 0 to (Size shr 1) - 1 do begin c := ptr^; ptr^ := (ptr + 1)^; (ptr + 1)^ := c; Inc(ptr, 2); end; end; begin Result := ''; FillChar(Buffer, BufferSize, #0); hDevice := CreateFile(pchar('\\.\Scsi'+inttostr(disk)+':'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0); if hDevice = INVALID_HANDLE_VALUE then Exit; try srbControl.HeaderLength := SizeOf(SRB_IO_CONTROL); System.Move('SCSIDISK', srbControl.Signature, 8); srbControl.Timeout := 2; srbControl.Length := DataSize; srbControl.ControlCode := IOCTL_SCSI_MINIPORT_IDENTIFY; pInData := PSendCmdInParams(PChar(@Buffer) + SizeOf(SRB_IO_CONTROL)); pOutData := pInData; with pInData^ do begin cBufferSize := IDENTIFY_BUFFER_SIZE; bDriveNumber := 0; with irDriveRegs do begin bFeaturesReg := 0; bSectorCountReg := 1; bSectorNumberReg := 1; bCylLowReg := 0; bCylHighReg := 0; bDriveHeadReg := $A0; bCommandReg := IDE_ID_FUNCTION; end; end; if not DeviceIoControl(hDevice, IOCTL_SCSI_MINIPORT, @Buffer, BufferSize, @Buffer, BufferSize, cbBytesReturned, nil) then Exit; finally CloseHandle(hDevice); end; with PIdSector(PChar(pOutData) + 16)^ do begin ChangeByteOrder(sSerialNumber, SizeOf(sSerialNumber)); SetString(Result, sSerialNumber, SizeOf(sSerialNumber)); end; end; procedure TForm1.Button1Click(Sender: TObject); var s: string; begin s := GetIdeDiskSerialNumber(0); if s <> '' then ShowMessage(s); end;