Forum.pcsoft.fr/pt-BR/pcsoft.br.windev/1242-trabalhando-com-internal-procedure/read.awp
rezados,
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
<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.
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 ()
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
// 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
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 ()
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
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
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.
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/