2012-01-21 15 views
2

TWebBrowserを使用して自分のプログラム用のアップデータを構築しています。 OnCreate TWebBrowserは指定されたURLにナビゲートします。アップデートをダウンロードするには、ユーザーがリンクをクリックする必要があります。リンクをクリックすると、このポップアップが表示されます:ファイルのダウンロードを制御する

enter image description here

それがすることが可能であったのであれば、私は思っていた:ポップアップと自動的にダウンロードが可能に

  1. バイパス。
  2. ファイルをダウンロードする固定パスを設定します。
+8

あなたは 'TWebBrowser'更新のためのあなたのプログラムを使用しているのはなぜ? Indy、WinINet、WinHTTPなどの多くのより良いオプションが存在します... – RRUZ

+0

同意して、あなたはこれに対してWebブラウザコントロールを使用すべきではありません! –

答えて

9

私はそのためにインディのTIdHTTPコンポーネントを使用することになり、例えば:

uses 
    ..., IdHTTP; 

var 
    Url, LocalFile: String; 
    Strm: TFileStream; 
begin 
    Url := ...; 
    LocalFile := ...; 
    Strm := TFileStream.Create(LocalFile, fmCreate); 
    try 
    try 
     IdHTTP.Get(Url, Strm); 
    finally 
     Strm.Free; 
    end; 
    except 
    DeleteFile(LocalFile); 
    raise; 
    end; 
end; 
+0

あなたはどうやって手に入りますか?仕事にインディー?どのようにユニットに追加しますか? – Craig

+0

'uses ...、IdHTTP;' –

2

アクティブなHTMLコンテンツを表示していないため、TWebBrowserは必要ではありません。これまでにも述べたように、他にも数多くの選択肢があります。基本的にHTTPリクエストが必要です。

ここではWinInetを使用した非常に簡単な例を示します。これはニーズ(スレッド、ステータスメッセージなど)に合わせて調整する必要があります。

function DownloadURL(inURL, destfile: string): boolean; 
    var 
    hOpen: HINTERNET; 
    hFile: HINTERNET; 
    myAgent: string; 
    savefile: file; 
    amount_read: integer; 
    // the buffer size here generally reflects maximum MTU size. 
    // for efficiency sake, you don't want to use much more than this. 
    mybuffer: array[1..1460] of byte; 
    begin 
    Result := true; 
    myAgent := 'Test downloader app'; 
    // other stuff in this call has to do with proxies, no way for me to test 
    hOpen := InternetOpen(PChar(myAgent), 0, nil, nil, 0); 
    if hOpen = nil then 
     begin 
     Result := false; 
     exit; 
     end; 
    try 
     hFile := InternetOpenURL(hOpen, PChar(inURL), nil, 0, 
      INTERNET_FLAG_RELOAD or INTERNET_FLAG_DONT_CACHE, 0); 
     if hFile = nil then 
     begin 
      Result := false; 
      exit; 
     end; 
     try 
     AssignFile(savefile, destfile); 
     Rewrite(savefile, 1); 
     InternetReadFile(hFile, @myBuffer, sizeof(mybuffer), amount_read); 
     repeat 
      Blockwrite(savefile, mybuffer, amount_read); 
      InternetReadFile(hFile, @myBuffer, sizeof(mybuffer), amount_read); 
     until amount_read = 0; 
     CloseFile(savefile); 
     finally 
     InternetCloseHandle(hFile); 
     end; 
    finally 
     InternetCloseHandle(hOpen); 
    end; 
    end; 

procedure TForm1.Button1Click(Sender: TObject); 
    // example usage. 
    begin 
    if SaveDialog1.Execute then 
     begin 
     if DownloadURL(Edit1.Text, SaveDialog1.FileName) then 
      ShowMessage('file downloaded.') 
     else 
      ShowMessage('Error downloading file.'); 
     end; 
    end; 
+0

WinHTTP/Indy/WinInetよりも優れたオプションがあれば、もっと具体的に何をしたいのかが分かります。それは単に依存しています。 – Glenn1234

+0

インディーのようなもっと良いソリューションがある場合、Delphiで未加工の「WinInet」を使用することはちょっとしたアイデアです。 ICS](http://www.overbyte.be/frame_index.html?redirTo=/products/ics.html)、[Synapse](http://www.ararat.cz/synapse/doku.php/start)、その他。あなたのコードとRemy'sを比較して、なぜそうであるのかを簡単に説明してください。 :) –

+0

@KenWhiteはい、ファイルをダウンロードするときにスティックを振ることができるより多くのオプションがあります。本当に、私はちょうどOPを始めるために何かを見せようとしていた。 (記録的には、私がしたいことに応じてWinInet以外のものを使用しています) – Glenn1234

関連する問題