segunda-feira, 8 de outubro de 2007

Recuperando um ponteiro para class Document

Muitas vezes quando utilizamos o padrão Model-View-Controller (que espero falar aqui no futuro) , precisamos acessar dados contidos na nossa classe Document.

Para fazer isto precisamos de um ponteiro que aponte para o objeto desta classe. Podemos recuperar esta referência através de um método da classe CEikAppUi chamado Document(). Este método retorna um ponteiro genérico do tipo CEikDocument. Para poder utilizar os métodos da nossa classe document precisaremos da um cast da classe base CEikDocument para a nossa classe CMeuDocumento (por exemplo).

Para ilustrar melhor a relação entre as classes aqui está um diagrama de classes. Para a nossa classe Document temos:

Não está explicíto, mas por estas classes começarem com a letra C, sabemos que são derivadas de CBase.

Recuperando a referência da nossa classe Document dentro de AppUi

Classes AppUi são em geral derivadas de CAknAppUi (caso não implemente views) ou CAknViewAppUi (caso a aplicação trabalhe com views). Na relação de hierarquia elas herdam o método Document() de CEikAppUi. Considerando que você precise do ponteiro para Document dentro de sua classe AppUi, basta apenas chamar o método Document(), dando o devido cast.



Exemplo:

// Cast para da classe base para a classe filho.
CMeuDocumento* documento = static_cast(Document());
// Chamando um método qualquer.
documento->MinhaFuncao();
Recuperando a referência para a nossa classe document dentro do container

Classes derivadas de CCoeControl possuem um atributo membro iCoeEnv, que é um ponteiro do tipo CCoeEnv. Esta classe possui um método AppUi() que retorna um ponteiro do tipo CCoeAppUi, iremos utilizar este ponteiro para chamar o método Document() de CEikAppUi. Como vemos no diagrama de classes ao lado, CCoeAppUi não possui o método Document() implementado (ele está implementado em CEikAppUi , filha de CCoeAppUi), tereremos então quer dar um cast para a classe AppUi de nossa aplicação para poder acessar este método.

Exemplo:
// Conversão do tipo CCoeAppUi para CMeuAppUi.
CMeuAppUi* appUi = static_cast(iCoeEnv->AppUi());
// Conversão do tipo CEikDocument para CMeuDocumento.
CMeuDocumento* documento = static_cast(appUi->Document());
// Chamando um método qualquer.
documento->MinhaFuncao();
Referências

Developing Series 60 Applications: A Guide for Symbian OS C++ Developers (cap. 4)

Um comentário:

Leonardo Fernandes disse...

Olá Leonardo,
Achei seu blog pelo Wiki da Nokia.
Parabens pelo premio e pelo blog.

Atc.
Leonardo Fernandes
http://jroller.com/leofernandesmo