2013-02-05 2 views
1

내 델파이 앱을 웹 사이트에 로그인하고 페이지를 탐색하여 자동으로 특정 파일을 다운로드하려는 경우 How do I keep an embedded browser from prompting where to save a downloaded file?의 솔루션을 사용하면 파일 다운로드에 많은 도움이됩니다.twebbrowser in popupwindow

마지막 문제는 팝업 창에서 열리는 마지막 단계입니다. TWebBrowser.NewWindow2를 구현하여 팝업 창을 캡처 할 수있는 많은 솔루션이 있지만 위의 코드와 아무런 관련이없는 것 같습니다. 위의 코드에서 twebbrowser.invokeevent가 어쩌면 작동하는지는 알 수 있습니까?

invokeveent를 사용하고 273 (newwindow3)의 dispID를 사용하여 함수를 호출하면 popupwindow의 url에 두 번째 웹 브라우저를 twebbwowser.navigate() 할 수 있습니다.

내 문제는 팝업 창에 javascript "document.print (parent.parent.opener.thefunction())"의 기본 행이 두 번째 twebbrowser에 부모에 대한 참조가 없으므로 실패합니다.

나는 두 가지 가능한 솔루션을 볼 수 있습니다. TWebBrowser.NewWindow2 또는 3을 트리거하려면 LVarArray [0] {const IDispatch} 코드 샘플을 수정하십시오. 어떤 이유로 든 null입니다.

procedure TWebBrowser.InvokeEvent(ADispID: TDispID; var AParams: TDispParams); 
      // DispID 250 is the BeforeNavigate2 dispinterface and to the FFileSource here 
      // is stored the URL parameter (for cases, when the IDownloadManager::Download 
      // won't redirect the URL and pass empty string to the pszRedir) 
      //showmessage('test'); 
      var 
     ArgCount : Integer; 
     LVarArray : Array of OleVariant; 
     LIndex : Integer; 
     begin 
     inherited; 
     ArgCount := AParams.cArgs; 
     SetLength(LVarArray, ArgCount); 
     for LIndex := Low(LVarArray) to High(LVarArray) do 
     LVarArray[High(LVarArray)-LIndex] := OleVariant(TDispParams(AParams).rgvarg^[LIndex]); 

     case ADispID of 
      250: FFileSource := OleVariant(AParams.rgvarg^[5]); 

     273: DoNewWindow3(Self, 
     LVarArray[0] {const IDispatch}, 
      WordBool((TVarData(LVarArray[1]).VPointer)^) {var WordBool}, 
      LVarArray[2] {const OleVariant}, 
     LVarArray[3] {const OleVariant}, 
     LVarArray[4] {const OleVariant}); 
      end; 
     end; 

답변

2

잘못된 질문을 한 것으로 보아 귀하의 질문에 직접 답변하지 않겠습니다. GUI가 표시되지 않고 인터넷을 통해 파일을 다운로드하려고합니다. 따라서 임베디드 브라우저는 단순히 잘못된 솔루션 일뿐입니다.

팝업 대화 상자를 표시하지 않고 팝업 대화 상자를 표시하지 않는 도구를 사용하십시오. 내가 당신이해야한다고 생각하는 것은 직접 HTTP 다운로드를 사용하여 파일을 다운로드하는 것입니다. 이를 달성하기위한 여러 가지 방법이 있습니다. 예를 들어 Delphi에서 즉시 사용할 수있는 매우 편리한 방법은 Indy를 사용하는 것입니다. 필요한 구성 요소가 TIdHttp이라고 생각합니다.

+0

다운로드 한 파일이 서버 측에서 생성 되더라도? –

+1

예, 별 차이가 없습니다. 그것은 모두 HTTP입니다. Indy 구성 요소 또는 실제로 다른 모든 메커니즘과 마찬가지로 브라우저에서도 마찬가지입니다. –

+0

좋아 다시 드로잉 보드로 돌아가서 URL을 모른다면 어쨌든 직접 http 다운로드를 사용하는 방법을 모르겠다. 어쨌든 작동하도록 위의 코드를 얻었으니 지금은 ASP 페이지를 다운로드하지 않는다. –