Forum.pcsoft.fr/pt-BR/pcsoft.br.windev/1242-trabalhando-com-internal-procedure/read.awp
Publicado em maio, 17 2016 - 4:44 AM
|
Prezados,
Trabalhando com Internal Procedure, agiliza o desenvolvimento e evita codigos repetitivos, agilizando o desenvolvimento. Vejamos o exemplo: Só digitar normal e d Várias características requerem um procedimento de chamada uma vez ou várias vezes através de uma função WLanguage (também chamado de "retorno de chamada"). por exemplo, este é o caso para as seguintes funções: fListFile , TreeListItem , AlbumPicker em iOS, ... Um procedimento deve ser criado para essas funções, mas vários inconvenientes aparecer: Perda da localidade código: o algoritmo final não pode ser totalmente exibida. Várias partes traseiras e forths deve ser realizada entre o código de chamada eo procedimento WLanguage. Dificuldade para compartilhar informações wiht o procedimento WLanguage: Na maioria dos casos, as variáveis globais deve ser utilizado (para passar parâmetros para a chamada de retorno ou para recuperar os resultados). Neste caso, os procedimentos internos são usados para simplificar a escrita de características de retorno de chamada e para corrigir os problemas causados pelo uso de um procedimento padrão. Declarando e chamando os procedimentos internos Um procedimento interno é declarado no código de um processo existente (processo associado a um controle, procedimento janela, processo global ou método de classe, ...). A sintaxe é a seguinte:
PROCESSO INTERNO <Nome do Procedimento> ()
<Código DO processo> FIM notas: Os procedimentos internos devem ser declarados no processo em que eles são usados. O código do processo encontrados antes e depois do código de declaração do procedimento interno é executado em sequência: o código do procedimento interno não é executado. Exemplo:
// Código antes do procedimento interno:. Este código é executado
INTERNO PROCEDIMENTO MyInternalProcedure () // Código do procedimento interno. // Este código não é executado. END // código após o procedimento interno: Este código é executado. Um procedimento interno pode ser diretamente chamado pelo seu nome, como qualquer procedimento padrão. Esta chamada pode ser colocada antes ou depois da declaração do procedimento interno. Exemplo:
// Chamada colocado antes
MyInternalProcedure () // Declare o procedimento interno INTERNO PROCEDIMENTO MyInternalProcedure () // Código do procedimento interno de execução durante a chamada para MyInternalProcedure () END // Chamada colocado após MyInternalProcedure () Isto permite-lhe obter um código que é fácil de ler. As exceções disparadas pelos procedimentos internos podem ser processados fora do procedimento interno. Exemplo O código a seguir é usado para listar todos os elementos filho de um nó encontrado em um controle TreeView:
// Lista os "filhos" do nó "Sobremesas" em "TREE_RecipeTV"
// O procedimento "ExpandAll" é chamado // para cada elemento de "criança" encontrada no nó "Sobremesas" Res = TreeListItem ( tree_ RecipeTV , "Recipes " + TAB + " Sobremesas " , ExpandAll ) INTERNO PROCEDIMENTO ExpandAll ( tree_ RecipeTV , ChildPath , ChildFound , Nível , Pointer ) // é o elemento encontrado uma folha? IF TreeTypeItem ( tree_ RecipeTV , ChildPath + ChildFound ) = tvLeaf ENTÃO RETURN // volte para a função TreeListItem MAIS // é o elemento encontrado em colapso? IF TreeStatus ( tree_ RecipeTV , ChildPath + ChildFound ) = tvCollapse ENTÃO TreeExpand ( tree_ RecipeTV , ChildPath + ChildFound ) END END // Recolhe o treeview TreeCollapse ( tree_ RecipeTV , " receita " ) END Características dos procedimentos internos Usar em callback O procedimento interno pode ser usado em uma série de funções WLanguage que espera um procedimento WLanguage no parâmetro (como fListFile , TreeListItem , ...). Atenção: Neste caso, o parâmetro correspondente ao nome do procedimento interno deve corresponder diretamente para o nome do procedimento interno (o nome do procedimento não deve ser colocado entre aspas). Não para o fazer :
// Lista os "filhos" do nó "Sobremesas" em "TREE_RecipeTV"
Res = TreeListItem ( tree_ RecipeTV , "Receitas" + TAB + "Sobremesas" , "ExpandAll" ) INTERNO PROCEDIMENTO ExpandAll ( tree_ RecipeTV , ChildPath , ChildFound , Nível , Pointer ) ... END DO: // Lista os "filhos" do nó "Sobremesas" em "TREE_RecipeTV" Res = TreeListItem ( tree_ RecipeTV , "Receitas" + TAB + "sobremesas" , ExpandAll ) INTERNO PROCEDIMENTO ExpandAll ( tree_ RecipeTV , ChildPath , ChildFound , Nível , Pointer ) ... END Parâmetro de procedimento interno O procedimento interno pode ser utilizada como parâmetro em um procedimento. Neste caso, o tipo de parâmetro será "Procedimento". Exemplo:
// Declare o procedimento interno
procedimento interno MyInternalProcedure () // código executado durante a chamada para o procedimento passou no parâmetro END MyOtherProcedure ( MyInternalProcedure ) PROCESSO MyOtherProcedure ( p é Procedimento ) P () Acesso às variáveis de um procedimento interno As variáveis declaradas no mesmo processo que a declaração do procedimento interno pode ser chamado no procedimento interno. Não há necessidade de usar variáveis globais mais. Exemplo:
s ElementList is string
s Separator is string = CR TreeListItem ( TREE_ TreeeViewControl , "" , MyInternalProcedure ) INTERNAL PROCEDIMENTO MyInternalProcedure ( TreeViewName , Filial ) sElementList + = [ sSeparator ] + ramo END Procedimentos internos de nidificação Os procedimentos internos podem ser aninhados. Cada procedimento interno pode acessar as variáveis dos procedimentos que o incluem. Exemplo:
ExternalVariable é int
Traço ( ExternalVariable ) MyInternalProcedure1 () INTERNO Procedure MyInternalProcedure1 () InternalVariable1 is int Trace ( ExternalVariable + InternalVariable1 ) MyInternalProcedure2 () INTERNAL Procedure MyInternalProcedure2 () InternalVariable2 is int Trace ( ExternalVariable + InternalVariable1 + InternalVariable2 ) END END Caso especial: Usando procedimentos internos com funções assíncronas Os procedimentos internos podem ser utilizados como "chamada de retorno" para funções assíncronas. ATENÇÃO: Neste caso, o código encontrado após a chamada para a função que está usando um procedimento WLanguage assíncrona será executado antes do código do procedimento interno. Exemplo: Neste exemplo para o Windows Mobile, o código encontrado após AlbumPicker será executado antes do procedimento interno. O procedimento interno será chamado quando o seletor é validado pelo usuário.
AlbumPicker ( albumImage , PhotoSelection )
INTERNO PROCEDIMENTO PhotoSelection ( s ImagePath ) IMG_ ImageControl = s ImagePath END // Código executado após a função AlbumPicker mas // antes do código do procedimento interno. Limitações Um procedimento interno não pode ser nomeado como os procedimentos que o contenham. Dois procedimentos internos de mesmo nível não pode ter o mesmo nome, mesmo se elas são declaradas em diferentes blocos de código (SE ENTÃO MAIS, ...). Um processo ou a um procedimento interno só pode chamar os seus procedimentos internos diretos. Em particular, um procedimento interno não pode chamar um procedimento interno do mesmo nível. Os procedimentos internos não estão disponíveis na compilação dinâmica. A execução de um procedimento interno não pode ser automatizado. A gestão automática de erros não está disponível para os procedimentos internos. Bons estudos! -- Adriano José Boller ______________________________________________ Consultor e Representante Oficial da PcSoft no Brasil +55 (41) 9949 1800 adrianoboller@gmail.com skype: adrianoboller http://wxinformatica.com.br/
Mensagem modificada, maio, 17 2016 - 4:46 AM
|