Instanciar uma Interface, alguém me explica direito?
Ae galera, baseado numa dúvida de um colega o [b:40626c7fb8]dcpleal[/b:40626c7fb8] fui atrás de mais informações sobre como fazer download usando Delphi. Hoje uso a função [b:40626c7fb8]UrlDownloadToFile[/b:40626c7fb8] da unit UrlMon, que na verdade é uma chamada a urlmon.dll. Pois bem, até ai muito tranquilo.
Daí acontece que vaculhando um pouco descobri que dá pra pegar o status de download, mas para isso é necessário instanciar uma interface vejam:
Aqui tem tudo, mas como faço pra usar esta interface?
Achei o artigo abaixo, mas confesso que fiquei um pouco confuso:
[url=http://www.activedelphi.com.br/print.php?sid=256]Entendendo Interfaces[/url]
Consegui chegar somente até aqui, mas dá erro no CreateOleObject. Como não entendo nada, não consigo solucionar...valeu
//declaração UrlMon function URLDownloadToFile(Caller: IUnknown; URL: PChar; FileName: PChar; Reserved: DWORD; StatusCB: IBindStatusCallback): HResult; stdcall; //chamada function URLDownloadToFile; external UrlMonLib name ´URLDownloadToFileA´;
Daí acontece que vaculhando um pouco descobri que dá pra pegar o status de download, mas para isso é necessário instanciar uma interface vejam:
{$EXTERNALSYM IBindStatusCallback}
IBindStatusCallback = interface
[´{79eac9c1-baf9-11ce-8c82-00aa004ba90b}´]
function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
function GetPriority(out nPriority): HResult; stdcall;
function OnLowResource(reserved: DWORD): HResult; stdcall;
function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
szStatusText: LPCWSTR): HResult; stdcall;
function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
stgmed: PStgMedium): HResult; stdcall;
function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
end;
Aqui tem tudo, mas como faço pra usar esta interface?
Achei o artigo abaixo, mas confesso que fiquei um pouco confuso:
[url=http://www.activedelphi.com.br/print.php?sid=256]Entendendo Interfaces[/url]
Consegui chegar somente até aqui, mas dá erro no CreateOleObject. Como não entendo nada, não consigo solucionar...valeu
procedure TForm1.Button2Click(Sender: TObject); //const //CGUID : TGUID = ´79eac9c1-baf9-11ce-8c82-00aa004ba90b´; //IID_IBindStatusCallback: TGUID = ´79eac9c1-baf9-11ce-8c82-00aa004ba90b´; var MeuEstatus : IBindStatusCallback; MeuEstatusGuid : TGuid; begin GetInterface(IID_IBindStatusCallback, MeuEstatusGuid); MeuEstatus := CreateComObject(MeuEstatusGuid) as IBindStatusCallback; //MeuEstatus.OnProgress( UrlDownloadToFile(nil, PChar(Edit1.Text), PChar(Edit2.Text), 0, MeuEstatus); // CLSID_ActiveDesktop) as IActiveDesktop; end;
Adriano Santos
Curtidas 0
Respostas
Michael
06/09/2005
Olá colega!
Até onde eu sei, para vc usar uma interface, vc deve criar uma classe, que derive de outra, e da interface que vc quer usar.
No artigo que vc citou isso é explicado, usando a classe nativa do Delphi [b:36c7496c62]TInterfacedObject[/b:36c7496c62]. Esta classe é interessante. Veja: ´Para facilitar a implementação das classes que definem interfaces, podemos utilizar a classe [b:36c7496c62]TInterfacedObject [/b:36c7496c62]como classe ancestral, pois ela implementa os métodos da interface [b:36c7496c62]IInterface[/b:36c7496c62], facilitando de forma significativa a construção do código.´
Não entendi pq usar [b:36c7496c62]CreateComObject[/b:36c7496c62]...
[]´s
Até onde eu sei, para vc usar uma interface, vc deve criar uma classe, que derive de outra, e da interface que vc quer usar.
No artigo que vc citou isso é explicado, usando a classe nativa do Delphi [b:36c7496c62]TInterfacedObject[/b:36c7496c62]. Esta classe é interessante. Veja: ´Para facilitar a implementação das classes que definem interfaces, podemos utilizar a classe [b:36c7496c62]TInterfacedObject [/b:36c7496c62]como classe ancestral, pois ela implementa os métodos da interface [b:36c7496c62]IInterface[/b:36c7496c62], facilitando de forma significativa a construção do código.´
Não entendi pq usar [b:36c7496c62]CreateComObject[/b:36c7496c62]...
[]´s
GOSTEI 0
Adriano Santos
06/09/2005
Olá colega!
Até onde eu sei, para vc usar uma interface, vc deve criar uma classe, que derive de outra, e da interface que vc quer usar.
No artigo que vc citou isso é explicado, usando a classe nativa do Delphi [b:b81b289f0c]TInterfacedObject[/b:b81b289f0c]. Esta classe é interessante. Veja: ´Para facilitar a implementação das classes que definem interfaces, podemos utilizar a classe [b:b81b289f0c]TInterfacedObject [/b:b81b289f0c]como classe ancestral, pois ela implementa os métodos da interface [b:b81b289f0c]IInterface[/b:b81b289f0c], facilitando de forma significativa a construção do código.´
Não entendi pq usar [b:b81b289f0c]CreateComObject[/b:b81b289f0c]...
[]´s
Então [b:b81b289f0c]Michael[/b:b81b289f0c], eu não tenho que criar um objeto derivado da interface para poder acessar seus métodos e etc? Por isso tentei desta foram.
GOSTEI 0
Michael
06/09/2005
Sim, vc deve criar um objeto derivado de [b:d6d442c9e9]uma classe[/b:d6d442c9e9] e de [b:d6d442c9e9]uma ou mais interfaces[/b:d6d442c9e9]. E para criar este objeto, vc deve proceder como uma classe qualquer:
Qualquer coisa é só postar.
[]´s
TMeuObjetoInterface = class(TInterfacedObject, IBindStatusCallback) (...) end;
Qualquer coisa é só postar.
[]´s
GOSTEI 0
Adriano Santos
06/09/2005
Sim, vc deve criar um objeto derivado de [b:4cd43072a7]uma classe[/b:4cd43072a7] e de [b:4cd43072a7]uma ou mais interfaces[/b:4cd43072a7]. E para criar este objeto, vc deve proceder como uma classe qualquer:
Qualquer coisa é só postar.
[]´s
TMeuObjetoInterface = class(TInterfacedObject, IBindStatusCallback) (...) end;
Então ao tenho que redeclarar todos os métodos desta Inteface, acredito.
GOSTEI 0
Bruno Belchior
06/09/2005
até onde eu sei você deve implementar esses métodos na sua classe... pois uma [b:96e1c4bcc8]interface[/b:96e1c4bcc8] é utilizada mais ou menos como uma classe abstrata...
GOSTEI 0
Adriano Santos
06/09/2005
Eita Fórum porreta da muléstia, rs.
Ae, deu certo...consegui criar um exemplo de download com progresso.
Vou dar uma melhorada e enviar a Dica para o ClubeDelphi pra ver se eles postam, daí menciono os créditos na dica beleza?
Valeu.
Obs. Não é tão difícil assim como eu pensava. :D
Ae, deu certo...consegui criar um exemplo de download com progresso.
Vou dar uma melhorada e enviar a Dica para o ClubeDelphi pra ver se eles postam, daí menciono os créditos na dica beleza?
Valeu.
Obs. Não é tão difícil assim como eu pensava. :D
GOSTEI 0