Buscar

Delphi for php

nome

Rodrigo Carreiro MKourao

Colunista ainda sem descrição. Caro colunista, por favor envie-nos sua descrição.

Movendo os ícones da área e trabalho de suas aplicações

 
Introdução
 
Olá, meu nome é Rodrigo Carreiro, a antes que perguntem, não; não tenho nenhum parentesco com o Beto Carrero, alias sou sobrinho do Beto, mas é CARREIRO e devido a este “I” intrometido não posso entrar de graça no Parque do Beto Carreiro. (-:


 Falando sério agora, este é o primeiro de muitos artigos que pretendo escrever e postar aqui no Planeta Delphi, se os editores assim o permitirem e nesse primeiro artigo trataremos de um assunto que a meu ver enriquecem muito uma aplicação: “Os efeitos especiais”.


Nas próximas linhas nós vamos aprender de forma rápida, prática e objetiva uma maneira de adicionar aos ícones da área de trabalho da nossa aplicação a “faculdade” de serem movidos em tempo de execução, ou seja, o nosso usuário poderá movê-lo para qualquer lugar no formulário e deixa-lo lá. Mas não é só isso, aprenderemos também como salvar a posição que o usuário deixou para que ao iniciarmos a aplicação novamente o ícone esteja no mesmo lugar. E nossas rotinas serão as mais dinâmicas possíveis para que possam ser reaproveitadas. (POO)


O exemplo foi desenvolvido no Delphi 7, mas eu testei no Delphi 6 e no BDS 2006 e todos funcionaram perfeitamente bem. Então Mãos à Obra!!!!!


Criando o Formulário Principal
 
Inicie o delphi, por padrão ele já nos trás uma aplicação nova aberta pronto para ser usada, pressione Ctrl+Shift+S para salvar o projeto e salva na pasta de sua preferência. Dê o nome de uPrincipal.pas para a unit1 e MoveIcon.dpr para o projeto.
Adicione ao projeto um componente MainMenu (Crie alguns menus só para exemplo), um StatusBar e 5 Componenetes TImage. Nossos “Ícones” nada mais são do que imagens carregadas no componente TImage. Altere as propriedades Height e Width dos TImages para 48 cada uma e a Propriedade Stretch para True. Carrega uma imagem para cada TImage através da propriedade Picture, por exemplo, 1 para calculadora, 1 para internet, 1 para email, 1 para bloco notas e 1 para Sair da Aplicação.
Dica:
Exista um plugin que se instalado no delphi permite que imagens do tipo .png possam ser carregados nos TImages. Este formato de imagem e leve e possuem uma qualidade incrível e o melhor o fundo é transparente, ótimo para ser carregado como ícone. O plugin esta junto com o exemplo deste artigo, clique no link no final do artigo para baixá-lo.

Sua aplicação deverá estar como a figura abaixo:


Figura 1


Agora, vamos alterar os nomes de alguns componentes, pois faremos referência a eles no nosso código. Então renomeei o Form1 para FrmPrincipal, os TImage como IcoNet, IcoMail, IcoNote, IcoCalc, IcoExit. Altere as propriedade do FrmPrincipal: BorderStyle para bsSingle, Position para poScreenCenter, Height = 480, Width = 600 e WindowState para wsNormal. F9 para executar e verifique o resultado.



Implementando o Código
 
Para que os nossos ícones possam ser movidos, iremos codificar três eventos do componente TImage, são eles:
Ø      OnMouseDown (chamado quando o botão do mouse e pressionado sobre o componente)
Ø      OnMouseMove (chamado quando o componente é movido)
Ø      OnMouseUp (chamado quando se solta o botão do mouse sobre o componente)


O sistema vai funcionar da seguinte forma: No primeiro evento vamos capturar a posição de origem do nosso ícone, no segundo evento vamos mover o ícone para a posição que o ponteiro do mouse esta naquele momento e no terceiro evento vamos colocar o ícone na posição do ponteiro do mouse quando este evento foi chamado. Para isso vamos usar os parâmetros “x” e “y” que são passados pelos eventos.


Mais um detalhe, serão criadas três variáveis uma Booleana para informar se estamos ou não capturando a posição, uma do tipo Tpoint e outra do tipo TIniFile. O tipo de TPoint define a posição do pixel na tela, com a origem no canto esquerdo superior. X especifica a coordenada horizontal do ponto (left), Y especifica a coordenada vertical (top). Como o objetivo e fazer uma rotina dinâmica, que possa ser reaproveitada, fazer uso do parâmetro sender presente em todos os eventos e que informa o componente que chamou o evento.


Chega de papo e ao trabalho.


Primeiro Declare as variáveis na seção private do form:
  private
        Posicao : TPoint;
        Capturando : boolean;
        F : TINIFILE;
    { Private declarations }
  public
    { Public declarations }
  end;


Lembre-se de declarar o unit IniFiles na seção uses do form.
Selecione um dos 5 ícones, vá no object inspector na aba Events e dê um duplo clique no evento OnMouseDown e digite o código abaixo:


procedure TForm1.IconNetMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Capturando := true;
  Posicao.X := x;
  Posicao.Y := Y;
end;


*Entendendo o Código*


Primeiro alteramos a variável capturando para true para verificarmos no próximo evento se estamos ou não capturando, ou seja, com o botão pressionado. Depois salvamos a posição do ponteiro do mouse na variável Posição.X e Posição.Y.
Agora vá ao evento onMouseMove e digite o Código abaixo:


procedure TFrmPrincipal.IcoAgendaMouseMove(Sender: TObject;
  Shift: TShiftState; X, Y: Integer);
begin
 if Capturando then
   begin
    If ((Sender as  Timage).Left -(Posicao.x-x) < (Self.ClientWidth - (Sender as TImage).Width)) and ((Sender as  Timage).Left -( Posicao.x-x) > 0) then
        (Sender as  Timage).Left := (Sender as  Timage).Left -( Posicao.x-x);
    If ((Sender as Timage).top -( Posicao.y-y) < (Self.Clientheight)-(Sender as TImage).Height - 20) and ((Sender as  Timage).top -(Posicao.y-y) > 0) then
        (Sender as Timage).Top := (Sender as  Timage).Top - (Posicao.Y-y);
  end;
end;


*Entendendo o Código*


Primeiro verificamos se estamos ou não “capturando”, ou seja, se o botão do mouse foi pressionado, pois de outra maneira esse evento seria chamado sempre que o mouse passasse por cima deste componente. Feito isso fazemos uma segunda verificação para saber se o ponteiro do mouse esta ainda na área útil do formulário por isso uso a propriedade ClientHeight e ClienteWidth pois estão são as medidas de área livre do form fora o menu e a StatusBar para que o ícone não possa ser arrastado para baixo das mesmas.


Note que eu uso o parâmetro Sender para fazer referencia ao objeto, isso porque vamos aproveitar essa rotinas para os outros 4 ícones.


E por fim vá ao evento onMouseUp e digite o Código abaixo:


Procedure TFrmPrincipal.IcoAgendaMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
left, top : integer;
begin
if Capturando then
  begin
    Capturando :=  false;
      If ((Sender as  Timage).Left -(Posicao.x-x) < (Self.ClientWidth - (Sender as TImage).Width)) and ((Sender as  Timage).Left -(Posicao.x-x) > 0) then
          (Sender as  Timage).Left := (Sender as  Timage).Left - (Posicao.x -x);
      If ((Sender as  Timage).top -(Posicao.y-y) < (Self.Clientheight - (Sender as TImage).height)- 20) and ((Sender as  Timage).top -(Posicao.y-y) > 0) then
          (Sender as  Timage).Top := (Sender as  Timage).Top - (Posicao.y - y);
    left := (Sender as  Timage).Left;
    top := (Sender as  Timage).Top;
    F := Tinifile.Create('c:\Icones.ini');
    F.Writeinteger((Sender as  Timage).Name ,'Left',Left);
    F.WriteInteger((Sender as  Timage).Name,'top',top);
    F.Free;
  end;
end;


*Entendendo o Código*
Novamente verificamos se estamos ou não “capturando”, ou seja, se o botão do mouse ainda está pressionado, se sim iniciamos a rotina alterando a variável para false, pois o botão foi liberado, pois da mesma forma que no evento anterior esse seria chamado sempre que o botão fosse liberado sobre este componente. Feito isso fazemos uma segunda verificação para verificar novamente se o ponteiro do mouse está na área útil do formulário. Se estas condições forem satisfeitas então posicionamos nosso ícone na posição do ponteiro do mouse.
Note que duas variáveis foram criadas neste evento: Left – Top, que servirão para o próximo processo onde salvamos a posição atual do ícone em um arquivo INI. Nomeamos as Seções do nosso Ini com o nome de cada componente mais uma vês para dinamizar a rotina.
Antes de testarmos, seleciones os outros 4 ícones, vá na object inspector e aponte os três eventos usados acima para os eventos já configurados para o primeiro ícone:



Figura 2



Bem se todos os passos forem seguidos, execute a aplicação e veja o resultado (F9).



Finalizando oExemplo
 
Para terminar resta-nos criarmos a rotina para carregarmos a última posição do ícone quando a aplicação for executada novamente, faremos isso lendo as posições gravadas no arquivo. Vá no evento onCreate do form e digite o código abaixo:



Procedure TFrmPrincipal.FormCreate(Sender: TObject);
var
i : integer;
Begin
DoubleBuffered := true;
for i:=0 to Self.ComponentCount - 1 do
   Begin
      F := Tinifile.Create('c:\icones.ini');
      If self.Components[i] is Timage then
         Begin
            (self.Components[i] as Timage).Left := F.ReadInteger((self.Components[i] as Timage).name,'Left', 0 );
            (self.Components[i] as Timage).top := F.ReadInteger((self.Components[i] as Timage).name,'top', 0);
         end;
      F.Free;
   end;
end;


*Entendendo o Código*


Bem, nesta rotina criamos um contador para varrer os componentes do forms, verificamos se o componente atual e um Timage, se sim atribuímos a ele a posição Left e Top gravado no arquivo ini na seção de mesmo nome do componente, por isso criamos as seções com o nome de cada componente.
Note a presença do comando DoubleBuffered := true. Ele serve para evitar que a imagem pisque quando arrastada.


Conclusão
 
  Bem você pode estar se perguntando, como me perguntaram,  que grande benefício isso trás a aplicação, pois bem, eu lhe direi. Nós como programadores muitas vezes ficamos tão focados e vidrados nas linhas de código, rotinas de acesso a dados e regras de negócio que nos esquecemos que o usuário não verá nada disso, é com  interface gráfica que ele irá interagir. Por isso preocupes-se sim com o acesso a dados, regras de negócio e etc. mas não se esqueça que do outro lado da tela estará uma pessoa (usuário) e que seu sistema precisa interagir com ele. Rotinas como essa enriquecem e valorizam sua aplicação.


Um conselho que dou a todos vocês é que “fucem”, sejam curiosos leiam, pesquisem, testem. Foi assim que aprendi, nesses quase três anos em que programo nunca fiz nenhum curso, tudo que aprendi foi justamente “fuçando”. Nessa ultima semana é que me matriculei em um curso de formação Borland para tentar a certificação, sendo assim depois de pronto o projeto façam testes, retirem as linhas que verificam se o ponteiro está na área do form e vejam o que acontece, abram o arquivo ini e vejam como foi gravado, enfim “fucem”.


E está lançado o desafio: criem um menu popup com as opção de mostrar e ocultar os ícones, organizar por nome, criem Labels para esse ícones e etc. Este é um exemplo simples que pode e deve ser melhorado imagine se o usuário encontra-se o nosso ini a alterasse os valores, então que tal salvar a posição no registro do Windows.


Isso é um assunto para o próximo artigo.
Obrigado pela atenção e até a próxima.


 Rodrigo Carreiro Mourão
rodrigocarreiro@tdstecnologia.com.br











Publicidade

Vote no artigo




Quantidade de votos: 0 votos
Aceitação: 0%


Detalhes do artigo

Categoria: Windows
Adicionado dia: 13/09/07
Por: Rodrigo Carreiro MKourao
Visualizado: 32174 vezes

Planeta Delphi - Tudo sobre programação Delphi Planeta Delphi - www.planetadelphi.com.br - Todos os direitos reservados | Copyright 2001-2009