Aprenda a Criar um Programa Paint Parecido com o do Windows
By tresloukadu
Artigo Enviado por Marcelo Tropicore
Aqui segue um exemplo de um programa inspirado no Paint do Windows .Nós vamos usar dois componentes Image da paleta Additional para representar a nossa área de desenho. Esse componente assim como todos os componentes visuais do Delphi tem uma propriedade chamada “Canvas” ,é essa propriedade que vai determinar a aparência dos componentes visuais como um Edit, Label, Image etc… Dentre as propriedades da Classe TCanvas umas das principais são: Brush, CanvasOrientation, ClipRect, CopyMOde, Font, Handle, Pen, PenPos, Pixels, Ellipse, FillRect, LineTo, MoveTo, Rectangle e uma porção de outras propriedades.
Vamos declarar duas variáveis globais do tipo TBitmap com os nomes Backbuffer e backbuffer2, essas variáveis vão gerar a nossa área de desenho (é claro que é preciso declarar outras variáveis globais para esse exemplo rodar direito,qualquer dúvida é só dar uma olhada no código fonte
) . Eu coloquei os dois Images dentro de um ScrollBox (paleta Additional) para poder redimensionar os Images sem interferir no tamanho do Form. Agora que começa a parte boa, hora de por a mão na maça, dentro do OnCreate do Form faça o seguinte.
Para podermos usar os Backbuffers temos que criar com backbuffer:= TBitmap.Create; dimensionamos ele no mesmo tamanho do Scrollbox . O backbuffer.Canvas.Brush.Color:= ClWhite; é para determinar a cor de preenchimento do backbuffer. Na parte Image1.Canvas.FillRect(Rect(0,0,Image1.width, Image1.height)); vamos Limpar toda a área do Image e finalmente mandamos o backbuffer para o Image com : Image1.Picture.Assign(backbuffer);
Vamos repetir o mesmo procedimento para o backbuffer2 com algumas coisas adicionais.Aqui nós determinamos qual vai ser a cor transparente do backbuffer2 que vai pro Image2, e em muitas vezes o Image2 vai ficar sobre o Image1 como pode ver no evento de alguns botões das ferramentas com o comando Image2.BringToFront;. Assim quando o Image2 ficar sobre o Image1 vai ser possível ver o Image1 que está por baixo. Aqui no caso eu usei a cor branca.
Inicialize as outras variáveis como no exemplo do código fonte.
ferramenta:= ‘lápis’;
StatusBar1.Panels[1].Text:= ‘Lapis’;
Shape1.Brush.Color:= cor;
E por último vamos liberar as variáveis backbuffer e backbuffer2 da memória, por enquanto não precisamos mais delas ,pois já foram carregadas para os dois Images, portanto vamos trabalhar com eles.
As ferramentas que vão utilizar o Image2 são aquelas que desenham as linhas, retângulos e elipses. Dentro do Image2 vamos utilizar três eventos , o OnMouseDown, OnMouseMove e OnMouseUp. O componente Image é como um plano cartesiano, se você não matou as suas aulas de matemática sabe do que eu estou falando hehehe, ele tem duas dimensões , o X e o Y.
No OnMouseDown nós vamos pegar a posição X e Y que o usuário clicou dentro do Image2. Dai fazemos o seguinte, Image2.Canvas.MoveTo(X,Y); , com isso nós movemos a posição do ponto de partida de uma linha por exemplo ,não começamos a desenhar ainda só dizemos a propriedade Canvas do Image onde vai começar a linha.
No OnMouseMove nós usamos as variáveis X e Y do OnMouseDown e criamos uma linha (se o usuário selecionou essa ferramenta)dessa posição até a posição atual no OnMouseMove.
Image2.Canvas.MoveTo(posX2,posY2);
Note que antes de usar esse comando eu usei o Image2.Canvas.FillRect(Rect(0,0,Image2.Width,Image2.Height)); Para limpar o que já tinha sido desenhado antes, se não fizermos isso o Image2 vai desenhando um monte de linha uma atrás da outra, e fica um monte de linha desenhada no Image. Por isso eu usei dois Images , um para guardar o desenho e o outro para mostrar só o traçado da linha , se eu tivesse usado o Canvas.FillRect(); no Image1 a cada evento do OnMouseMove seria apagado todo o desenho principal.
No OnMouseUp quando o usuário solta o botão do mouse , o programa já tem a posição inicial e final da linha e faz o desenho no Image1 que é o desenho principal.
begin
Image1.Canvas.MoveTo(posX2,posY2);
Image1.Canvas.LineTo(posX,posY);
posX3:= x;
posY3:= y;
end;
Algumas ferramentas não utilizam o Image2 pois desenha direto no Image1 que são a ferramenta Lápis, Borracha, Spray e os baldes de tinta. No caso dos baldes de tinta eu não consegui achar nenhum comando que conseguisse fazer igual ao do Paint do Windows, então tive usar uma lógica meio maluca mesmo pra conseguir chegar o mais peto que eu pude, se alguém sabe como fazer isso por favor me diga como hehehe.
Bom é isso aí pessoal , eu passei o básico de algumas funcionalidades do programa dentro da propriedade Canvas do componente Image, o programa tem outras funções bem legais como abrir imagens e poder editar, salvar e também redimensionar o tamanho da área de desenho.
Se alguém quiser entrar em contato para tirar dúvidas é só mandar no meu email, marcelo_tropicore@hotmail.com
Baixe os Fontes Aqui: paint.
“Uma mente que se abre para uma nova idéia nunca voltará ao seu tamanho original”.
Utilizando DBExpress de uma Maneira Fácil
By tresloukadu
Artigo enviado por: Marcio F. Cruz
DBExpress, segundo meus testes, é a melhor tecnologia para comunicação com banco de dados. Mas, infelizmente, exige a configuração de vários parâmetros e manipulação de vários componentes visuais.
Pensando neste problema, resolvi criar um componente que contém um conjunto de classes, para facilitar a vida do programador em trabalhar com esta maravilhosa tecnologia.
Procurei criar as classes da melhor maneira possível, com os nomes dos métodos e propriedades o mais parecido possível com o que conhecemos e utilizamos em BDE, Zeos, ADO e mesmo no DBExpress.
Neste artigo, descreverei como instalar e fazer uma aplicação simples. Espero que seja útil para a comunidade e, talvez, os pacotes e classes de suas regras de negócio a utilizem.
Passo 1
Download http://sourceforge.net/projects/dddbxfacil/
Este pacote comtém o componente dddbxfacil com suas classes, bem como uma aplicação simples para utilizá-la.
Passo 2
Criar arquivo de configuração. Este arquivo, já está contido no pacote de exemplo e, ele contém a estrutura que é usada pelo dbconnections.ini e, serve para indicar os parâmetros para conexão ao banco de dados. Eu não costumo deixar o login e password contido neste arquivo mas, nada impede de se inserir nele.
A configuração que defini, foi para o Oracle mas, pode ser para qualquer banco que o Dbexpress é compatível que, acho que são todos:
CONNECTIONNAME=OracleConnection
GETDRIVERFUNC=getSQLDriverORACLE
VENDORLIB=oci.dll
LibraryName=dbxora30.dll
DriverName=Oracle
HostName=
Database=
User_Name=
Password=
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
Compressed=False
Encrypted=False
Passo 3
No uses de sua unit, vamos inserir as seguintes units:
DB, DBTables, ddcomumDBX, ddconexaoDBX, ddsqlDBX, ddproviderDBX.
Passo 4
Vamos no private e, colocar as seguintes “variáveis”:
ProviderDBX: TProviderDBX;
SqlDBX: TsqlDBX;
Passo 5
Este passo é opcional mas, para mostrar melhor o funcionamento da classe, criaremos um método chamado MeuDataChange, novamente apontar ele.
procedure MeuDataChange(Sender: TObject; Field: Tfield);
//No implementation
procedure TForm2.MeuDataChange(Sender: TObject; Field: TField);
begin
// Nao é necessário colocar teste para ver se tabela tá aberta, DisableControls, etc…
grbTesteGrid.Caption := ‘Testando o grid. Agora são ‘+
FormatDateTime(‘dd/mm/yyyy hh:nn:ss’, now);
end;
Passo 6
Precisamos instanciar as variáveis que criamos no private. Para isso, criei procedimentos para facilitar isso. No formShow, colocaremos o seguinte código:
IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName))+‘configuracao.ini’,
‘NOMESECAOCONFIGORACLE’);
ConexaoDBX.Login := ‘usuario’;
ConexaoDBX.Senha := ‘senha’;
ddproviderDBX.ProviderDBXInit(ProviderDBX,
ConexaoDBX,
DBGrid1,
‘ROWID’,
true,
MeuDataChange);
ddsqlDBX.SqlDBXInit(SqlDBX, ConexaoDBX);
Passo 7
Exemplo de código para executar busca no banco de dados:
var
Retorno: TProviderRetorno;
begin
ConexaoDBX.ConectarSeDesconectado;
ProviderDBX.ClearAll;
with ProviderDBX, ProviderDBX.LinhaSQL do
begin
Add(‘SELECT * FROM TABELA’);
Retorno := OpenDQL;
end;
end;
Passo 8
Exemplo de evento de inclusão:
var
iProximoCodigo: integer;
begin
ConexaoDBX.ConectarSeDesconectado;
// Pegar Próximo Codigo
with SQLDBX do
begin
setLinhaSQL(‘SELECT MAX(CODIGO) PROXIMO FROM TABELA’);
OpenDQL;
iProximoCodigo := SQLDQl.FieldByName(‘PROXIMO’).AsInteger+1;
end;
ConexaoDBX.Transacao_Abrir;
try
// Incluir
with SqlDBX do
begin
ClearAll;
with LinhaSQL do
begin
Add(‘INSERT INTO TABELA (CODIGO, DESCRICAO)’);
Add(‘VALUES’);
Add(‘(:P_CODIGO,
_DESCRICAO)’);
end;
AddParam(ftInteger, ‘P_CODIGO’, iProximoCodigo);
AddParam(ftString, ‘P_DESCRICAO’, ‘nome ‘+IntToStr(iProximoCodigo));
ExecDML;
end;
ConexaoDBX.Transacao_Commit;
except
on E:Exception do
begin
ConexaoDBX.Transacao_RollBack;
ShowMessage(E.Message);
end;
end;
end;
No arquivo que é baixado do sourceforge, este exemplo já está contido.
Qualquer dúvida, podem me escrever para meu e-mail que eu respondo:
TMS Smooth Controls Pack para Delphi 2009 e C ++ Builder 2009
By tresloukadu
Olá, a Embarcadero está disponibilizando gratuitamente o TMS Smooth Controls Pack para todos os usuários registrados do C++ Builder e Delphi 2009. O TMS é um pack com 22 componentes que permitem a criação de interfaces ricas em Delphi, incluindo animações e estilos do Microsoft Office e do iPhone. Vale a pena conferir!
- TMS Smooth Controls Pack
- Interface feita com os componentes do TMS Smooth Controls Pack
- Interface feita com os componentes do TMS Smooth Controls Pack
- Interface feita com os componentes do TMS Smooth Controls Pack
Para quem está interessado o link para pegar o TMS Smooth Controls Pack é o seguinte:
http://latam.embarcadero.com/br/delphi2009tms/
Já a URL reduzida é a seguinte: url20.ca/bexe
Endereço reduzido desta dica: url20.ca/yefe
t+
Pacotão Dicas Delphi 1.5
By tresloukadu
Super dica, o website dicasdelphi.xpg fornece um excelente pacote com mais de 900 dicas de programação para o Delphi. Este arquivo de dicas é muito bem organizado e de fácil manipulação auxiliando o programador a axar a dica para a sua dúvida muito facilmente.
Segue o texto com a descrição do próprio site que fornce o super pacotão de dicas Delphi:
O Dicas Delphi 900 é um acervo de dicas e exemplos da linguagem de
programação Delphi.
Seu objetivo é ajudar todos os desenvolvedores de sistemas que utilizam
o Delphi como ferramenta.
Sendo um pograma FREE (grátis), pode ser distribuído livremente. Os
que desejarem também podem distribuir essa lista de ajuda em seus
sites. Não pode ser comercializado.
Este pacotão de dicas aborda temas tais como:
- Criar arquivo DBF com índices compostos
- Compactação de uma tabela Paradox
- Listar as tabelas e views do banco de dados (Firebird)
- Proteger e compactar um .EXE
- Procurando um arquivo em todo o HD
- Lendo Arquivo CAB
- Mudar a cor da célula ativa do DBGrid
- Enviando informações direto para a impressora
- Exportando dados para um arquivo XML
E muito mais dicas. Além de mais de 900 dicas o pacotão de dicas ainda possui uma seção com artigos e aborda temas tais como:
- Conceito de Banco de Dados
- Rave – Imprimindo Gráficos (Chart)
- Instalando o BDE a partir do BDEINST.CAB
- Fundamentos de Object Pascal
entre outros artigos. Este arquivo de dicas chm é uma excelente fonte de informações para quem está aprendendo Delphi e para programadores experientes quando precisam consultar alguma dica rápida. E como a maioria das dicas são bastante genéricas todas são compatíveis com o Delphi 2009.
Você pode baixar o pacotão de dicas totalmente gratuito no seguinte link:
Assim que estiver uma nova atualização do pacotão Dicas Delphi 900 estaremos publicando aqui no Blog.
URL reduzida deste artigo: url20.ca/esoj
t+
Dica : Delphi Webinar – Porque migrar para Delphi 2009
By tresloukadu
Mais uma dica para os interessados no Delphi 2009. A embarcadero está promovendo um webinar gratuito mostrando as razões para migrar para o Delphi 2009.

Porque migrar para o Delphi 2009?
Segue a descrição do evento:
“A Embarcadero Technologies preparou pra você que ainda não migrou para Delphi 2009 um evento online para tirar todas as suas dúvidas.
Efetuando seu registro, você garante no mínimo 30% de desconto na compra de Delphi, RAD Studio, C++ Builder e InterBase, desconto válido para novas licenças e atualização.
Participe do evento online gratuito “Razões para migrar” e conheça todas as novidades que vão ajudar ainda mais o desenvolvimento de seus sistemas.
Serão 3 horas na prática de novos recursos incorporados ao Delphi desde a versão 7, como: novidades no IDE, linguagem, VCL, documentação, banco de dados, modelagem e muito mais.
Para participar, efetue o seu registro agora mesmo.”
O link para os interessados que queriam participar desse interessante Webinar é: https://www124.livemeeting.com/lrs/advancedsw_ccc/Registration.aspx?pageName=991mhh5r2rs7j70h
Vale a pena participar, para os interessados não esqueçam de enviar esta dica para outros programadores Delphi também. Pois quanto mais pessoas paticiparem maior será a sinergia entre a comunidade Delphi brasileira.
URL reduzida desta dica: url20.ca/adeq
t+
Dica : Migrar do Delphi 7 para o Delphi 2009
By tresloukadu
Dica quentíssima no site da Rede de Desenvolvedores da Embarcadero tem um documento de 60 páginas listando todas as diferenças desde o Delphi 7 até o Delphi 2009. Então se você está com dúvidas para baixar o Delphi 2009 por ser um lançamento da Embarcadero vale a pena conferir este documento e consultar todas as diferenças entre o Delphi 7 e o Delphi 2009. É bom isso também pois quando você realizar um upgrade e abrir os seus projetos antigos no Delphi 2009 você não tenha surpresas não muito legais, e se caso você tiver vai ser mais fácil encontrar solução para o problema de troca da versão 7 para a versão 2009.

Preview da Rede de Desenvolvedores da Embarcadero
O endereço para baixar este excelente documento é: http://cc.codegear.com/Item/26707 já a URL reduzida desta página se caso você quer enviar para os seus amigos é a seguinte: url20.ca/eked
Essa é uma leitura essencial para todos que pensam em migrar para o Delphi 2009.
URL reduzida desta dica: url20.ca/inix
t+
Dica : Refatorar seu código Delphi
By tresloukadu
Bom essa é uma das super dicas que tem que ser dada. Existe um serviço na web para refatoração de códigos ou como no inglês code refactoring que possibilita você publicar o seu código para que outras pessoas vejam e ajudem você no processo de refatoração. Em adição, outros serviços são prestados como code highlighting para publicação em blogs e inclusive nos comentários. Muitas vezes quando temos um código feito em um Delphi com uma versão mais velha ou se no passado fizemos um código um tanto fora dos padrões e queremos reutilizar o mesmo, a refatoração é muito importante.
Em certas empresas existe muita pressão dos gerentes de projetos em cima dos programadores para concluirem o projeto em um tempo muito curto e com isso acaba ocasionando que o código acaba saindo sem qualidade. Pois sou defensor da seguinte lei que pretendo discutir ela em posts subsequentes, não sei se estou errado ou certo, mas criei a seguite lei para a programação em qualquer liguagem: A qualidade da aplicação é diretamente proporcional ao tempo investido. Sei que estou generalizando nesta idéia mas francamente isso é o que ocorre em vários lugares. Então quando fizemos algo as pressas para entregar algo pro cliente impaciente e depois paramos com calma para melhorar o código, o serviço deste website vai ser de grandíssima ajuda na refatoração. Principalmente para os programadores que trabalham sozinhos nos seus home offices.
Logotipo do website refactormycode.com
Como este blog visa também ser para usuário leigos e avançados vou colocar aqui em linhas gerais o que vem a ser refatoração ou refactoring de acordo com o material disponível na wikipedia. “Refatoração (do inglês Refactoring) é o processo de modificar um sistema de software para melhorar a estrutura interna do código sem alterar seu comportamento externo.” Imagine você publicar uma parte de seu código em um website e outras pessoas vão poder opinar e melhorar o mesmo sem alterar o resultado final. Isso é muito bonito! Existem inúmeras outras vantagens e você deve conferir este serviço.
A seção dos códigos em Delphi está no seguinte endereço: http://refactormycode.com/refactorings/recent/delphi
O endereço oficial é: www.refactormycode.com
Já a url reduzida do Refactor my Code para você enviar para seus amigos ou enivar por celular é: url20.ca/s1976
Bom fica esta dica para facilitar a refatoração dos códigos em Delphi. Um serviço muito bom.
URL reduzida desta dica: url20.ca/k2003
t+
Dica : Nova Comunidade do Dicas Delphi no Orkut
By tresloukadu
Esta semana foi criado no Orkut a comunidade do blog Dicas Delphi. A comunidade visa manter uma maior integração entre os leitores do blog para que eles possam participar do Dicas Delphi também. Assim como no blog a comunidade foi feita para ser “gerenciada” pelos próprios usuários e leitores que através de críticas e sugestões poderão definir como querem as coisas.

Comunidade do Dicas Delphi no Orkut
A comunidade também tem como um diferencial a imparcialidade. Por ser um canal aberto para todos os desenvolvedores e interessados em Delphi. Ela tem espaço para a divulgação de empresas, projetos, parcerias, produtos e muito mais. Além de divulgar as dúvidas e soluções que surgem ao se desenvolver uma aplicação Delphi.
Além dos posts livres, a comunidade tem os seguintes posts fixos:
- INFORMAÇÕES IMPORTANTES ANTES DE POSTAR
- BOLSA DE EMPREGOS
- ANÚNCIOS DE PRODUTOS
- ANÚNCIOS DE EMPRESAS E SERVIÇOS
- ANÚNCIOS DE PROJETOS E PARCERIAS
Os tópicos acimas são os primeiros, mas assim que os leitores começarem a participar e opinar poderemos colocar novos tópicos.
O link da comunidade é:
http://www.orkut.com.br/Main#Community.aspx?cmm=55165548
O link especial reduzido da comunidade para você divulgar para seus amigos ou enviar por celular é o seguinte: url20.ca/delphi
Bom fica aí mais esta excelente dica e novidade desta comunidade para aumentar muito mais a sinergia entre toda a Comunidade Delphi Brasileira.
URL reduzida desta dica: url20.ca/r2007
t+
Dica : Dia do Desenvolvedor Delphi 2009
By tresloukadu
O Dia do Desenvolvedor Delphi (tradução livre) ou Delphi Developer Day 2009 neste ano acontecerá em dois dias e em duas cidades diferentes. O primeiro encontro de dois dias será em Washington DC nos dias 30 e 31 de Março. Já o próximo encontro será em Chicago nos dias 2 e 3 de Abril. O evento deste ano contará com grandes figuras do mundo Delphi como Marco Cantù e Cary Jensen.

Logo do Delphi Developer Day 2009
Alguns do temas abordados este ano serão:
- Guia para os Desenvolvedores Delphi 2009
- Criando Aplicações Amigáveis para o Windows Vista Com Delphi 7 e 2009
- Desenvolvendo com Datasets Desconectados
E muitos outros temas interessantes que podem ser conferidos na lista completa do evento no seguinte endereço: http://url20.ca/m2004
O endereço oficial do Delphi Developer Day 2009 para quem quer conhecer mais ou se inscrever é: http://www.delphideveloperdays.com/
Esta aí uma grande oportunidade para ficar antenado nas novidades do mundo Delphi.
URL reduzida desta dica: url20.ca/k1992
t+
Dica : Visualizando HTML no Componente Memo
By tresloukadu
Nesta dica vamos ver como acessar um website através do Delphi e exibir o código HTML do mesmo, no componente TMemo. Para este exemplo está sendo utlizado o componente TWebBrowser que vai acessar o website e o código fonte em si. É possível fazer muitas coisas interessantes com o TWebBrowser até mesmo criar um navegador de Internet. Um detalhe adicional é que o componente TWebBrowser é baseado no Internet Explorer e a sua documentação está no site de desenvolvedores da Microsoft no seguinte endereço: url20.ca/z1979 vale a pena dar uma conferida e consultar tudo que é possível fazer.
Vamos ao código do nosso visualizador de HTML:
{
Sobre: Código de exemplo para mostrar como exibir e ler um documento HTML
de um website.
Autor: Dicas Delphi
Data: 19/12/2008
}
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, OleCtrls, SHDocVw, ComCtrls;
type
TfrmMain = class(TForm)
WebBrowser1: TWebBrowser; //utilizando o componente TWebBrowser
MemoCodFonte: TMemo;
Panel1: TPanel;
edtUrl: TEdit;
btnNavegar: TButton;
btnExibirCod: TButton;
Label1: TLabel;
procedure btnNavegarClick(Sender: TObject);
procedure btnExibirCodClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
{Adiciona o código fonte de um website no memo}
//===================================================================
procedure TfrmMain.btnExibirCodClick(Sender: TObject);
//===================================================================
var
documentoAtivo : variant;
begin
//Acessando a interface do site aberto
documentoAtivo := WebBrowser1.Document;
//Adicionando o código HTML ao MEMO
MemoCodFonte.text := documentoAtivo.Body.OuterHTML;
end;
{Acessa o website}
//==================================================================
procedure TfrmMain.btnNavegarClick(Sender: TObject);
//==================================================================
begin
//Verifica se foi informado alguma URL
if edtUrl.Text <> ” then
begin
//Acessando o website informado no edit
WebBrowser1.Navigate(edtUrl.Text);
//Colocando a ampulheta do windows só pra saber que está executando o
//programa
Screen.Cursor := crHourGlass;
//Enquanto o site não é carregado totalmente fica no loop até o estado
//do ReadyState for ‘completo’
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
begin
Application.ProcessMessages;
Sleep(0);
end;
//Site foi carregado, tira a ampulheta e coloca a seta no mouse novamente
Screen.Cursor := crDefault;
//Site foi carregado, libera o botão de vizualizar o código fonte
btnExibirCod.Enabled := true;
end
//Se nenhuma URL for informada dá uma mensage de erro, e dá focus no edit
else
begin
//Exbindo a mensagem
ShowMessage(‘Entre com uma URL’);
//Setando o focus no edit
edtUrl.SetFocus;
end;
end;
end.
A parte que estamos acessando o código do website e adicionando ano componente TMemo é na seguinte linha:
O código deste exemplo como sempre foi simplicado, mas existem coisas interessantes como no seguinte trecho:
//do ReadyState for ‘completo’
while WebBrowser1.ReadyState <> READYSTATE_COMPLETE do
begin
Application.ProcessMessages;
Sleep(0);
end;
Onde é dado um loop para verificar se o website foi totalmente carregado ou se ele está ainda fazendo ainda o download do conteúdo.
Segue o pacote com o executável e o código fonte para baixar:
http://www.dicasdelphi.com.br/wp-content/uploads/2008/12/vercodigosite.rar
URL reduzida desta dica: url20.ca/m1986
t+








maio 10th, 2009



