<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DUUMRng8fip7ImA9WxNUFkw.&quot;"><id>tag:blogger.com,1999:blog-6431510018691746273</id><updated>2009-11-07T16:08:07.676-02:00</updated><title>NeoMatrix Tech | Tecnologia, Programação, .NET,  ASP.NET, C# e muito mais!</title><subtitle type="html">Aqui você poderá encontrar dicas de programação, opinião e análises de tecnologia (gadgets, SO's, notícias...), programação (linguagens, metodologias, IDE's, mercado de trabalho...) e afins.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://neomatrixtech.leonelfraga.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://neomatrixtech.leonelfraga.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6431510018691746273/posts/default?start-index=4&amp;max-results=3&amp;redirect=false&amp;v=2" /><author><name>Leonel Fraga de Oliveira</name><uri>http://www.blogger.com/profile/09609548420567560417</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>97</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>3</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/neomatrixtech" type="application/atom+xml" /><feedburner:emailServiceId>neomatrixtech</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;C0UNSHwyfCp7ImA9WxNVFkQ.&quot;"><id>tag:blogger.com,1999:blog-6431510018691746273.post-1316350630291079521</id><published>2009-10-27T22:54:00.001-02:00</published><updated>2009-10-27T22:54:59.294-02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-27T22:54:59.294-02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Pessoal" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft" /><title>Experiência com o Windows Seven</title><content type="html">&lt;p&gt;Recentemente, no dia 24/10/2009, &lt;strike&gt;deixei o Bill Gates um pouco mais rico&lt;/strike&gt; comprei o novíssimo &lt;strong&gt;Windows Seven&lt;/strong&gt;, que foi lançado oficialmente em todo o mundo no dia 22/10/2009.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_Kzg5fUTKXVY/SueWObOq99I/AAAAAAAAH3w/-pmB6q_wuMw/s1600-h/241020091763%5B1%5D%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="241020091763[1]" border="0" alt="241020091763[1]" src="http://lh3.ggpht.com/_Kzg5fUTKXVY/SueWPBWniFI/AAAAAAAAH30/BRMwHeLajfs/241020091763%5B1%5D_thumb%5B3%5D.jpg?imgmax=800" width="288" height="216" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Sim, vocês leram certo: eu comprei o &lt;strong&gt;Windows Seven original&lt;/strong&gt;, versão &lt;strong&gt;Ultimate&lt;/strong&gt;. Claro que ao falar que compraria (ou até mesmo ler/ouvir que eu comprei), algumas pessoas disseram (vão dizer) “&lt;em&gt;baixa da internet&lt;/em&gt;” e coisas do gênero. Resolvi que dessa vez, não vou apelar à &lt;strong&gt;pirataria&lt;/strong&gt;, queria que o sistema operacional fosse &lt;strong&gt;legal&lt;/strong&gt; (em todos os sentidos).&lt;/p&gt;  &lt;p&gt;Após um excelente encontro com o pessoal da comunidade “&lt;em&gt;Orientais Adultos +/- 25-35&lt;/em&gt;” do Orkut, no &lt;strong&gt;Mercado Municipal&lt;/strong&gt; de São Paulo e antes de ir à uma reunião em minha igreja, dei uma passada na &lt;strong&gt;Santa Ifigênia&lt;/strong&gt; para procurar um lugar onde vendia o &lt;em&gt;Seven&lt;/em&gt;. Não achei nenhuma loja, onde eu perguntei, só tinham o &lt;em&gt;Vista&lt;/em&gt; e o &lt;em&gt;Seven&lt;/em&gt; iria chegar em alguns dias. Incrivelmente, a versão &lt;em&gt;“piratex”&lt;/em&gt; é a que se mais achava. Todas as barracas tinha.&lt;/p&gt;  &lt;p&gt;Um fato curioso, é que em uma das lojas o &lt;strike&gt;capivara&lt;/strike&gt; vendedor disse que arrumaria sob encomenda, sob a &lt;strong&gt;bagatela de R$ 900,00&lt;/strong&gt; e queria que desse um sinal. Me desculpe pelo baixo calão a seguir, mas quase que mandei o cara se foder.&lt;/p&gt;  &lt;p&gt;Disse para ele:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- Isso está superfaturado! O preço OFICIAL, da Microsoft, é de R$ 669,00 em qualquer lugar!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Ele vem me argumentar que o dono da loja adquiriu 18 licenças, e mais algumas para uns notebooks à uns R$ 700,00, coisa e tal. Como eu sabia muito bem do preço, deixei para lá e fui embora da loja.&lt;/p&gt;  &lt;p&gt;Este pequeno fato mostra como é importante estar BEM informado antes de comprar algo, evitar deixar-se levar pela falácia de um vendedor, pois ele está lá para isso mesmo: vender. Além de (dever) estar mal informado, &lt;strong&gt;esse cara queria me enrolar&lt;/strong&gt;…&lt;/p&gt;  &lt;p&gt;Fui até à &lt;em&gt;&lt;a href="http://www.kalunga.com.br/" rel="nofollow" target="_blank"&gt;Kalunga&lt;/a&gt;&lt;/em&gt; da Praça Ramos de Azevedo. Lá achei as versões &lt;strong&gt;Home Basic&lt;/strong&gt; e &lt;strong&gt;Home Premium&lt;/strong&gt;, porém, como estava procurando exatamente pela &lt;strong&gt;Ultimate&lt;/strong&gt;, perguntei ao vendedor. Não tinha lá, e após uma consulta ao estoque, verificou-se que haviam duas unidades na loja próxima ao Metrô Carrão. Fui lá e agora sim, me “apossei” do novíssimo &lt;strong&gt;Windows Seven Ultimate&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Mas, por que a &lt;em&gt;Ultimate&lt;/em&gt; e não a &lt;em&gt;Professional&lt;/em&gt; ou a &lt;em&gt;Home Basic&lt;/em&gt; / &lt;em&gt;Premium&lt;/em&gt;?&lt;/p&gt;  &lt;p&gt;Como eu tenho bastante programas legados, além de desenvolver utilizando Delphi 7 e afins, um recurso que utilizarei é o Modo XP (se bem que eu já uso em uma VM…), presente na versão &lt;em&gt;Professional&lt;/em&gt; ou acima. Como a diferença de preço da &lt;em&gt;Professional&lt;/em&gt; e da &lt;em&gt;Ultimate&lt;/em&gt; não é grande (pela ordem de grandeza), resolvi ficar com a versão mais completa possível.&lt;/p&gt;  &lt;p&gt;Antes de instalar no meu PC, fiz o backup básico de meus dados no outro PC. Demorou um pouco para copiar pela rede de 100 Mbps, mas foi que foi.&lt;/p&gt;  &lt;p&gt;Após o break, vamos entrar na parte técnica da coisa, como foi a instalação, entre outras &lt;em&gt;coisitas mas&lt;/em&gt;! Senta que lá vem história!&lt;/p&gt; &lt;span id="fullpost"&gt;   &lt;p&gt;Primeiramente, vou listar o &lt;strong&gt;hardware do meu PC&lt;/strong&gt; e dizer a você como meu disco rígido está particionado. Vamos lá:&lt;/p&gt;    &lt;p&gt;- Placa mãe Gigabyte &lt;strong&gt;GA-X48-DQ6&lt;/strong&gt;       &lt;br /&gt;- Processador Core &lt;strong&gt;2 Duo E8400&lt;/strong&gt; @ 3,0 GHz (está em stock mesmo)       &lt;br /&gt;- &lt;strong&gt;4 GB de RAM DDR 2 800&lt;/strong&gt; Kingston (2x 2 GB em Dual Channel)       &lt;br /&gt;- HD Western Digital SATA II, de &lt;strong&gt;500 GB&lt;/strong&gt;       &lt;br /&gt;- Placa gráfica Sapphire com chipset gráfico &lt;strong&gt;ATI Radeon HD 4870&lt;/strong&gt;, com 512 MB GDDR5       &lt;br /&gt;- Placa de captura &lt;strong&gt;Pinnacle PCTV 110i&lt;/strong&gt;       &lt;br /&gt;- &lt;strong&gt;Kit de Teclado, Mouse e Webcam&lt;/strong&gt; Microsoft       &lt;br /&gt;- Monitor LCD 22’’ &lt;strong&gt;Samsung SyncMaster T220 &lt;/strong&gt;      &lt;br /&gt;- Conjunto 5.1 Logitech       &lt;br /&gt;- Dongle &lt;strong&gt;Bluetooth &lt;strike&gt;&lt;em&gt;xing-ling&lt;/em&gt;&lt;/strike&gt; genérico&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Dito meu hardware básico, meu disco rígido encontrava-se particionado da segunte forma:&lt;/p&gt;    &lt;p&gt;- 80 GB partição primária, instalado o &lt;strong&gt;Windows XP &lt;/strong&gt;(vá com Deus); as outras unidades lógicas mostradas abaixo estão em uma partição extendida.       &lt;br /&gt;- 85,5 GB, instalado o &lt;strong&gt;Windows Vista&lt;/strong&gt; (também, vá com Deus)&amp;#160; &lt;br /&gt;- 100,0 GB, dados de usuário (Meus Documentos, pastas de desenvolvimento, downloads)       &lt;br /&gt;- 100,0 GB, instalação de aplicativos mais “pesados”       &lt;br /&gt;- 100,0 GB, arquivos de multimídia (músicas, vídeos…)&lt;/p&gt;    &lt;p&gt;Com o disco particionado, eu poderia instalar outro sistema e não perder os dados. Mas, para prevenir, fiz &lt;em&gt;backup&lt;/em&gt; na outra máquina.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_Kzg5fUTKXVY/SueWPyamZGI/AAAAAAAAH34/2fWOteliFbA/s1600-h/241020091764%5B1%5D%5B3%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="241020091764[1]" border="0" alt="241020091764[1]" align="left" src="http://lh5.ggpht.com/_Kzg5fUTKXVY/SueWQmmz-4I/AAAAAAAAH38/2TiIRlDYuek/241020091764%5B1%5D_thumb%5B1%5D.jpg?imgmax=800" width="148" height="112" /&gt;&lt;/a&gt; Na caixa do &lt;strong&gt;Windows Seven&lt;/strong&gt;, vieram além dos manuais, dois DVD’s, um com a versão de &lt;strong&gt;32 bits&lt;/strong&gt; e outro com a &lt;strong&gt;64 bits&lt;/strong&gt;. Como tenho um &lt;strong&gt;processador que suporta as instruções x64 e 4 GB de RAM&lt;/strong&gt;, &lt;strong&gt;a escolha mais adequada é a versão de 64 bits&lt;/strong&gt;. Foi a que eu instalei.&lt;/p&gt;    &lt;p&gt;Resolvi &lt;em&gt;matar&lt;/em&gt; a partição que estava instalado o &lt;em&gt;XP&lt;/em&gt;. Sem dó nem piedade, cliquei no Formatar quando me foi apresentado as opções de onde instalar o Windows.&lt;/p&gt;    &lt;p&gt;Daí por diante, a instalação foi padrão: configurei o idioma, o layout do teclado, algumas outras informações e os arquivos são copiados.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_Kzg5fUTKXVY/SueWRZEgNrI/AAAAAAAAH4A/IwWPEtYOJL0/s1600-h/241020091766%5B1%5D%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="241020091766[1]" border="0" alt="241020091766[1]" src="http://lh6.ggpht.com/_Kzg5fUTKXVY/SueWSDd-mkI/AAAAAAAAH4E/-1g5wuQJLHA/241020091766%5B1%5D_thumb%5B3%5D.jpg?imgmax=800" width="288" height="216" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Terminada a cópia, mais um boot, e foi onde configurei a data/hora, conta de usuário, inserir o serial…&lt;/p&gt;    &lt;p&gt;Durante o boot, notei uma coisa: ele não apresentou o menu de boot com a opção de startar o &lt;strong&gt;Vista&lt;/strong&gt;. Sim, esse Vista é uma versão &lt;strike&gt;pirata&lt;/strike&gt; não oficial mesmo, deveria ter sido crackeada com um lance de ROM BIOS, alguma coisa assim, pois no boot aparecia algo bem rápido na tela. E outra, a ISO que baixei era bem capada, alguns recursos foram retirados e nem instalava o SP2. Bem, agora posso dizer que essa versão não está fazendo falta nenhuma.&lt;/p&gt;    &lt;p&gt;Primeiro boot pós-instalação, o desktop me é exibido, e vou logo ver as propriedades de sistema: &lt;strong&gt;TODO o meu hardware básico foi reconhecido de primeira&lt;/strong&gt;: placa mãe, placa de TV, dongle bluetooth, placa de vídeo.&lt;/p&gt;    &lt;p&gt;Ativei o sistema, e ele logo foi fazendo um &lt;em&gt;Windows Update&lt;/em&gt;, que atualizou mais alguns drivers e instalou o software da webcam, do teclado e do mouse Microsoft.&lt;/p&gt;    &lt;p&gt;Baixei do site da &lt;a href="www.gigabyte.com.tw" rel="nofollow" target="_blank"&gt;Gigabyte&lt;/a&gt; o driver da placa de som, na versão &lt;strong&gt;Windows Seven de 64 Bits&lt;/strong&gt;. Fiz isso para poder ter o painel de controle nativo da placa. Quando eu instalei o Windows, a placa de som foi reconhecida.&lt;/p&gt;    &lt;p&gt;UAU!!! TODO o meu hardware reconhecido, e &lt;strong&gt;NÃO baixei NENHUM outro driver&lt;/strong&gt;. Até minha placa ATI não precisou baixar driver! E o vídeo funcionou com &lt;strong&gt;Aero&lt;/strong&gt; e tudo!&lt;/p&gt;    &lt;p&gt;Os freetards se gabam pela capacidade do Linux reconhecer bem hardware. Claro que não todos os hardwares são reconhecidos pelo Linux (e pelo Windows também), necessitando de algumas gambis… Dessa vez, o Tio Bill acertou a mão hehe.&lt;/p&gt;    &lt;p&gt;Fiz o teste do &lt;strong&gt;Índice de Experiência do Windows&lt;/strong&gt; e obtive nota 5,9, que foi definida pelo meu disco rígido. Abaixo você pode ver o resultado completo.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Kzg5fUTKXVY/SueWTMBkolI/AAAAAAAAH4I/CAvrBDCImXY/s1600-h/Indice%20de%20Experiencia%20do%20Windows%5B1%5D%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Indice%20de%20Experiencia%20do%20Windows[1]" border="0" alt="Indice%20de%20Experiencia%20do%20Windows[1]" src="http://lh5.ggpht.com/_Kzg5fUTKXVY/SueWT1u-OUI/AAAAAAAAH4M/y1kiOTbnUkg/Indice%20de%20Experiencia%20do%20Windows%5B1%5D_thumb%5B3%5D.jpg?imgmax=800" width="400" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Agora, hora de instalar o &lt;strong&gt;software básico&lt;/strong&gt;. Vou listar cada programa que instalei, já com as ressalvas:&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Firefox 3.5&lt;/strong&gt; –&amp;gt; Fiz backup da versão que eu tinha, 3.0 e restaurei o perfil no 3.5. Algumas extensões deixaram de funcionar, mas não foi por causa do Windows. Funcionou perfeitamente.&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;TweetDeck&lt;/strong&gt; –&amp;gt; Instalou o runtime do Adobe Air. Funcionou perfeitamente.&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Foxit Reader&lt;/strong&gt; (leitor de PDF)&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Skype&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Windows Live Essentials&lt;/strong&gt;: Messenger, Writer, Movie Maker e DVD Maker&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Outlook 2003&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Office 2007&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Antivírus Avira&lt;/strong&gt; (Free Edition)&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Alcohol 120% versão 1.9.8 build 7612&lt;/strong&gt;: Meu medo ao instalar o Alcohol é na hora de instalar o driver SCSI para a criação das unidades virtuais. Após instalar, ele necessita ser executado como administrador (botão direito, Executar como Administrador) para entrar e pede permissao para execução (olha o UAC entrando em ação!)&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Cyberlink DVD Suite&lt;/strong&gt; (veio com o gravador de DVD)&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Nero Express 7.9.6.0&lt;/strong&gt; (veio com o gravador de DVD)&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Notepad++&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;VMWare 6.0&lt;/strong&gt; (ele está hospedando VM’s de 32 bits)&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Nokia PC Suite&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Winamp&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;K-Lite Mega Codec Pack&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;FeedReader&lt;/strong&gt; (que vem com uma versão do Firebird Embeded)&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;PDF Creator&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Picasa 3&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;NS Virtual DJ 6.0&lt;/strong&gt;: Este necessitou ter uma chave do registro alterada. Como ele é um programa de 32 bits, o Windows Seven instalou-o em uma pasta “&lt;em&gt;Arquivos de Programas (x86)&lt;/em&gt;”. No registro, a chave &lt;em&gt;HKLM\SOFTWARE\Wow6423Node\VirtualDJ\HomeFolder&lt;/em&gt; estava apontando, em formato de nome do DOS, à pasta “&lt;em&gt;Arquivos de Programas&lt;/em&gt;” (onde são instalados os programas de 64 bits). Só foi mudar essa chave e meu programa de mixagens, onde produzo os podcasts do &lt;a href="http://neomatrixlight.leonelfraga.com" target="_blank"&gt;NM Light&lt;/a&gt;, começou a funcionar de boa! :-D&lt;/p&gt;    &lt;p&gt;- &lt;strong&gt;Visual Studio 2008&lt;/strong&gt; (alguns componentes são x64)&lt;/p&gt;    &lt;p&gt;Todos os programas acima são de 32 bits, e até agora não tive nenhum problema.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Jogos&lt;/strong&gt;: Além de alguns joguinhos antigos, como &lt;em&gt;Duke Nukem&lt;/em&gt;, &lt;em&gt;Need for Speed Underground&lt;/em&gt;, que rodaram bem, testei o &lt;em&gt;Racedriver GRID&lt;/em&gt;, um jogo um pouco mais pesado, para testar a necessidade de baixar o driver da placa de vídeo do site da ATI: não precisei baixar nada, o jogo rodou de boa, em resolução 1650x1080, com 2xAA e detalhes no máximo. Não cheguei a contar a taxa de frames por segundo, mas não tive nenhum engasgo.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_Kzg5fUTKXVY/SueWUpN6J2I/AAAAAAAAH4Q/jRJO8QE8VlU/s1600-h/desktop-seven%5B1%5D%5B5%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="desktop-seven[1]" border="0" alt="desktop-seven[1]" src="http://lh5.ggpht.com/_Kzg5fUTKXVY/SueWVpYnnsI/AAAAAAAAH4U/FC6ouC4yMyk/desktop-seven%5B1%5D_thumb%5B3%5D.jpg?imgmax=800" width="400" height="250" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Testei também a multimídia, especialmente a integração com a placa &lt;strong&gt;Pinnacle PCTV 110i&lt;/strong&gt;, que meu deu um trabalhão no Vista: O &lt;em&gt;Windows Media Center&lt;/em&gt; funcionou perfeitamente, tanto rádio quanto TV, não presenciei aquele &lt;em&gt;delay&lt;/em&gt; que relatei &lt;a href="http://neomatrixtech.leonelfraga.com/2009/08/pinnacle-pctv-110i-x-windows-media.html" target="_blank"&gt;neste post&lt;/a&gt;. &lt;strong&gt;O chato é que para utilizar a entrada S-Video, ele continua insistindo em uma interface de controle remoto&lt;/strong&gt; :-(&lt;/p&gt;    &lt;p&gt;O &lt;em&gt;Media Player Classic&lt;/em&gt; também funcionou de boa, e por ele, posso trocar para a entrada S-Video, ter o áudio através do Line-in da placa de som que tudo fica bem. Sim, não houve aquela tela de erro, como estava no post onde eu relatei a minha epopéia para usar a placa de captura.&lt;/p&gt;    &lt;p&gt;Só que o &lt;em&gt;WinampTV&lt;/em&gt; não funcionou… aí sim, acho que ele só funciona em SO’s de 32 bits.&lt;/p&gt;    &lt;p&gt;Senti um pouco a diferença da barra de tarefas, especialmente na hora de abrir uma janela específica de um grupo e com a localização dos itens no Painel de Controle, pois estava acostumado ao jeitão clássico, mesmo no &lt;em&gt;Vista&lt;/em&gt;.&lt;/p&gt;    &lt;p&gt;Também demorei um pouquinho para descobrir como se acrescenta novos itens à pasta Programas do novo Menu Iniciar: Em uma pasta qualquer em “Todos os Programas”, cliquei com o botão direito e vi o seguinte caminho: “&lt;em&gt;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\&lt;/em&gt;”. Dentro dele, criei uma nova pasta, porém ao arrastar os arquivos com o botão direito para criar o atalho, o Windows mostrou uma mensagem que não pode ser criado.&lt;/p&gt;    &lt;p&gt;Pois bem: Criei o atalho na própria pasta do programa e o movi para essa pasta nova no Menu Iniciar. Foi de boa.&lt;/p&gt;    &lt;p&gt;E os &lt;strong&gt;Meus Documentos&lt;/strong&gt;? Como meu disco estava particionado, não necessitei de restaurar o backup que tinha feito: os dados estavam todos lá. Aí só foi colocar o meu diretório de uma das partições como um local da biblioteca Documentos. Menu Iniciar, botão direito na pasta Documentos, Propriedades. Depois, clique no botão “Incluir uma Pasta” e aponte o caminho desejado. Veja a tela abaixo:&lt;/p&gt;    &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_Kzg5fUTKXVY/SueWXJOmwTI/AAAAAAAAH4Y/S3xi0lqmc_A/s1600-h/image%5B5%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_Kzg5fUTKXVY/SueWYe58hYI/AAAAAAAAH4c/gBij-inL42w/image_thumb%5B3%5D.png?imgmax=800" width="400" height="273" /&gt;&lt;/a&gt; &lt;/p&gt;    &lt;p&gt;Fiz a mesma coisa para as bibliotecas Músicas e Imagens.&lt;/p&gt;    &lt;p&gt;Biblioteca? Sim, agora os “antigos” Meus Documentos, Minhas Músicas e Minhas Imagens podem apontar para mais de um lugar, para o mesmo usuário, como mostrado na imagem acima.&lt;/p&gt;    &lt;p&gt;Falhas, telas-azuis e afins? NENHUMA. Sim, o Seven está perfeito na minha máquina. Que me desculpem os freetards, mas dessa vez, o Tio Bill acertou a mão (sim, estou repetindo isso!)! A máquina está rodando muito melhor com o Seven x64. Linux? Eu uso em máquinas virtuais. Embora eu tenha adorado o Seven, não sou nenhum Wintard ou MSTard (talvez um CSharptard… quem sabe) ;-)&lt;/p&gt; &lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6431510018691746273-1316350630291079521?l=neomatrixtech.leonelfraga.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://neomatrixtech.leonelfraga.com/feeds/1316350630291079521/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://neomatrixtech.leonelfraga.com/2009/10/experiencia-com-o-windows-seven.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6431510018691746273/posts/default/1316350630291079521?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6431510018691746273/posts/default/1316350630291079521?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/neomatrixtech/~3/tykTdxbkmMs/experiencia-com-o-windows-seven.html" title="Experiência com o Windows Seven" /><author><name>Leonel Fraga de Oliveira</name><uri>http://www.blogger.com/profile/09609548420567560417</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09825095837423830724" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neomatrixtech.leonelfraga.com/2009/10/experiencia-com-o-windows-seven.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EFSHo6fCp7ImA9WxNWFUs.&quot;"><id>tag:blogger.com,1999:blog-6431510018691746273.post-3045104573329108944</id><published>2009-10-14T22:20:00.001-03:00</published><updated>2009-10-14T22:20:19.414-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-14T22:20:19.414-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="programação" /><title>Rapidinha: Visualizando propriedades em objetos lazy em um GridView</title><content type="html">&lt;p&gt;Se você utiliza como &lt;em&gt;DataSource&lt;/em&gt; de um &lt;em&gt;gridview&lt;/em&gt; uma coleção do tipo &lt;em&gt;List&amp;lt;&amp;gt;&lt;/em&gt; ao invés de um DataTable, pode ter uma hora que teremos que listar propriedades que não são de tipos primitivos (como DateTime, string, int), e sim &lt;em&gt;lazy&lt;/em&gt; com outros objetos.&lt;/p&gt;  &lt;p&gt;Vamos pegar como exemplo a classe TNivel do artigo anterior. Iremos construir um &lt;em&gt;GridView&lt;/em&gt; para listar as propriedades ID, Descrição, Próximo e Anterior, utilizando como DataSource do grid uma coleção do tipo List&amp;lt;TNivel&amp;gt;.&lt;/p&gt;  &lt;p&gt;Veja o trecho do XHTML abaixo:&lt;/p&gt;  &lt;pre class="brush:xhtml"&gt;&amp;lt;asp:GridView runat=&amp;quot;server&amp;quot; id=&amp;quot;gvNiveis&amp;quot;&amp;gt;
	&amp;lt;Columns&amp;gt;
		&amp;lt;asp:BoundField HeaderText=&amp;quot;Código&amp;quot; DataField=&amp;quot;Id&amp;quot; /&amp;gt;
		&amp;lt;asp:BoundField HeaderText=&amp;quot;Descrição&amp;quot; DataField=&amp;quot;Descricao&amp;quot; /&amp;gt;
		&amp;lt;asp:BoundField HeaderText=&amp;quot;Proximo&amp;quot; DataField=&amp;quot;Proximo.Descricao&amp;quot; /&amp;gt;
		&amp;lt;asp:BoundField HeaderText=&amp;quot;Anterior&amp;quot; DataField=&amp;quot;Proximo.Anterior&amp;quot; /&amp;gt;
	&amp;lt;/Columns&amp;gt;
&amp;lt;/asp:GridView&amp;gt;&lt;/pre&gt;

&lt;p&gt;Compile isso, e você será brindado com uma mensagem de erro.&lt;/p&gt;

&lt;p&gt;Como pudemos ver no artigo anterior, as propriedades Proximo e Anterior são objetos do tipo TNivel, e ao listar os campos Descricao das propriedades Proximo e Anterior em um BoundColumn ele não aceita da forma que colocamos.&lt;/p&gt;

&lt;p&gt;Como resolvemos isso &lt;strong&gt;sem apelar para o evento &lt;em&gt;OnRowDataBound&lt;/em&gt;&lt;/strong&gt; e preencher as células manualmente?&lt;/p&gt;

&lt;p&gt;Solução:&lt;/p&gt;

&lt;p&gt;Crie, para cada campo, uma &lt;strong&gt;TemplateColumn&lt;/strong&gt; e dentro do &lt;strong&gt;ItemTemplate&lt;/strong&gt; coloque um &lt;em&gt;Label&lt;/em&gt;. Na propriedade &lt;em&gt;Text&lt;/em&gt; de cada &lt;em&gt;Label&lt;/em&gt;, coloque o seguinte comando:&lt;/p&gt;

&lt;pre class="brush:xhtml"&gt;Text='&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Nivel.Descricao&amp;quot;) %&amp;gt;'&lt;/pre&gt;

&lt;p&gt;Com a diretiva &lt;strong&gt;DataBinder.Eval&lt;/strong&gt; (parecida com a &lt;strong&gt;#Bind&lt;/strong&gt;, que chegamos a utilizar em artigos anteriores), podemos fazer o &lt;em&gt;Bind&lt;/em&gt; de objetos com &lt;em&gt;lazy&lt;/em&gt;, que tenham enfim as propriedades com tipos primitivos.&lt;/p&gt;

&lt;p&gt;Veja como ficou nosso grid:&lt;/p&gt;

&lt;pre class="brush:xhtml"&gt;&amp;lt;asp:GridView runat=&amp;quot;server&amp;quot; id=&amp;quot;gvNiveis&amp;quot;&amp;gt;
	&amp;lt;Columns&amp;gt;
		&amp;lt;asp:BoundField HeaderText=&amp;quot;Código&amp;quot; DataField=&amp;quot;Id&amp;quot; /&amp;gt;
		&amp;lt;asp:BoundField HeaderText=&amp;quot;Descrição&amp;quot; DataField=&amp;quot;Descricao&amp;quot; /&amp;gt;
		&amp;lt;asp:TemplateColumn HeaderText=&amp;quot;Proximo&amp;quot;&amp;gt;
			&amp;lt;ItemTemplate&amp;gt;
				&amp;lt;asp:Label runat=&amp;quot;server&amp;quot; ID=&amp;quot;lbProx&amp;quot; Text='&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Proximo.Descricao&amp;quot;) %&amp;gt;'&amp;gt;&amp;lt;/asp:Label&amp;gt;
			&amp;lt;/ItemTemplate&amp;gt;
		&amp;lt;/asp:TemplateColumn&amp;gt;
		&amp;lt;asp:TemplateColumn HeaderText=&amp;quot;Anterior&amp;quot;&amp;gt;
			&amp;lt;ItemTemplate&amp;gt;
				&amp;lt;asp:Label runat=&amp;quot;server&amp;quot; ID=&amp;quot;lbAnt&amp;quot; Text='&amp;lt;%# DataBinder.Eval(Container.DataItem, &amp;quot;Anterior.Descricao&amp;quot;) %&amp;gt;'&amp;gt;&amp;lt;/asp:Label&amp;gt;
			&amp;lt;/ItemTemplate&amp;gt;
		&amp;lt;/asp:TemplateColumn&amp;gt;
	&amp;lt;/Columns&amp;gt;
&amp;lt;/asp:GridView&amp;gt;&lt;/pre&gt;

&lt;p&gt;Enfim, é isso aí!&lt;/p&gt;

&lt;p&gt;Um abraço :-)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6431510018691746273-3045104573329108944?l=neomatrixtech.leonelfraga.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://neomatrixtech.leonelfraga.com/feeds/3045104573329108944/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://neomatrixtech.leonelfraga.com/2009/10/rapidinha-visualizando-propriedades-em.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6431510018691746273/posts/default/3045104573329108944?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6431510018691746273/posts/default/3045104573329108944?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/neomatrixtech/~3/tKQs6GEpYQc/rapidinha-visualizando-propriedades-em.html" title="Rapidinha: Visualizando propriedades em objetos lazy em um GridView" /><author><name>Leonel Fraga de Oliveira</name><uri>http://www.blogger.com/profile/09609548420567560417</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09825095837423830724" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neomatrixtech.leonelfraga.com/2009/10/rapidinha-visualizando-propriedades-em.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAASXc7eyp7ImA9WxNXFko.&quot;"><id>tag:blogger.com,1999:blog-6431510018691746273.post-2583397259260190579</id><published>2009-10-04T13:41:00.001-03:00</published><updated>2009-10-04T13:45:48.903-03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-04T13:45:48.903-03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="POG" /><category scheme="http://www.blogger.com/atom/ns#" term="programação" /><title>Momento POG: Armadilha da POO com autorrelacionamentos</title><content type="html">&lt;p&gt;Depois de um tempinho sem postagens de programação, finalmente arrumei uma coisnha para poder compartilhar contigo!&lt;/p&gt;  &lt;p&gt;Quando você modela uma classe a partir de uma tabela, como você faz com aqueles campos de chave estrangeira, que apontam para uma outra tabela que porventura se torne uma classe também?&lt;/p&gt;  &lt;p&gt;Se fomos seguir 100% a POO, devemos fazer um &lt;em&gt;lazy&lt;/em&gt; com o objeto em questão, ou seja, criar uma variável privada cujo tipo corresponda a classe daquela tabela, e a sua exposição, se for o caso, em uma propriedade.&lt;/p&gt;  &lt;p&gt;Vamos tomar a seguinte tabela como exemplo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_Kzg5fUTKXVY/SsjQOPZ-2UI/AAAAAAAAHak/Br-pSgWFB9Q/s1600-h/image%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Tabela Niveis" border="0" alt="Tabela Niveis" src="http://lh3.ggpht.com/_Kzg5fUTKXVY/SsjQO57rNOI/AAAAAAAAHao/Tgu13V7_8ls/image_thumb%5B2%5D.png?imgmax=800" width="215" height="106" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;É uma tabela simples, possuindo quatro campos. O detalhe é que os campos ANTES e PROXIMO relacionam-se com o campo ID da mesma tabela, ou seja, um &lt;strong&gt;autorrelacionamento&lt;/strong&gt; (é, com a nova ortografia fica esquisito hehe), ou em jargão menos técnico, uma “&lt;strong&gt;&lt;em&gt;tabela que morde o próprio rabo&lt;/em&gt;&lt;/strong&gt;”. E por duas vezes.&lt;/p&gt;  &lt;p&gt;Vamos implementar uma classe (em C#, claro, porém, de forma bem simplificada, sem tratamento de erro e tal!) para a tabela em questão:&lt;/p&gt;  &lt;pre class='brush: c-sharp'&gt;public class TNivel
{
	#region Variáveis Privadas
	private int _Id;
	private string _Descricao;
	private TNivel _Antes;
	private TNivel _Proximo;
	#endregion
	
	#region Propriedades
	public int Id {get {return _Id;} set {_Id = value;}}
	public string Descricao {get {return _Descricao;} set {_Descricao = value;}}
	public TNivel Antes {get {return _Antes;} set {_Antes = value;}}
	public TNivel Proximo {get {return _Proximo;} set {_Proximo = value;}}
	#endregion
	
	#region Métodos
	public TNiveis(int pNivelId)
	{
		if(pNivelId != null)
		{
			DataReader dr = getReader(&amp;quot;select * from NIVEIS where ID = &amp;quot; + pNivelId.ToString());
			if(dr.HasRows)
			{
				_Id = (int)dr[&amp;quot;ID&amp;quot;];
				_Descricao = (string)dr[&amp;quot;DESCRICAO&amp;quot;];
				_Antes = new TNivel((int)dr[&amp;quot;ANTES&amp;quot;]);
				_Proximo = new TNivel((int)dr[&amp;quot;PROXIMO&amp;quot;]);
			}
		}
	}
	#endregion
}&lt;/pre&gt;

&lt;p&gt;Como você pode ver, os campos PROXIMO e ANTES foram implementados como objetos do tipo TNivel, pois eles são como “&lt;strong&gt;ponteiros&lt;/strong&gt;”, apontando para objetos do mesmo tipo.&lt;/p&gt;

&lt;p&gt;O construtor desta classe recebe um ID de nível, e atribui os valores às variáveis privadas, e no caso das variáveis _&lt;em&gt;Antes&lt;/em&gt; e _&lt;em&gt;Proximo&lt;/em&gt;, ele cria uma nova instância da classe &lt;em&gt;TNivel&lt;/em&gt;, passando o respectivo ponteiro em seu construtor.&lt;/p&gt;

&lt;p&gt;Vamos inserir alguns dados na tabela?&lt;/p&gt;

&lt;pre&gt;--------------------------------------
ID   DESCRICAO     ANTES    PROXIMO
1    NIVEL 1       NULL     2
2    NIVEL 2       1        3
3    NIVEL 3       2        NULL
--------------------------------------&lt;/pre&gt;

&lt;p&gt;Montamos os dados nessa tabela de forma que representasse uma lista encadeada, sendo o primeiro nível apontando para o segundo, o segundo apontando para o primeiro e para o terceiro, e o terceiro apontando para o segundo e fechando o encadeamento.&lt;/p&gt;

&lt;p&gt;Vamos criar uma instância do nível 1:&lt;/p&gt;

&lt;pre class='brush: c-sharp'&gt;TNivel Nivel1 = new TNivel(1);&lt;/pre&gt;

&lt;p&gt;Quando você executou esse código, notou que o programa ficou parado?&lt;/p&gt;

&lt;p&gt;Pois é, o programa fica travado nessa linha! P##ra, o que aconteceu aí, parece que ficou em um looping eterno e não tem nenhum laço!&lt;/p&gt;

&lt;p&gt;Vamos fazer agora o bom e velho teste de mesa no método construtor:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Nivel1: O método obtém os dados de um DataReader &lt;/li&gt;

  &lt;li&gt;Nivel1: Se o DataReader contiver algum registro, continua, senão, cai fora &lt;/li&gt;

  &lt;li&gt;Nivel1: A propriedade Id é alimentada &lt;/li&gt;

  &lt;li&gt;Nivel1: A propriedade Descrição é alimentada &lt;/li&gt;

  &lt;li&gt;Nivel1: Uma nova instância da classe TNivel é inicializada na variável _Antes, e é passado NULL como parâmetro &lt;/li&gt;

  &lt;li&gt;Nivel1._Antes: O construtor é executado, obtendo os dados de um DataReader &lt;/li&gt;

  &lt;li&gt;Nivel1._Antes: O Select não retornou registros, então, cai fora &lt;/li&gt;

  &lt;li&gt;Uma nova instância da classe TNivel é inicializada na variável _Proximo, e é passado “2” como parâmetro. &lt;/li&gt;

  &lt;li&gt;Nivel1._Proximo: O construtor é executado, obtendo os dados de um DataReader &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo: O Select retornou um registro, portanto, vamos alimentar as variáveis &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo: A variável Nivel1.Proximo._Id é alimentada &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo: A variável Nivel1.Proximo._Descricao é alimentada &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo: Uma nova instância da classe TNivel é criada na variável _Antes, e é passado “1” como parâmetro em seu construtor &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo.Antes: O construtor é executado, obtendo os dados de um DataReader &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo.Antes: O Select retornou um registro (os dados do Nível 1), então, continua. &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo.Antes: As variáveis _Id e _Descricao são alimentadas. &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo.Antes: Uma nova instância de TNivel é criada na variável _Antes, e é passado NULL como parâmetro &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo.Antes.Antes: Obtém os dados de um DataReader, porém o Select não retornou nada. &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo.Antes: Uma nova instância de TNivel é criada na variável _Proximo, e é passado “2” como parâmetro em seu construtor &lt;/li&gt;

  &lt;li&gt;Nivel1.Proximo.Antes.Proximo: Bem, aí vc já sabe, basta retornar ao passo 9 :-) &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Notaram que conforme ele carrega os objetos _Antes e _Proximo ele vai criando instâncias de &lt;em&gt;TNivel&lt;/em&gt; “aninhadas”? Pois é, neste caso que apresentamos, um nível sempre faz referência com pelo menos um outro nível.&lt;/p&gt;

&lt;p&gt;Ficamos em uma sinuca de bico… Manter o paradigma POO neste caso não é viável, pois o programa fica criando estas instâncias aninhadas enquanto haver memória para tal. Como saímos disso, sendo que queremos expor os níveis Próximo e Antes como um objeto &lt;em&gt;TNivel&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Graças à instituição POG temos a solução para este caso!!! Vejam o código modificado de forma que as instâncias de &lt;em&gt;TNivel&lt;/em&gt; nas propriedades Proximo e Antes sejam criadas conforme elas são acessadas:&lt;/p&gt;

&lt;pre class='brush: c-sharp'&gt;public class TNivel
{
	#region Variáveis Privadas
	private int _Id;
	private string _Descricao;
	private int _Antes;
	private int _Proximo;
	private TNivel _oAntes;
	private TNivel _oProximo;
	#endregion
	
	#region Propriedades
	public int Id {get {return _Id;} set {_Id = value;}}
	public string Descricao {get {return _Descricao;} set {_Descricao = value;}}
	public TNivel Antes {get {return new TNivel(_Antes);} set {_oAntes = value;}}
	public TNivel Proximo {get {return new TNivel(_Proximo);} set {_oProximo = value;}}
	#endregion
	
	#region Métodos
	public TNiveis(int pNivelId)
	{
		if(pNivelId != null)
		{
			DataReader dr = getReader(&amp;quot;select * from NIVEIS where ID = &amp;quot; + pNivelId.ToString());
			if(dr.HasRows)
			{
				_Id = (int)dr[&amp;quot;ID&amp;quot;];
				_Descricao = (string)dr[&amp;quot;DESCRICAO&amp;quot;];
				_Antes = (int)dr[&amp;quot;ANTES&amp;quot;];
				_Proximo = (int)dr[&amp;quot;PROXIMO&amp;quot;];
			}
		}
	}
	#endregion
}&lt;/pre&gt;

&lt;p&gt;Note que agora no construtor de TNivel armazenamos os ID dos níveis Proximo e Antes nas variáveis privadas _Antes e _Proximo, e expomos como propriedade um objeto do tipo &lt;em&gt;TNivel&lt;/em&gt;, que em seu método get cria uma nova instância de &lt;em&gt;TNivel&lt;/em&gt; com o ID armazenado na variável privada correspondente.&lt;/p&gt;

&lt;p&gt;Armazenando os ID’s ao invés de criar uma nova instância diretamente, evita com que ele a aplicação crie as instâncias aninhadas do caso anterior, e somente carregue o nível através das propriedades Proximo e Antes conforme elas são chamadas pela aplicação, sempre armazenando o ID ao invés de criar uma nova instância no construtor.&lt;/p&gt;

&lt;p&gt;Então, quando você se deparar com uma situação de autorrelacionamento e quiser manter a POO, use este procedimento, que você não terá problemas!&lt;/p&gt;

&lt;p&gt;Um abraço!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6431510018691746273-2583397259260190579?l=neomatrixtech.leonelfraga.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://neomatrixtech.leonelfraga.com/feeds/2583397259260190579/comments/default" title="Postar comentários" /><link rel="replies" type="text/html" href="http://neomatrixtech.leonelfraga.com/2009/10/momento-pog-armadilha-da-poo-com.html#comment-form" title="0 Comentários" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6431510018691746273/posts/default/2583397259260190579?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6431510018691746273/posts/default/2583397259260190579?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/neomatrixtech/~3/TCB8RY-lbHM/momento-pog-armadilha-da-poo-com.html" title="Momento POG: Armadilha da POO com autorrelacionamentos" /><author><name>Leonel Fraga de Oliveira</name><uri>http://www.blogger.com/profile/09609548420567560417</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="09825095837423830724" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://neomatrixtech.leonelfraga.com/2009/10/momento-pog-armadilha-da-poo-com.html</feedburner:origLink></entry></feed>
