|
DICA TÉCNICA
Arrastando arquivos do Windows Explorer para a aplicação
Nesta edição do e-update, abordaremos um exemplo de aplicação enviada pelo Sr. Ladislau da Ideal Sistemas e Consultoria. Ele usou a DLL Shell32 do Windows para criar um exemplo de como arrastar arquivos do Windows Explorer diretamente para a aplicação, em objetos Edit e Grid.
Para que possamos arrastar um arquivo para a aplicação, devemos usar três funções da DLL Shell32. Usaremos o comando "External_Function" para declarar as funções:
Define WM_DROPFILES FOR |CI$0233
External_Function DragAcceptFiles 'DragAcceptFiles' Shell32.dll ;
Handle hwnd Integer iFlag Returns Integer
External_Function DragQueryFile 'DragQueryFile' Shell32.dll Handle ;
hDrop Integer iFileIndex Pointer pFileBuff Integer iBuffSize ;
Returns Integer
External_Function DragFinish 'DragFinish' Shell32.dll Handle hDrop ; Returns Integer
A Função "DragAcceptFile" é usada para verificar se um arquivo pode ser arrastado para a aplicação. Para pegarmos a referência do arquivo, a função "DragQueryFile" é utilizada. Quando o parâmetro "|CI$FFFFFFFF" é colocado, a função "DragQueryFile" retorna o número de arquivos a serem arrastados. E por fim, a função "DragFinish" finaliza o processo de arraste do arquivo. A documentação completa das funções de DLL's do Windows pode ser encontrada no site http://msdn.microsoft.com.
Declaradas as funções, precisaremos criar uma nova classe para o objeto Edit e outra para o objeto Grid. Dentro dessas classes definiremos as procedures necessárias para o processo de arraste dos arquivos. As duas classes são iguais mudando apenas os seus nomes:
Class cdragEdit Is a edit //Class cdragGrid Is a Grid
Procedure Construct_Object
Forward Send Construct_Object
Set External_Class_Name "cdragEdit" To "edit"
//"cdragGrid" To "DFformlist"
Set External_Message WM_DROPFILES To msg_DoFileDropping
End_Procedure // Construct_Object
Procedure DoFileDropping Integer lParam Integer wParam
Local Handle hDrop
Local Integer iCount iSize iC iRet
Local string sFile pFile
Move lParam To hDrop
Move (DragQueryFile(hDrop,|CI$FFFFFFFF,0,0)) To iCount
For iC From 0 To (iCount-1)
Move (DragQueryFile(hDrop,iC,0,0)) To iSize
Move (Repeat(Character(0),iSize+1)) To sFile
GetAddress Of sFile To pFile
Move (DragQueryFile(hDrop,iC,pFile,iSize+1)) To iRet
If iRet Begin
Move (CString(sFile)) To sFile
Send onFileDropped sFile
End
End
Move (DragFinish(hDrop)) To iRet
End_Procedure
Procedure Page_Object Integer iFlag
Local Integer iRet
Forward Send Page_Object iFlag
Move (DragAcceptFiles(Window_Handle(Self),True)) To iRet
end_procedure
End_Class
Na Procedure "Construct_Object", o par de comandos "External_Class_Name" e "External_Message" são usados respectivamente, para inserir a classe "cdragEdit" do Windows na classe "Edit", e para definir a procedure que será chamada quando um arquivo for arrastado para a aplicação. O parâmetro "WM_DROPFILES" é um identificador do Windows, que envia uma mensagem para a aplicação, cada vez que ocorrer um processo de arraste de arquivo. Pelo exemplo, assim que o identificador enviar a mensagem, a procedure "DoFileDropping" será chamada.
A procedure "DoFileDropping" pode ser considerada a procedure principal da aplicação. É ela que utiliza as funções do Windows e assim, utiliza a referência do arquivo e verifica se o mesmo pode ser arrastado para aplicação. Repare que uma outra procedure de nome "OnFileDropped" está sendo chamada e envia o parâmetro que contém a referência do arquivo ("sFile"). Essa procedure está declarada nos objetos "Edit" e "Grid":
Object oEdit1 is a cdragEdit
Set Size to 175 393
Set Location to 30 13
Set Color to 15263976
Procedure OnFileDropped String sFile
Set Value of oForm1 to sFile
//Envia o caminho do arquivo para o objeto Form
Send mLer sFile
End_Procedure
Procedure mLer string sFile
Send Read sFile //Coloca o conteúdo do arquivo no objeto Edit
End_Procedure
End_Object // oEdit1
Object oGrid1 is a cdragGrid
Set Size to 177 108
Set Location to 30 411
Set Line_Width to 1 0
Set Form_Width item 0 to 47
Set Header_Label item 0 to "Lista Arquivos"
Procedure OnFileDropped String sFile
Send mAdcionar sFile
End_Procedure
Procedure mAdcionar string sFile
Set Value of oForm1 to sFile
//Envia o caminho do arquivo para o objeto Form
Send add_item msg_none sFile
//Adiciona o arquivo no objeto Grid
Send Paint
End_Procedure
End_Object // oList1
Tanto o objeto "Edit" como a "Grid" enviam o caminho do arquivo para o objeto Form. A diferença é que o objeto "Edit" exibe o conteúdo do arquivo, e a "Grid" coloca o caminho do arquivo em cada linha.

Esse foi um exemplo muito interessante sobre componentes externos, que o Sr. Ladislau nos enviou. Tente você também criar diferentes tipos de aplicações utilizando as DLL's do Windows.
|