PHP Orientado a Objeto, Segunda Parte.

Categoria(s): (Coding) por GuZ em 20-10-2008

Tags : , , , , ,

Como eu prometi no post anterior, vou colocar aqui no Wii Are Nerds a segunda parte do tutorial sobre como “brincar” de orientação a objetos com PHP.

Subclasses:

Uma classe pode trabalhar com uma extensão, herdando assim todas as variáveis e funções da classe-pai. No PHP não é permitido uma herança múltipla, ou seja, a classe-filha só pode ter um pai ou simplificando uma classe pode ser extensão de apenas UMA outra classe.

Código:

  1. class novaconta extends conta{
  2.          var $num;
  3.          function vernum(){
  4.                return $this->num;
  5.           }
  6. }

A classe que eu mostrei agora tem origem na classe do exemplo anterior ela tem todas as variáveis, todas as funções da classe anterior e ainda ganhou a variável $num e a função vernum().

No mundo real, poderíamos pegar uma impressora e utiliza-la como exemplo:

  1. class impressora {
  2.       $var cartucho;
  3.        $var tinta;
  4.       function imprimir()
  5.       {
  6.       }
  7. }
  8. class multifuncional extends impressora {
  9.      $var copiadora;
  10.      …
  11.      function scan()
  12.      {
  13.      }
  14.     
  15.     function copiar()
  16.    {  
  17.    
  18.   }
  19. }

É bom lembrar que o PHP trabalha de forma estruturada, ou seja, ele lê o código de cima para baixo. Então é bom ver a ordem em que as classes são criadas.

As Classes precisam ser criadas ANTES de serem usadas, por exemplo, se eu tivesse colocado uma chamada para a função imprimir() na primeira linha do código, o PHP não encontraria minha impressora.

(obs… o exemplo da impressora é apenas para facilitar a abstração)

Construtores:

Um construtor é uma função que é chamada automaticamente quando a classe é definida pelo operador new. e deve ter o mesmo nome da classe que ele pertence:

  1. class conta{
  2.     var $saldo;
  3. function conta()
  4. {
  5.     $this->saldo = 100000000 # Queria que o Banco do Brasil tivesse feito isso qdo eu abri minha conta :P
  6. }
  7. function ver()
  8. {
  9. ….
  10. }^
  11. }

Vejam que eu resumi o código (para o post não ficar muito grande).

Agora nosso banco tem uma função que adiciona R$ 100.000.000,00 no saldo de uma conta quando ela é criada. Tudo isso foi definido na função conta(). O mais interessante é que os construtores suportam argumentos, o que torna este recurso muito mais interessante.

É importante ressaltar que embora os valores sejam herdados, o construtor da classe pai não é iniciado quando se chama um operador da classe-filha.

Bom, minha introdução a Orientação a Objeto fica por aqui, e agora cabe a você desenvolver seus programas orientados a objeto utilizando a linguagem PHP.

Algumas ferramentas para desenvolver em PHP usando Orientação a Objeto:

ZendStudio: Para quem está programando em PHP e precisa usar OO, o Zend Studio é a melhor ferramenta que eu conheço para programar. O Problema é que eu não encontrei ele disponível para compra no Brasil.

Zend Framework. Pra que ficar reinventando a roda? Use o framework ZEND e facilite seu trabalho. ;-).

Tirando a aplicação da barra de tarefas no Delphi 2007 ou mais novo

Categoria(s): (Delphi | Object Pascal) por Naftali em 22-09-2008

Tags : , , ,

Olá pessoal, ultimamente estive trabalhando em um projeto novo que, por fim, resolvi desenvolver na versão mais nova do Delphi. Até o fim estava dando tudo certo, até que precisei fazer uma coisa: Tirar a aplicação da barra de tarefas.

Bom, até a versão 2006 do Delphi, essa era uma tarefa simples, bastava colocar o seguinte código no evento OnCreate:

  1. ShowWindow(Application.Handle, SW_HIDE) ;
  2. SetWindowLong(Application.Handle, GWL_EXSTYLE, getWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW) ;
  3. ShowWindow(Application.Handle, SW_SHOW) ;

Pois bem, fui tentar fazer o mesmo e a aplicação continuava lá, quebrei a cabeça para descobrir o problema. Até que, navegando pela internet, descobri que a partir da versão 2007 do Delphi (e do C++ Builder), a Classe TApplication possui uma propriedade chamada MainFormOnTaskbar.

O que ela faz? 

A princípio, essa propriedade tem o valor true, que significa que o botão na barra de tarefas representa o form principal, e leva consigo o título do mesmo. Mas, quando setada para false, ele representa uma janela escondida da aplicação e leva o título da aplicação e não do form. Essa janela escondida foi usada até a versão 2006 para gerenciar as janelas da aplicação, a partir da versão 2007 isso mudou. Por isso essa propriedade existe, ou seja, para manter compatibilidade com projetos desenvolvidos em versões antigas, tanto que, ao importar um projeto desenvolvido no Delphi 2006 ou menor, essa propriedade fica false.

Então, para poder ter o efeito desejado (que era sumir com a aplicação da barra de tarefas), é necessário mudar a propriedade para false (no arquivo .dpr, logo abaixo de Application.Initialize), e então colocar o seguinte código no evento OnShow e no OnActivate do form principal:

  1. ShowWindow(Application.Handle, SW_HIDE);

E está feito, sua aplicação não mais aparecerá na barra. 

Há coisas que nem Freud explica

Categoria(s): (C/C++, Coding, Rapidinhas) por Naftali em 23-08-2008

Tags : , ,

Pois bem, estava eu, programando como sempre, quando percebi que meu programa começou a dar alguns erros estranhos. Ao estudar os parâmetros vi que tudo estava correto. Mas mesmo assim o programa insistia em fazer o contrário do que imaginava.

Então resolvi dar a minha última cartada: Depurar o código com nosso querido break-point (pode parecer estranho, mas eu tento evitar o break-point. Uso apenas quando o caso é supremo, como esse).

Pois é, ao depurar o código eu vi realmente que o programa estava entrando na condição contrária a que imaginava para aquela situação. Verifiquei os dados de entrada e estavam todos corretos.

- Caralho piii, o que tá acontecendo aqui? - Pensei comigo mesmo já na fúria.

Pois então resolvi ver qual era o real valor que estava dando a condição. Acredita que era verdadeiro? E mesmo assim entrava no else? Não acredita? Veja com seus próprios olhos!

Eae, algum palpite?

Trabalhando com registro do Windows, eca

Categoria(s): (Nerd) por Naftali em 03-08-2008

Tags : ,

Alguém aqui acha que o registro do Windows é uma zona desorganizado?

Pois é, eu apoio sua idéia e a endorso com o seguinte fato:

Estou trabalhando com uma aplicação que, dentre outras coisas, muda o papel de parede do windows. Pois bem, comecei a pesquisar e descobri que mudar o endereço da imagem no registro diretamente, apesar de funcional, não atualiza a sua área de trabalho, sendo necessário o usuário ou reiniciar o computador, ou mandar aplicar o papel de parede pelo utilitário do windows mesmo.

Não era bem esse efeito que eu queria, então descobri que com a API do windows eu posso ter o efeito que quero. Lindo! Porém tem um problema: Em que lugar que eu passo parâmetro para o tipo de papel de parede (centralizado, esticado e lado-a-lado)? Pois é, não é pela API.

Ao pesquisar pela internet, descobri que existem dois parâmetros no registro (HKCU\Control Panel\Desktop), chamados WallpaperStyle e TileWallpaper. Sim, não é em um lugar que você muda o tipo, mas em dois (como se fosse possível ter dois estilos ao mesmo tempo, mas tudo bem). Só que pior do que isso é o valor necessário para cada configuração. Vejam:

  • Esticado: WallpaperStyle = 2 e TileWallpaper = 0
  • Centralizado: WallpaperStyle = 0 e TileWallpaper = 0
  • Lado a Lado: WallpaperStyle = 0 e TileWallpaper = 1

Primeiro: Não seria mais fácil criar uma propriedade apenas, que varie entre 0, 1 e 2?

Segundo: Alguém por favor me explique, por que esses valores têm que estar escritos como STRING? Onde já se viu valores inteiros (que nesse caso poderiam até ser booleanos) serem guardados como string? (Eu tentei, se escrever como inteiro ele desconsidera os valores e joga apenas centralizado).

Agora convenhamos, o Windows é ou não é uma colcha de retalhos?

Manipulando registro em C

Categoria(s): (C/C++, Coding) por Naftali em 30-07-2008

Tags :

Olá, para iniciar meus posts na categoria Coding, vou ensinar como abrir chaves e escrever valores no registro. É uma aplicação bem simples que utiliza a API do windows.

Nessa aplicação eu vou mostrar como fazer para trocar o papel de parede do windows (Lembrando que quando se escreve o endereço do papel de parede manualmente no registro é preciso reiniciar o computador para aplicar).

  1. #include < windows.h >
  2. #include < stdio.h >
  3. #include < conio.h >
  4. #include < strings.h >
  5.  
  6. #define MAX_STRING 250
  7.  
  8. /*
  9.         Essa aplicação tem como finalidade demonstrar algumas formas de manipular
  10.         o registro do windows. Nesse exemplo, vamos mudar o papel de parede do
  11.         usuário atual
  12.  
  13.         Aplicação criada por: Naftali Andrade Santos
  14.         Site: blog.wiiarenerds.com.br
  15. */
  16. main()
  17. {
  18.         // variável que vai conter o caminho para a imagem que vai ser o papel de
  19.         // parede
  20.         char caminho[MAX_STRING];
  21.         // Essa variável vai conter o endereço de memória para a chave que foi
  22.         // aberta
  23.         HKEY chave;
  24.  
  25.         printf("Digite o caminho para a imagem: ");
  26.         gets(caminho);
  27.  
  28.         // Vamos abrir a chave que precisamos
  29.         if(RegOpenKey(HKEY_CURRENT_USER, "Control Panel\\Desktop", &chave) != 0)
  30.                 printf("Problemas ao abrir a chave, verifique se ela realmente existe");
  31.         else
  32.         {
  33.                 printf("Chave aberta com sucesso");
  34.                 // Depois de aberta vamos manipular algumas informações nela
  35.                 if(RegSetValueEx(chave, "WallPaper", 0, REG_SZ, (LPBYTE)caminho, strlen(caminho)) != 0)
  36.                    printf("\nOcorreu um erro ao escrever o valor!");
  37.                 else
  38.                    printf("\nValor escrito corretamente!");
  39.         }
  40.  
  41.         // Lembre-se de fechar a chave
  42.         RegCloseKey(chave);
  43.  
  44.         printf("\nPressione qualquer tecla para continuar");
  45.         getch();
  46. }

Link para o código-fonte: Registro - Source
Link para o executável: Registro - Executável

PS.: Esse post foi criado para responder a dúvida presente no forum Ajuda na Web. Segue o link: http://www.ajudanaweb.com/index.php?showtopic=427

Menu hold state

Categoria(s): (Coding, Flash | ActionScript) por Bruno Leles em 29-07-2008

Tags : , , ,

No forum Ajuda na Web, onde eu modero a seção de Flash / ActionScrip, surgiu um post em que me perguntaram se eu tinha um source de exemplo sobre a explicação que eu havia dado. Pensei então: “Acho que é um bom começo para a seção coding do blog. E ainda soluciono o problema dele”. Posto isso, resolvi fazer esse post.

Não é algo muito complicado, mas é bastante comum em sites em flash esse tipo de menu, onde o botão ao ser ‘clicado’ mantem o estado ativo, o resultado final será algo assim:

hold_state_menu

Nesse post vou focar somente na função do menu, para não deixar o post cansativo… let’s have some fun =D

Crie um novo documento no Flash, para ActionScript 2.0 e vá em Modify -> Document e configure ele como na figura abaixo:

Então, nesse documento, crie um novo MovieClip (Insert -> New Symbol ) com o nome de Menu:

Dentro do movieClip menu crie mais um movieClip (Insert -> New Symbol ) com o nome de Botao:

Agora desenhe e faça as animações de ativação e desativação do botão (movieClip Botao).
No primeiro frame e no frame que a animação de ativação estiver completa, coloque o action:

stop();

Dê o nome de ‘over’ para o segundo frame e o nome de ‘out’ para o imediatamente próximo a frame do fim da animação de ativação ( no exemplo esse frame é o de número 7 sendo que o frame com o label ‘out’ é o de número 8 ).

Agora voltando ao movieClip Menu, duplique 4 vezes o botão que você acabou de fazer, instancie cada um desses botões inclusive o botão origial com os nomes de bt0, bt1, bt2, bt3, bt4 respectivamente ( no exemplo os botões foram instanciados sequencialmente, visando simplificar o código para um melhor entendimento do problema ).

Agora, no primeiro frame do movieClip Menu, adicione o código abaixo:

// variável auxiliar
var selectedItem:MovieClip = null;

// aplicamos o controle nos botões
applyHoldStateControl(bt0);
applyHoldStateControl(bt1);
applyHoldStateControl(bt2);
applyHoldStateControl(bt3);
applyHoldStateControl(bt4);

// função que aplica os controles de ‘HoldState’ nos botões
function applyHoldStateControl(bt:MovieClip):Void {
bt.onRollOver = function() {
// ignoramos a chamada se o botão atual for o selecionado
if (selectedItem != this) {
this.gotoAndPlay(’over’);
}
};
bt.onRollOut = function() {
// ignoramos a chamada se o botão atual for o selecionado
if (selectedItem != this) {
this.gotoAndPlay(’out’);
}
};
bt.onRelease = function() {
// ignoramos a chamada se o botão ‘clicado’ for o mesmo que já esta selecionado
if (selectedItem != this) {
// se existir um botão selecionado então fechamos ele.
if (selectedItem != null) {
selectedItem.gotoAndPlay(’out’);
}
// definimos o botão selecionado como o atual
selectedItem = this;
// chamamos a função que executa as ações referentes a cada botão
callAction(this);
}
};
}

// function que é chamada quando se clica em um botão
function callAction(bt:MovieClip):Void {
switch (bt) {
case bt0 :// actions para botão 0
_root.imagens.gotoAndStop(2);
break;
case bt1 :// actions para botão 1
_root.imagens.gotoAndStop(3);
break;
case bt2 :// actions para botão N…
_root.imagens.gotoAndStop(4);
break;
case bt3 :
_root.imagens.gotoAndStop(5);
break;
case bt4 :
_root.imagens.gotoAndStop(6);
break;
}
_root.imagens.brilho.gotoAndPlay(2);
}

Agora abra o source desse tutorial e copie o movieClip imagens que esta na raiz do documento para o seu documento.

Agora aperte ctrl+enter e teste o seu Hold State Menu. ;)

É isso: um exemplo simples de como fazer um menu para começar a seção Coding. Se houver alguma dúvida deixem comentários ou mandem um email que tentarei ajudar da melhor forma possível.

Até a próxima.

Arquivo fonte desse tutorial: hold_state_menu
Imagens do Flickr: http://www.flickr.com/photos/vale-p/

Nova categoria no blog

Categoria(s): (Coding) por Bruno Leles em 24-06-2008

Tags :

Estamos inaugurando uma nova categoria no blog. A Progamming Dev Progamação Estrutura Desenvolvimento codeCoding‘.

Nessa categoria iremos postar artigos, tutoriais sobre progamação em geral, o foco baseado no conhecimento dos integrantes será: Desenvolvimento web utilizando, Flash, PHP, XML, ASP, ASP.net, DHTML, XHTML, CSS, JavaScript, etc e Desenvolvimento desktop C/C++, C# e Java, mais isso não impede de surgirem alguns experimentos utilizando outras linguagens, paradigmas ou tecnologias.

Espero que gostem e aproveitem a nova categoria do blog. E caso tenham algum assunto ou dúvida que vocês gostariam que nós comentássemos, mandem comentários que tentaremos ajudá-los da melhor forma possível.