[ 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. НTL

    НTL Elder - Старейшина

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Возникла небольшая проблема с 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 кодом???
     
  2. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    1) считываеш первый пакет. там будет HTTP заголовок который записал сервак.
    Анализируеш поле Contend-Length
    и если оно есть, то береш из него число переданных данныех. Затем считываеш их и разрываеш соединение. В противном случае
    придется читать данные пока сервак не разорвет соединение сам.
    А разорвет он быстро соединение тока тогда, когда будет в твоем заголовке чтото типа
    Connection: Close
     
    1 person likes this.
  3. UnknownZZZ

    UnknownZZZ New Member

    Joined:
    13 Aug 2009
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    Народ, в длл ктото розбирается ??
     
  4. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 UnknownZZZ Я разбираюсь. Тебе достаточно будет такого ответа на вопрос?
    По этому не задавай глупых вопрос, а сразу по теме пиши.
     
    #4124 slesh, 12 Sep 2009
    Last edited: 12 Sep 2009
  5. UnknownZZZ

    UnknownZZZ New Member

    Joined:
    13 Aug 2009
    Messages:
    9
    Likes Received:
    1
    Reputations:
    0
    я ещо на 433 странице написал свой вопрос, и никото ничего,.....
     
  6. Mykola-bas

    Mykola-bas New Member

    Joined:
    24 Apr 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    Всем привет, вот у меня вопрос :
    как запретить ввоод всех символом кроме цыфр и знака "-" минус ? для всех едитов. спс
     
  7. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    поставь для них один обработчик KeyPress и там пропиши код
    if (Key in ['0'..'9', '-', #8] = false) then Key := #0;
    #8 - это символ бакспейса (чтобы можно было стереть написанное)
     
  8. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 UnknownZZZ я просто не понимаю твоей проблемы. Или опиши полностью где какая кнопка и что должно убраться или зающай функцию скрывания элементов и окон - ShowWindow(H, SW_HIDE) где H - дискриптор твоей кнопки
     
  9. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    Лучше SetWindowLong(Edit2.Handle, GWL_STYLE, GetWindowLong(Edit2.Handle, GWL_STYLE) or ES_NUMBER);
    Но тут только цифры.
     
  10. iGlass

    iGlass New Member

    Joined:
    14 May 2009
    Messages:
    86
    Likes Received:
    1
    Reputations:
    0
    HELP :)

    парсю эту строку в label

    Дохожу до
    Начинаю удалять </b> И удаляется нужный текст... Что делать ?
    Заранее оч. благодарен !
     
  11. intNet

    intNet Member

    Joined:
    31 May 2009
    Messages:
    29
    Likes Received:
    14
    Reputations:
    5
    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));
     
  12. stanger

    stanger New Member

    Joined:
    12 Sep 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Народ! Привет, есть проблемка, горит очень =) Возможно ли на обжект паскале сделать следующее: реализовать интерфейс с помощью классов, но так, чтобы класс был сделегирован (т.е. в теле интерфейса сделать ссылку на него) и самое главно, что, чтобы этот класс не объйявлять! Я вот не могу разобраться! Помогите! Вопщем в кратце, написать интерфейс методом делегирования без объявления класса.
     
  13. iGlass

    iGlass New Member

    Joined:
    14 May 2009
    Messages:
    86
    Likes Received:
    1
    Reputations:
    0
    Через выше описаный метод не канает...


    Код проги
    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>
     
  14. Seregakz

    Seregakz New Member

    Joined:
    13 Jun 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    Народ подскажите как на дельфи узнать серийник харда (не серийник тома) чтобы на любой ОС пахало! спасиб
     
  15. Mykola-bas

    Mykola-bas New Member

    Joined:
    24 Apr 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    спс за ответ. с вводом букв розобрался, еще вопрос:
    есть функцыя SetFocus мне надо зделать чтобы курсор переводился на следующий едит когда в него ввели допустим 2 цыфры..
     
  16. W!z@rD

    W!z@rD Борец за русский язык

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    иди русский учи
     
    1 person likes this.
  17. Mykola-bas

    Mykola-bas New Member

    Joined:
    24 Apr 2008
    Messages:
    0
    Likes Received:
    1
    Reputations:
    0
    неучил неучу и учить небуду, если нет чего сказать по теме то лутше молчи.
     
  18. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    2 Mykola-bas
    ну в томже onkeypress обработчике делай чтото типа этого
    if length(edit1.Text) = 1 then Edit2.SetFocus;
     
  19. Seregakz

    Seregakz New Member

    Joined:
    13 Jun 2009
    Messages:
    31
    Likes Received:
    1
    Reputations:
    0
    slesh вижу ты всезнающий =) не подскажеш как получить инфу о харде? (типа как Hardware_IDExtractor.dll)
     
  20. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    это довольно геморно и под разные накопители по разному получается
    можно читать 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;
    
     
Thread Status:
Not open for further replies.