Paulo Nobre
28/04/2006 - 06:55
Tenho um programa de dados em que os principais são mostrados no word, como se fosse um relatório.
Usando a paleta Servers incluo dois componentes para conectar e usar o word.
Não tenho nenhum problema nem dúvida em relação ao código. Tudo funciona redondo.
Tenho o D7 e na instalação ele pergunta quais os arquivos relativos ao word desejo instalar para a aparecer na paleta server(Office 98-2000 ou XP), como tenho o 2003 escolhi o último e tudo funciona bem como já disse. Acontece que no trabalho tenho word 2000 e desta forma, pelo programa, o word não abre nem a pau.
Aí fiz o seguinte: no uses acrecentei Word2000(intuição) e trouxe para o trabalho para testar. Para minha surpresa funcionou normalmente.
Fiquei surpreso, pois não mudei uma linha de código sequer e os componentes de conexão são para wordXP, que funciona com o meu 2003(até aí tudo bem).
Alguém, que já trabalhou com este tipo de automação, sabe explicar porque funcionou?
Micheus
29/04/2006 - 11:59
Isto provavelmente ocorreu pelo fato que as versões posteriores costumam manter compatibilidade com as versões anteriores. Já o contrário não é verdade. Assim, quando você fez o
Type Cast para o Word2000, o programa continuou funcionando na sua máquina (que tem uma versão posterior do Word que deve ser compativel com a 2000).
Se você abir o editor de registros (RegEdit) e verificar HKEY_CLASSES_ROOT, você constatará que estão registradas algumas versões do Word e uma "genérica" (Word.Application). Nom meu caso que tenho instalado o Office 2000:
QUOTE
HKEY_CLASSES_ROOT\Word.Application
HKEY_CLASSES_ROOT\Word.Application.8
HKEY_CLASSES_ROOT\Word.Application.9
[]s
Paulo Nobre
30/04/2006 - 00:35
Obrigado pela dica Micheus, esclareceu o que pode ser.
Mas, o que significa Type Cast ?
Aproveitando, você saberia dizer porque clicando por exemplo na unit(declaração)Windows com o botão direito do mouse e depois finddeclaritions aparecem todos os códigos da unit, mas clicando em WordXp ou Word2000, ele diz que não pode encontrar?
Micheus
30/04/2006 - 19:52
Typecast é algo como dizer que um determinado tipo de dados é outro (normalmente compatíveis). Não consigo encontrar palavras para lhe explicar melhor, então vou lhe dar alguns exemplos de uso:
1) Uma situação que muito uso é para flags numéricos. Numa listbox com duas opções, onde ItemIndex será 0 ou 1, quando necessito fazer algum teste, faço da seguinte maneira if LongBool(ListBox1.ItemIndex) then, da mesma forma que o inverso é verdadeiro;
2) Quando utilizo a tag de um botão, para implementar duplo estado. Então, no OnClick faço algo como TBitBtn(Sender).Tag := Ord(not Boolean(TBitBtn(Sender).Tag)); Observe que aqui utilizei um outro typecast muito comum. Todos os eventos passam Sender como parâmetro e normalmente trata-se do objeto que o gerou. Originalmente Sender é um TObject, sendo que é a classe base de todos os componentes descendem deste. Também poderia ser feito utilizando o operador "as": (Sender as TBitBtn).Tag := Ord(not Boolean((Sender as TBitBtn).Tag))
3) Outra aplicação que faço uso é quando utilizo TreeNodes. Observe que além do texto que inserimos na Treeview, podemos armazenar dados associados a cada um deles. Afunção AddChildObject(Node: TTreeNode; const S: string; Ptr: Pointer) nos permite isto. Assim você pode associar objetos a cada item bastando passar o endereço do mesmo para a função no parâmetro Ptr. Então, ao utilizar a propriedade Selected (do TreeView), você poderá acessar a propriedade Data a qual contém o ponteiro passado na função e fazer um typecast dele para a classe que você adicionou.
Tenha em mente que os tipos, apesar de diferentes, são compatíveis entre si. Caso contrário, o risco de obter erros é grande.
Quanto ao seu segundo questionamento, não saberia responder (se ninguém responder, posso tentar verificar).
[]s
Paulo Nobre
01/05/2006 - 20:19
Prezado Micheus,
Muito obrigado pela sua excelente explicação.
[]s
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor
clique aqui.