[ 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. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Если прога запускается под отладчиком (или из IDE делфового ), то полюбому будет выскакивать(потому как отладчик ловит эксепшены в первую очередь)
    Ты запускай отдельно прогу лучше. Или если в отладчике, то просто продолжай выполнение
     
  2. НTL

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

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Я это знаю, и говорил я про уже скомпилированную прогу
     
  3. zeppe1in

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

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    НTL
    дак значит в компоненте эта месага
     
  4. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Прочитай синтаксис try ... except. В инди ексепшн вроде EIdHTTPProtocolException
     
  5. НTL

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

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Не помогло, хотя я вроде убрал все строчки об масаги (С помощью "//")
     
  6. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    Получаю скрин активного окна таким образом:

    А как получить скрин конкретного элемента этого активного окна?
    Допустим координаты мне известны, и размер элемента тоже (координаты размещения элемента именно на форме):

     
    #3826 ex3me, 31 Jul 2009
    Last edited: 31 Jul 2009
  7. W!z@rD

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

    Joined:
    12 Feb 2006
    Messages:
    973
    Likes Received:
    290
    Reputations:
    43
    Посмотри API PrintWindow
     
  8. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    НTL,
    Code:
    try
    body:=IdHTTP1.Get('http://site.com/script.php');
    except
    on EIdHTTPProtocolException do
    	begin
    		//Твой код
    	end;
    end;
    
    
     
    1 person likes this.
  9. НTL

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

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Работает но:
    [​IMG]

    Все равно появляется, чтобы ево убрать надо в IdHTTP строчки убрать, но какие?
     
  10. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    Закомментируй в IdHTTP.pas строчку, которая выделяется в дельфи при эксепшене.
    Code:
    raise что-то там...
     
  11. НTL

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

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Знаеш скока там таких?

    Давай так, если у тебя не выдает такую ошибку то ты мне скинешь свой idhttp.pas
     
  12. [n]-c0der

    [n]-c0der Member

    Joined:
    3 Feb 2009
    Messages:
    83
    Likes Received:
    24
    Reputations:
    -1
    Вы идиоты!(с) Dr. House
    Нихрена там ниче коментить не надо!, Всего лишь надо try,except и все, ошибка вылетает в среде делфи(под отладчиком), просто скомпилируй запусти и не будет вылетать эксепшена...
     
  13. mailbrush

    mailbrush Well-Known Member

    Joined:
    24 Jun 2008
    Messages:
    1,997
    Likes Received:
    996
    Reputations:
    155
    [n]-c0der, я ему это говорил, но, видать, что-то не получается у него.

    Когда в дельфи открываешь прогу, отсылаешь запрос, дельфя при эксепшене октрывает IdHTTP.pas и выделяет строчку, которая генерит ошибку, вот ты и закомментируй её.

    У меня не выдает, использую метод, выложенный мною выше. Версии инди у нас могут быть разные.
     
  14. НTL

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

    Joined:
    26 Jan 2008
    Messages:
    715
    Likes Received:
    205
    Reputations:
    -26
    Думаеш самый умный? Читай тему

    У меня выделяет строчке в Unit1 которая отсылает ( RichEdit1.Lines.Text := UTF8ToAnsi(IdHTTP1.Get(Хост));)

    В этом и дело что версии разные... вот я и заиспользую IdHTTP от другой версии... А еще лучше если скинеш всю папку Indy...
     
  15. zeppe1in

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

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    мне нужно использовать в качестве RandSeed строку.
    тоесть надо какойнибудь алгоритм переделывания строки в Longint, ну и что бы совпадений небыло.
    есть идеи?
     
  16. slesh

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

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    как вариант -
    Code:
    var
      s:string
      d:dword;
    begin
      d:= dword(pointer(@s[1])^);
    end;
    
    т.е. цифровое представление первых 4- байт как 1 двойного слова.
    диапазон начала может быть от 1 до length(s)-3
    Ну или про суммируй все такие 4-ки байт.
     
  17. desTiny

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

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    м, лучше уж что-нть типа md5 и (если длинновато) - разбить на куски и, например, похорить
     
  18. zeppe1in

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

    Joined:
    12 Jul 2006
    Messages:
    343
    Likes Received:
    66
    Reputations:
    18
    slesh
    спасибо так и сделаю.
     
  19. transserg

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

    Joined:
    2 Jul 2008
    Messages:
    147
    Likes Received:
    25
    Reputations:
    2
    привеит всем возник такой вопрос
    как узнать по букве визическое имя диска? вчастности флеш =)
    пробовал так
    Code:
    QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
    
    в lpQuery будет строка типа
    Code:
    '\Device\Harddisk1\DP(1)0-0+9'
    
    чтозначат чимволы после Harddisk1? да и прав ли я в том что '\\.\PHYSICALDRIVE1' = '\Device\Harddisk1\DP(1)0-0+9'? если да то почему бывает такая ошибка когда начинаю извлекать безопасно диск пиши F а он извлекает к примеру диск E все эти диски флеш да и потом через прогу немогу извлечить диск F!
    вот код модуля где я извелкаю диски (USBFLASH)
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,setupapi;
    type  
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Memo1: TMemo;
        Button2: TButton;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
        procedure OnDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    implementation
    
    {$R *.dfm}
    
    function IsUSBDevice(DevInst: DWORD): boolean;  
    var
      IDLen: DWORD;
      ID: PChar;
      s:string;
    begin
      {'USBSTOR\DISK&VEN_&PROD_USB_FLASH_DRIVE&REV_34CH\196B09014EC7&0'}
      result := false;
      if (CM_Get_Device_ID_Size(IDLen, DevInst, 0) <> 0) or (IDLen = 0) then
      begin
      // exit;
      end;
    
      inc(IDLen);
      ID := GetMemory(IDLen);
      if ID = nil then
        exit;
      if (CM_Get_Device_ID(DevInst, PAnsichar(ID), IDLen, 0) <> 0) or (not CompareMem(ID, PChar('USBSTOR'), 7)) then
       begin
       s:=ID;
        form1.memo1.Lines.Add(String(ID));
        FreeMemory(ID);
        exit;
       end;
       s:=ID;
       form1.memo1.Lines.Add(String(ID));
      FreeMemory(ID);
      result := true;
    end;
    
    function GetDeviceName(PnPHandle: HDEVINFO; const DevData: TSPDevInfoData): string;
    var
      BytesReturned: DWORD;
      RegDataType: DWORD;
      Buffer: array [0..256] of CHAR;
    begin
      BytesReturned := 0;
      RegDataType := 0;
      Buffer[0] := #0;
      SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_FRIENDLYNAME,
    RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
      Result := Buffer;
      if Result<>'' then exit;
      BytesReturned := 0;
      RegDataType := 0;
      Buffer[0] := #0;
      SetupDiGetDeviceRegistryProperty(PnPHandle, DevData, SPDRP_DEVICEDESC,
    RegDataType, PByte(@Buffer[0]), SizeOf(Buffer), BytesReturned);
      Result:=Buffer;
    end;
    
    function DWORDtoDiskNames(val:DWORD):string;
    var
      _i: integer;
    begin
      Result:='';
      for _i := 0 to 25 do
       begin
        if ((val mod 2)=1) then Result:=result+ chr(_i + 65);
        val:=val shr 1;
       end;
    end;
    
    procedure TForm1.Button2Click(Sender: TObject);
    VAR
      lpQuery: array [0..MAXCHAR - 1] of Char;
      Volume,s:STRING;
    
    begin
       {'\\.\PHYSICALDRIVE1'}
       Volume:=Edit1.text+':';
       Volume[3] := #0;
       QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
       s:=lpQuery;
       Volume:='';
       Edit2.Text:=s;
       {'\Device\Harddisk1\DP(1)0-0+9'}
    end;
    procedure TForm1.OnDeviceChange(var Msg: TMessage);
    var
      MSGSTR:String;
    begin
      if Msg.WParam=DBT_DEVICEARRIVAL then
       begin
        case PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype of
        DBT_DEVTYP_VOLUME:
         begin
          MSGSTR:='новый диск'+MSGSTR;
          Edit1.Text:=(MSGSTR+' '+DWORDtoDiskNames(PDEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_unitmask)+':');
         end;
        end;
       end;
    if Msg.WParam=DBT_DEVICEREMOVECOMPLETE then
       begin
        case PDEV_BROADCAST_HDR(Msg.LParam)^.dbch_devicetype of
         DBT_DEVTYP_VOLUME:
          begin
           MSGSTR:='извлечён диск'+MSGSTR;
           Edit1.Text:=(MSGSTR+' '+DWORDtoDiskNames(PDEV_BROADCAST_VOLUME(Msg.LParam)^.dbcv_unitmask)+':');
          end;
        end;
       end;
       end;
    
    
    procedure RemoveDrive(index:integer);
    var
      DrivesPnPHandle: HDEVINFO;
      DevInfo: TSPDevInfoData;
      Parent: DWORD;
      s:string;
      VetoName:array[0..MAX_PATH] of char;
    begin
      DevInfo.cbSize := sizeof(SP_DEVINFO_DATA);
      DrivesPnPHandle := SetupDiGetClassDevsA(@GUID_DEVCLASS_DISKDRIVE, nil, 0, 2);
      if DrivesPnPHandle = INVALID_HANDLE_VALUE then
        exit;
      if SetupDiEnumDeviceInfo(DrivesPnPHandle, index,DevInfo) then
       begin
        s:=GetDeviceName(DrivesPnPHandle,DevInfo);
        if (IsUSBDevice(DevInfo.DevInst)) and (CM_Get_Parent(Parent, DevInfo.DevInst, 0) = CR_SUCCESS)
         then
          begin
           CM_Request_Device_Eject(Parent, nil, nil{@VetoName}, {MAX_PATH}0, 0);
          end
         else
          ShowMessage('Это не USB устройство');
       end;
      SetupDiDestroyDeviceInfoList(DrivesPnPHandle);
    end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    VAR
      lpQuery: array [0..MAXCHAR - 1] of Char;
      Volume,s:STRING;
    begin
       Volume:=Edit1.text+':';
       Volume[3] := #0;
       QueryDosDevice(PChar(Volume), @lpQuery[0], MAXCHAR);
       s:=lpQuery;
       Volume:='';
       Memo1.Lines.add(s);
       {'\Device\Harddisk1\DP(1)0-0+9'}
        RemoveDrive(StrToInt(lpQuery[16]));
    end;
    end.
    
    ткните носом в мои ошибки! если можно то с примерами исправления!
     
  20. ex3me

    ex3me Member

    Joined:
    7 Jan 2009
    Messages:
    0
    Likes Received:
    63
    Reputations:
    0
    slesh, по посту 4030 поможешь? Так и не осилил PrintWindow, чтобы получить скрин интересующего меня элемента на форме (координаты и размер известны)
     
Thread Status:
Not open for further replies.