Corcovado sem o Cristo Redentor!


Sem dúvida essa é uma foto rara que eu recebi por email, nela vemos inscrição “Corcovado” assinalando que a mesma é uma imagem do morro do Corcovado, um dos pontos turísticos mais conhecidos do Brasil.
corcovado antes do cristo
Para você conhecer mais um pouco sobre o corcovado:
O morro do Corcovado que no Séc. XVI foi batizado pelos portugueses de  Pináculo da Tentação, em alusão a um monte bíblico, somente veio a ser nomeado de “Corcovado” ( fazendo alusão a sua forma ) no século seguinte.
A primeira expedição ao Corcovado ocorreu no ano de 1834 e foi liderada pelo próprio D.Pedro I, sendo construído assim o primeiro acesso cume do morro.
pop_historia1
Os engenheiros João Teixeira Soares e Francisco Pereira Passos recebem de D.Pedro II no ano de 1882 a permissão para construírem e explorarem a Estrada de Ferro do Corcovado, a mesma foi inaugurada em 1884 com a presença da Família Real, seu percurso inicial era entre o Cosme Velho e as Paineiras da Estrada de Ferro do Corcovado, nesse mesmo momento inaugura-se também o Hotel das Paineiras. No ano seguinte é inaugurado o trecho entre  as Paineiras e o Corcovado, seu trajeto final passou então a ter 3.800 metros de extensão.
pop_historia3
A idéia da construção do monumento do Cristo Redentor surge pouco antes do centenário da Independência e serviria para comemorar tal evento. Na disputa para acolher o monumento estavam o Corcovado, o Pão de Açúcar, e o Morro de Santo Antônio. O Corcovado vence a disputa, pois oferece as melhores condições.
pop_historia4
A estátua do Cristo Redentor é inaugurada no dia 12 de outubro de 1931.  O desenho final do monumento é de autoria do artista plástico Carlos Oswald e a execução do projeto é do estatuário francês Paul Landowski.
pop_historia5 pop_historia6
pop_historia7
Nosso querido Santos Dumont, era um freqüentador assíduo do Trem do Corcovado, dito por maquinistas antigos, Santos Dumont por várias vezes pedia para conduzir o trem, e também era sempre gênero nas gorjetas. Os ex-presidentes Getúlio Vargas e Epitácio Pessoa também freqüentavam o Corcovado.
Em 1980, foi a vez do Papa João Paulo II e, assim como ele, também realizaram o passeio o cientista Albert Einstein, o rei Alberto da Bélgica e a princesa Diana.
600px-Rio_de_Janeiro_Helicoptero_47_Feb_2006_(cuadrado)
Hoje é possível visitar o Cristo Redentor de carro ou de bondinho, o trajeto de bondinho é feito em aproximadamente meia hora. Quem visita o Cristo, acaba por desfrutar também da exuberância da maior floresta urbana do mundo, o Parque Nacional da Tijuca símbolo de preservação, que proporciona aos visitantes um contato inesquecível com a natureza onde a presença da Floresta  Atlântica nos traz momentos de reflexão e paz.
437px-Cristo_Redentor_Rio_de_Janeiro_4
Do seu topo o visitante poderá ver todo o Rio de Janeiro, tendo uma visão de 360º (graus), vislumbrando as praias, os bairros, e toda a beleza da Cidade Maravilhosa.
689px-Cristo_Redentor_viewed_from_the_base
A hospitalidade Carioca está representada na figura do Cristo de braços abertos recebendo os visitantes no Rio de Janeiro. É impossível imaginar uma visita ao Rio de Janeiro sem ir visitar o Cristo Redentor. Sua magia impressiona não só aqueles que o visitam por motivos religiosos, mas todos sem exceção.
US_Navy_Brazil
Não deixem de conhecer!
Visitem o site oficial do Corcovado clicando aqui.

Usando BookMark de maneira simples


Olá amigos, estou trazendo hoje uma dica rápida para quem deseja usar o bookmark. Primeiro vamos esclarecer o que é BookMark e depois mostrar uma das mais simples maneiras de utilizar esse recurso.

O que é BookMark ?

Bookmark é um artifício que temos a nossa disposição para marcar um registro no ClientDataSet e depois localizá-lo rapidamente. Imagine o BookMark como um marcador de páginas (seria essa a tradução ao pé da letra), sendo assim você marca o registro no qual quer retornar futuramente, navega pelos outros registros do ClientDataSet e quando desejar, faz a chamada para o seu bookmark e retorna ao registro marcado. Parece fácil não é?

É fácil sim!

Para utilizar o bookmark da maneira mais simples, devemos utilizar o marcador como uma string. Crie uma variável private no seu form do tipo string. Ela será utilizada para receber o marcador do ClientDataSet, como também para indicar qual a posição o ClientDataSet deve colocar o ponteiro posteriormente.
Está parecendo complicado né, mas você verá que é brincadeira de criança fazer isso.
Construa um form conforme o modelo abaixo ou baixe aqui o exemplo completo.
BookMark
Não se preocupe com os dados isso será resolvido no exemplo criando uma tabela temporária. Agora vamos a codificação para aqueles que não baixaram o exemplo vou colocar abaixo o código da unit.


unit uExemploBookMark;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DB, DBClient, Grids, DBGrids;

type
TExemploBookMark = class(TForm)
DBGrid1: TDBGrid;
CDS: TClientDataSet;
ds: TDataSource;
BitBtn1: TBitBtn;
MemorizaBookMark: TBitBtn;
LocalizaBookMark: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
procedure MemorizaBookMarkClick(Sender: TObject);
procedure LocalizaBookMarkClick(Sender: TObject);
private
{ Private declarations }
BookMarkString : String;  // essa variavel ira auxiliar no uso do bookmark
public
{ Public declarations }
end;

var
ExemploBookMark: TExemploBookMark;

implementation

{$R *.dfm}

procedure TExemploBookMark.BitBtn1Click(Sender: TObject);
var
  I: Integer;
begin
  // aqui estamos criando nossa tabela temporaria
  CDS.FieldDefs.Add('codigo',ftInteger);
  CDS.FieldDefs.Add('descricao',ftString, 50);
  CDS.CreateDataSet;

  // aqui estamos criando os registros na tabela temporaria
  for I := 1 to 10 do
  begin
    CDS.Append;
    CDS.FieldByName('codigo').AsInteger   := i;
    CDS.FieldByName('descricao').AsString := 'Descrição - '+inttostr(i);
    CDS.Post;
  end;
end;

procedure TExemploBookMark.LocalizaBookMarkClick(Sender: TObject);
begin
  // dessa maneira dizemos ao clientdataset para ir para o endereco 
  // armazenado na nossa variavel
  CDS.Bookmark := BookMarkString;
end;

procedure TExemploBookMark.MemorizaBookMarkClick(Sender: TObject);
begin
  // aqui estamos atribuindo o endereco atual do registro na nossa 
  // variavel
  BookMarkString := Cds.Bookmark;
end;

end.





Para testar aponte o cursor para um registro qualquer selecionando o registro e depois clique no botão Memoriza BookMark, feito isso navegue pelo gride apontando agora qualquer outro registro e depois clique no botão Localiza BookMark, nesse instante o cursor deverá retornar para o registro memorizado anteriormente.


Vocês perceberam como foi fácil utilizar o bookmark dessa maneira? Para marcar nosso registro utilizamos BookMarkString := Cds.Bookmark; e para retornar ao registro marcado fizemos o contrário CDS.Bookmark := BookMarkString; .


Claro que alguns irão dizer que é melhor utilizar o bookmark criando um ponteiro,  etc. Sim, realmente se criarmos um ponteiro do tipo TBookMark, poderemos utilizar funcionalidades mais complexas, proporcionando um controle maior e mais seguro, mas o objetivo aqui era justamente demonstrar a parte fácil desse recurso e sua implementação sendo feita da maneira mais simples possível, espero que tenham gostado.

“¿Eres un buen programador?”


 

Olá amigos, trago novamente outro texto do Martín Bien, dessa vez ele traz uma reflexão dos pontos positivos que um bom programador deve ter para se destacar. Além dos pontos citados por ele, eu ainda acrescentaria um:
BOA VONTADE
Acredito que se todos tivessem boa vontade em ajudar a resolver os problemas dos outros também, metade das mazelas do mundo seriam resolvidas. É parece exagero, não é? Mas pense em quantas vezes você esteve na situação de ter que apresentar um documento (ou um punhado deles) e o atendente olha para você com desprezo e depois de vários minutos fazendo “han ham”, ele te fala: “Desculpe senhor, mas está faltando a segunda via de cor verde desse documento, o senhor poderá voltar outro dia e fazer o pedido novamente, mas infelizmente terá de entrar na fila.”. É você já ficou irritado só de lembrar de alguma coisa parecida. Agora imagine o seu chefe lhe trazendo uma tarefa e você fazendo “han ham” , e depois você se vira e fala: “É isso aqui….sei não hein….acho que não vai rolar…” , é você acaba de matar a sua boa vontade de resolver o problema do próximo(no caso o SEU CHEFE) e talvez tenha acabado de virar mais um problema para o próximo também, fica aqui o meu ponto para o qual devemos ter atenção, a boa vontade.
Abaixo está o texto do Martín Bien na íntegra. Como no outro post, me isentei de fazer a tradução, até para poder exercitar o espanhol. Acredito que  vocês não terão dificuldades também na leitura. Espero que gostem passem a ter esses pontos como focos de atenção no seu comportamento.

“Creatividad

Muchas personas a las que les cuento que para ser programador necesitas de mucha creatividad se quedan impactadas, esto porque siempre se asocia a las computadoras con la falta de creatividad, vamos, las computadoras son máquinas, pero nosotros los programadores NO.
Hasta ahora no conozco un lenguaje de programación el cual no te brinde diferentes soluciones a un mismo problema. Es lo que comúnmente se llama "There Is More Than One Way To Do It", que en español se traduce como: hay más de una manera para lograrlo.
Por eso creo que el primer punto que un buen programador debe de tener es creatividad. Creatividad para crear soluciones factibles, rápidas y sencillas a problemas complicados.
Por mi experiencia, esto es lo más difícil, pues la creatividad no la aprendes, no hay un libro acerca de "Creatividad Básica", no existen cursos que te puedan dar creatividad y la creatividad no la compras en la tienda. Creo que la creatividad la llevas dentro y unos tenemos poca y otros mucho más.
Pero lo que es un hecho es que sin creatividad inmediatamente te vuelves un mal programador, porque aunque la solución sea evidente es la falta de esta misma creatividad que te imposibilita ver lo que esta enfrente de ti.

Conocimientos

El segundo punto, por supuesto que son los conocimientos. Pues aunque tengas creatividad si no tienes conocimientos no puedes llevar a cabo lo que ideaste.
Yo creo que un buen programador más que saber el ¿cómo? sabe el ¿por qué? de las cosas. No es lo mismo saber como solucionar un problema a saber realmente como funciona esa solución.
Por ejemplo, en el artículo que hice anterior a este acerca de la memoria en perl, les dije que para poder usar la memoria de manera eficiente era importante comprender como es que funcionaba la liberación de la misma por perl para poder usarlo a nuestro favor. En ese artículo más que el ¿cómo? vimos el ¿por qué?.
Entonces como segundo punto un buen programador debe de comprender porque un lenguaje actúa de esta u otra manera, para poder usarlo al 100%.

Consulta

Como tercer punto, y el que a muy pocas personas he visto mencionar es la capacidad de consulta.
Es imposible que una sola persona sepa las soluciones a completamente todos los problemas, y la verdad es que la mayoría de nosotros ha de saber como un 50% de las capacidades completas de un lenguaje de programación.
Es aquí donde entra la importancia de este punto. Todo buen programador debe de tener la capacidad de encontrar conocimiento necesario de manera rápida, ya sea buscando en libros o en la web.
Muchas veces yo me veo en la necesidad de buscar ciertas funciones que se que existen pero que no recuerdo las sintáxis completamente, para lo que uso mi LIBRO DE CONSULTA, el cual dividí en 3 categorías: Básico, Intermedio y Experto para una mejor consulta.

Eficiencia

Llegamos a nuestro cuarto punto: la eficiencia.
Un buen programador debe de llegar a soluciones de manera rápida y eficiente. Es lógico que varias veces se necesitan hacer pruebas para saber si un código funciona. Pero creo que todo buen programador debe de tener una guía de trabajo, un plan personal con el cual lleva a cabo todos sus desarrollos.
Este plan debe de tener pasos muy claros, para evitar otro tipo de confusiones. Este tema lo trate en: Guía para iniciar un proyecto.
Creo que estos cuatro puntos son suficiente para saber si un programador es bueno o malo. Pero recuerden que esta es mi opinión personal, de seguro deben de haber maneras mejores de evaluar, pero yo siempre lo hago por estos 4 puntos.
Y tú ¿qué tan bueno eres? “ (Martín Bien)

"Como Reconocer A Los Buenos Programadores"


 

Senhores eu li esse texto de um amigo cadastrado no LinkedIn, achei interessante divulgar o ponto de vista dele sobre como reconhecer um bom programador, poupei-me o trabalho de traduzi-lo, pois acredito que seja perfeitamente compreensivo para todos os termos utilizados. Acredito que muitos irão se identificar com todos  ou a grande parte dos pontos positivos citados pelo Martín Bien, se quiser conhecê-lo um pouco mais visite o perfil dele no LinkedIn.
Coloquei o texto dele na íntegra logo abaixo.

 

“Indicadores positivos:


le apasiona la tecnología
programa en su tiempo libre, es su hobby
hablará largo y tendido de cualquier tema técnico si se le pregunta
ha tenido proyectos personales significativos a través de los años
aprende nuevas tecnologías por si solo
tiene opiniones fuertes sobre cual tecnología es la mejor para varios usos
se siente incomodo trabajando con tecnologías que el crea no son "correctas"
puede mantener una buena conversación en cualquier variedad de temas, no tan solo aquellos que sean técnicos
empezó a programar mucho antes de entrar a la universidad o al trabajo
tiene proyectos personales grandes que no necesariamente aparecen en el résumé
conoce de una gran variedad de tecnologías (las cuales no necesariamente están en el résumé)

Indicadores negativos:


Solo programa mientras está en el trabajo
No le gusta hablar de programación, aunque se le pregunte
Aprende nuevas tecnologías cuando la compañía lo envía a tomar cursos
Usa la tecnología que le indiquen, cualquier tecnología es "buena"
Empezó a programar en la universidad
Toda su experiencia en programación está en su résumé
Enfocado en uno o dos plataformas de programación (ejemplo: todo lo que tiene que ver con aplicaciones de java) sin ninguna experiencia fuera de esa plataforma. “

Delphi Conference - Inscrições Abertas


Amigos, mais uma vez teremos o prazer de recebermos uma DELPHI CONFERENCE aqui em São Paulo, essa nova edição acontece em 24 de novembro no CENTRO FECOMERCIO DE EVENTOS‎.  Dentre os palestrantes estarão presentes Andreano Lanusse(não preciso apresentar né?), Bruno Lichot ( que participa de um ótimo grupo no Yahoo NDDV · N-Tier, DataSnap e Delphi na Veia!!!!),  Manuel Edésio(um abraço ao amigo Edésio, quando quiser ir passear em Pindamonhangaba é só falar! ) e tantos outros que farão dessa reunião um espetáculo sem dúvida nenhuma.
Os temas das palestras são diversos e serão apresentados simultaneamente em 3 salas e mais o auditório. Tenho certeza que você ficará ainda com jeito de “quero mais”, por perder um ou outro assunto, que você tanto quer ouvir, mas este estará sendo apresentado ao mesmo tempo na sala ao lado. Por isso mesmo indique esse evento aos seus amigos, leve-os, dividam-se para poderem aproveitar ao máximo o evento, discutindo e pondo em prática as dicas apresentadas, garanto que eles vão gostar da idéia. Clique aqui e veja a agenda do evento!
Já sei eu não falei o quanto isso tudo vai custar né !? Bom o custo a princípio é R$0,00 (isso mesmo zero reais), mas para isso você deve fazer a inscrição e comparecer ao evento, pois caso contrário, haverá a cobrança de uma taxa de R$ 100,00. Nada mais justo cobrar pelo seu pouco caso ao fazer a inscrição e dar o bolo não acha?. Faça sua inscrição o quanto antes! Se quiser pode fazer o download do formulário aqui. Daí você imprime o formulário, preenche, envia uma cópia digitalizada para brazil.atendimento@borland.com e espera o email de confirmação que deverá chegar dentro de 48 horas. Ufa podia ser mais fácil né!.
Ah! leia as letras miúdas da página de inscrição! Lá você verá que o estacionamento não está incluso ( Nossa! Fazem um evento gratuito e ainda tem gente que vai reclamar que não tem estacionamento de graça, quer apostar?).
{5b173c9a-425b-4594-af16-f7924e91fb8e}_convite_delphi_conferece_01

Dia do torcedor flamenguista


De autoria do vereador Jorge Mauro, o "Dia do Flamenguista" passou a vigorar desde 15 de outubro de 2007, passando assim a fazer parte do calendário oficial da cidade do Rio de Janeiro, motivo de orgulho e festa para o Cidadão Carioca. Naquela mesma semana, uma pesquisa divulgada pela CNT/Sensus, mostrou que o Flamengo é o time de futebol com maior torcida do País. O clube da Gávea lidera o ranking com 14,4% dos torcedores do Brasil. Logo atrás vem o Corinthians, com 10,5% dos votos, à frente de São Paulo, que em terceiro, tem 8%, e Palmeiras, em quarto, com 7,2% do total pesquisado.
A data dedicada à torcida rubro-negra será comemorada todo dia 28 de outubro, mesmo dia do padroeiro do Flamengo, São Judas Tadeu.

cristo rubro negro

Como já dizia Nelson Rodrigues: “Existem dois tipos de torcedores: os que já descobriram que são Flamengo e os que ainda não descobriram”.

Bondinho do Pão de Açúcar completa 97 anos


Em 1912, há 97 anos atrás, 500 pessoas pagaram a quantia de 2.500 réis para fazer a viagem de inauguração do Bondinho do Pão de Açúcar. Para a época o evento representava a última palavra em tecnologia e tinha origem alemã, até então somente Suíça e Espanha possuíam tal atrativo turístico. Desde então 37 milhões de pessoas já fizeram essa mesma viagem, dentre elas, ilustres personagens como ex-presidente John Kennedy, o cientista Albert Einstein, o cantor britânico Sting, e a atriz Brokie Shield.
As duas rotas disponíveis ligam a base do Morro da Babilônia ao Morro da Urca (distância de 600m onde a velocidade máxima chega a 21,6Km/h) e a outra liga o Morro da Urca ao Morro do Pão de Açúcar (distância de 850m, onde a velocidade máxima pode chegar a 36Km/h), essa segunda foi eleita umas das Sete Maravilhas do Rio de Janeiro anos atrás. O tempo de passeio não ultrapassa os 5 minutos em cada trajeto, o bondinho tem capacidade de levar em cada viagem aproximadamente 65 passageiros.
As comemorações de hoje que incluem até mesmo uma fatia de bolo de aniversário para os visitantes que comparecerem para fazer o passeio e homenagearam dessa forma essa atração que é um cartão postal do Rio de Janeiro.

Apareçam por lá!

Site Oficial do Bondinho:
Bondinho Pão de Açúcar

Fotos do bondinho:



Marcando o Filho e o Pai ( TJvCheckTreeView )


Amigos um companheiro de programação fez essa pergunta no Grupo Delphi-BR (grupo dedicado a Delphi do Yahoo, muito bom! Eu recomendo!), então dei uma fuçada, pois utilizo a biblioteca do Jedi ( também recomendo) e como já utilizei esse componente ( nossa de novo eu recomendo!)  acabei achando uma solução para o caso. A pergunta dele era a seguinte:
“Colegas,
Utilizando um JvCheckTreeView, gostaria de, ao checar um item filho, também
checar o item pai. Alguém sabe como fazer?
Grato”

E a solução encontrada foi, no evento JvCheckTreeView1Click adicionar o código abaixo, lógico que a partir daqui você poderá refinar a rotina, experimente implementar que ao retirar a marcação de todos os filhos, a rotina retire também a marcação do item pai.

procedure TForm23.JvCheckTreeView1Click(Sender: TObject);
var
  Node : TJvTreeNode;
begin
  if TJvTreeNode(JvCheckTreeView1.Selected).Checked then
  begin
    Node := TJvTreeNode(JvCheckTreeView1.Selected.Parent);
    Node.Checked := True;
  end;
end;


Espero mais uma vez estar ajudando!


Boa sorte e abs!

Desmitificando as Interfaces em Delphi


Amigos quero mostrar para vocês o que é, e como podemos utilizar as interfaces no Delphi de forma que facilite nossa difícil vida de programador.

O que é interface?

As interfaces foram introduzidas na linguagem Object Pascal na versão 3 do Dephi, passando a partir desse momento a ser trabalhada de forma nativa. Vocês não fazem idéia de quão significativo foi isso! Então alguns irão perguntar:  "Mas como se vivia sem as interfaces antes disso ?" E eu respondo: Criando classes que não eram implementadas, mas que declaravam seus métodos para serem implementados pelas classes descendentes. Claro que você já esbarrou com um código desses, mas não deu atenção. Veja a declaração abaixo e me diga se você já não viu e talvez implementou algo parecido.

Type
TBrasileiro = class
public
function Trabalhar:Boolean; virtual; abstract;
function PagarImpostos:Boolean; virtual; abstract;
end;


O código acima define os métodos que a classe descendente deverá implementar. Podemos dessa maneira facilmente definir a nossa interface com base nos requisitos acima.







Type
IBrasileiro = Interface
['{31A22D9F-E857-4892-9D17-79FBE9AA7237}']
function Trabalhar:Boolean;
function PagarImpostos:Boolean;
end;


Dessa maneira podemos dizer que as interfaces são as "normas contratuais" que regem como nossa classe será definida e como deverá ser utilizada, tanto do lado do implementador como do lado do cliente. As classes podem implementar diversas interfaces, isso possibilita que uma classe "simule" a herança múltipla no Object Pascal.









Façamos agora duas observações quanto ao código acima!



Primeiramente vocês vão reparar que temos uma Sting enorme denominada de Globally Unique Identifier (GUID), no exemplo temos  ['{31A22D9F-E857-4892-9D17-79FBE9AA7237}']  ), essa string pode ser gerada automaticamente no IDE do Delphi utilizando as teclas Ctrl+Shift+G, e servirá para identificar de forma única a nossa interface. Por enquanto é tudo que precisam saber sobre essa numeração.


Posteriormente você verá que não foi utilizado especificadores de visibilidade ( private, protected, public, lembra deles ?), isso porque todos os métodos declarados numa interface são públicos por default.







De onde vem ?






Sei que você já sabe disso, mas vou comentar mesmo assim: Todas as classes em Delphi descendem de TObject, isso de maneira implícita, da mesma forma as interfaces na linguagem object pascal descendem de forma implícita de IInterface, podemos ver sua definição na Unit System. Você verá a declaração de TInterfacedObject, falarei dessa classe mais a frente quando aparecer no nosso exemplo.






type
IInterface = interface
['{00000000-0000-0000-C000-000000000046}']
function QueryInterface(const IID: TGUID;
out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;

IUnknown = IInterface;
{$M+}
IInvokable = interface(IInterface)
end;
{$M-}


{ TInterfacedObject provides a threadsafe default
implementation of IInterface.You should use TInterfaceObject
as the base class of objects implementing interfaces.; }

TInterfacedObject = class(TObject, IInterface)
protected
FRefCount: Integer;
function QueryInterface(const IID: TGUID;
out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
class function NewInstance: TObject; override;
property RefCount: Integer read FRefCount;
end;



Como é a vida com as interfaces?


Bom agora que você já sabe quando as interfaces ficaram disponíveis no Delphi, como era a vida antes dela, vamos ver como é a vida com elas. Vamos implementar duas interfaces simples, observe o  exemplo abaixo.





ITrabalhador = Interface
['{31A22D9F-E857-4892-9D17-79FBE9AA7237}']
function Trabalhar:Boolean;
function PagarImpostos:Boolean;
end;

ISerHumano = interface
['{29D48E8C-EFF0-461C-9B9E-D5D7478E5B87}']
function AndarEreto:Boolean;
function Falar:Boolean;
procedure Ouvir;
procedure Correr;
end;



Basicamente podemos declarar nossa classe como:




TBrasileiro = class(TInterfacedObject, ITrabalhador,
ISerHumano);


Da maneira como está declarada a nossa classe acima, nós receberemos um código de erro do IDE, pois quando definimos que uma classe implementa uma interface, a classe deve contemplar todos os seus métodos implementando-os, se um ou mais de um não estiverem implementados receberemos um errro como esses abaixo:




[Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'AndarEreto'

[Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Falar'


[Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Ouvir'


[Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Correr'


[Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'Trabalhar'


[Pascal Error] Unit22.pas(33): E2003 Undeclared identifier: 'PagarImpostos'






Sua implementação é obrigatória nas classes que utilizam as interfaces, mas há uma maneira de postergar essa implementação na qual falarei mais abaixo. Você com certeza notou que nossa classe descende de TInterfacedObject, e o motivo é simples, essa classe já implementa de forma segura os métodos obrigatórios definidos em IInterface, ela descende de TObject e facilita o nosso trabalho para controlar o uso de interfaces. É  extremamente recomendado o seu uso!




Nossa classe utilizando interfaces!



Para termos a correta declaração para a classe acima devemos ter um código conforme este:



TBrasileiro = class(TInterfacedObject, ITrabalhador,
ISerHumano)
public
// métodos da interface ITrabalhador
function Trabalhar:Boolean;
function PagarImpostos:Boolean;
// métodos da interface ISerHumano
function AndarEreto:Boolean;
function Falar:Boolean;
procedure Ouvir;
procedure Correr;
end;





Dessa forma estamos dizendo que a classe TBrasileiro descende de TInterfacedObject e que implementa os métodos “definidos” pelas interfaces ITrabalhador e ISerHumano.




Postergando a implementação da interface:



Na realidade o que vamos fazer é instruir ao compilador para que ele procure pela implementação da interface numa classe que está representada por uma propriedade em nossa classe TBrasileiro, vamos então ver o código:




TBrasileiro = class(TInterfacedObject, ITrabalhador,
ISerHumano)
public
// métodos da interface ISerHumano
function AndarEreto:Boolean;
function Falar:Boolean;
procedure Ouvir;
procedure Correr;
// postergando a implementacao da interface ITrabalhador
function GetTrabalhador:ITrabalhador;
property Trabalhador:ITrabalhador
read GetTrabalhador Implements ITrabalhador;
end;


Agora podemos receber na nossa propriedade Trabalhador, qualquer classe que implemente a interface ITrabalhador. Dessa forma deixamos a implementação desses métodos para outra classe compatível, que poderá trabalhar sendo chamada sob demanda aliviando assim o peso de uma instanciação desnecessária.




Implementando a interface ITrabalhador:




TProgramador = class(TInterfacedObject, ITrabalhador)
public
// métodos da interface ITrabalhador
function Trabalhar:Boolean;
function PagarImpostos:Boolean;
// métodos dessa classe
procedure Dormir;
procedure Acordar;
procedure Comer;
procedure SurfarNaNet;
procedure Programar;
end;


No nosso método GetTrabalhador podemos ter a chamada para uma instância da classe TProgramador, pois existe a compatibilidade gerada pela interface.





function TBrasileiro.GetTrabalhador: ITrabalhador;
begin
Result := (TProgramador.Create) as ITrabalhador;
end;


Outra pecuriaridade importante!



Ao utilizarmos interfaces nas nossas aplicações, devemos reparar que as interfaces são sempre inicializadas com o valor Nil. E são liberadas quando estão fora do escopo ou recebem novamente um valor Nil. Já sei o que você está pensando, se elas iniciam com Nil, e fora do escopo ou quando recebem nil são liberadas então posso utilizar interfaces para referências de objetos diminuindo os meus memory leaks! Isso mesmo podemos utilizar as interfaces para trabalhar nossos objetos, tornando mais segura a nossa aplicação.  Mas … para tanto as interfaces que implementarmos devem descender obrigatoriamente em algum momento de TInterfacedObject,  eu falei que é recomendado o seu uso, lembra? A particularidade de TInterfacedObject ser autosuficiente deve-se ao fato de que em sua implementação do método _Release  e chamado o método Destroy quando o FRefCount chega a 0 (zero), você pode conferir no código na unit System.







Conclusão.



O uso de interfaces no projeto pode melhorar e muito a reusabilidade e flexibilidade de código no mesmo, seu uso nos obriga a ter uma estruturação mais refinada, forçando-nos a sermos mais organizados. Nos permite ainda aplicar o conceito de upCast ( Converter um objeto de um tipo mais especializado para um tipo mais genérico) e também simular a herança múltipla no Object Pascal, aumenta o desaclopamento de classes. Enfim você deve começar a utilizar esse conceito e assim daqui a pouco ele estará correndo nas suas veias e quando for escrever sua classe já irá querer extrair dela uma ou duas interfaces para que sejam amplamente utilizadas no seu projeto.

Rio de Janeiro é eleita a sede das Olimpíadas de 2016




"Rio de Janeiro acaba de ser escolhida a sede das Olimpiadas de 2016. O anúncio oficial foi feito agora há pouco, em Copenhague, onde se reuniu o Comitê Olímpico Internacional (COI) para a realização a eleição o que decidiria a cidade-sede dos Jogos. A capital carioca disputava na última fase votação com a espanhola Madri. O anúncio oficial foi feito às 13h30."
leia na integra em : Rio de Janeiro é eleita a sede das Olimpiadas de 2016

Meu Amor Vai Bem, Meu Mundo Vai Mal


Para aqueles que gostam de poesia e cultura, de momentos de leitura agradáveis, aí vai uma dica, o livro que meu irmão lançou, está disponível para download gratuitamente.
Na página dele vocês terão a oportunidade de saber mais sobre o livro, os motivos que levaram meu irmão a colocá-lo gratuitamente na internet, vocês vão gostar tenho certeza. A capa do mesmo está no banner ao lado, confira!


Não deixem de visitar e quem fizer o download, por favor comentem pelo menos que fizeram o download  e que vão apreciar a obra.

Obrigado à todos !

Clique no link para baixar o livro
Livro de poesia grátis

Criando uma instância de classe à partir do seu nome (string)


Amigos estou trazendo um exemplo de como criar uma classe à partir de seu nome ( String ),  eu já vi alguns exemplos de como fazer isso utilizando forms, mas para classes normais eu ainda não tinha visto nenhum exemplo, então segue abaixo a solução que eu criei.
1- Primeiro crie um form simples como o da figura abaixo tendo 3 edits , 1 bitbtn e 2 labels;
2- Renomeie os componentes conforme o exemplo, por favor.
3- É só clicar no botão e acompanhar ( debug ) para ver o que é feito no código, o efeito de tela nada mais é que o preenchimento dos dois edits de baixo com o valor das propriedades setadas no código.
4- No meu caso a primeira classe eu fiz descendente de TDataModule por uma necessidade minha, mas na realidade ela deve ser descendente de TPersistent



Imagem do form



unit UCriarClasseString;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, AdvSmoothDock, jpeg, ExtCtrls, StdCtrls, Buttons;


type


  TminhaClasse = class (TDataModule)
  private
    FPrimeiraClasse: String;
    procedure SetPrimeiraClasse(const Value: String);
  published
    property PrimeiraClasse:String read FPrimeiraClasse 
    write SetPrimeiraClasse;
  end;


  TMinhaSegundaClasse = class(TminhaClasse)
  private
    FSegundaClasse: STring;
    procedure SetSegundaClasse(const Value: STring);
  published
    property SegundaClasse:STring read FSegundaClasse 
    write SetSegundaClasse;
  end;

  TfrmCriarClasseString = class(TForm)
    btClasse: TBitBtn;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure btClasseClick(Sender: TObject);
  private
    { Private declarations }
    procedure InstanceClasse(AClassName: String);
  public
    { Public declarations }
  end;

var
  frmCriarClasseString: TfrmCriarClasseString;

implementation


{$R *.dfm}


procedure TfrmCriarClasseString.btClasseClick(Sender: TObject);
begin
  InstanceClasse(Edit1.Text);
end;

procedure TfrmCriarClasseString.InstanceClasse
(AClassName: String);
var
  lObj: TMinhaSegundaClasse;
  Pers: TPersistentClass;
begin
  Pers := GetClass(AClassName);
  lObj := (Pers.Create) as TMinhaSegundaClasse;

  if Assigned(lObj) then
  try
    lObj.FPrimeiraClasse := 'Propriedade da Classe ancestral';
    lObj.FSegundaClasse  := 'Propriedade da Segunda Classe';
    Edit2.Text :=lObj.FPrimeiraClasse;
    Edit3.Text :=lObj.FSegundaClasse;
  finally
    lObj.Free;
  end
end;


{ TminhaClasse }

procedure TminhaClasse.SetPrimeiraClasse(const Value: String);
begin
  FPrimeiraClasse := Value;
end;


{ TMinhaSegundaClasse }
procedure TMinhaSegundaClasse.SetSegundaClasse(const 
Value: STring);
begin
  FSegundaClasse := Value;
end;


initialization
  RegisterClasses([TminhaClasse, TMinhaSegundaClasse]);

end.


Link para os arquivos:
UCriarClasseString.pas
UCriarClasseString.dfm

Delphi 2010 ! Ou é o antigo Delphi 7 ?


Uma das novidades do Delphi 2010 é a velha barra de componentes na parte superior do IDE, isso mesmo, agora podemos acabar com o saudosismo da IDE do Delphi 7, podemos configurar nossa IDE para que fique semelhante à do antigo IDE.
Poucos passos e essa configuração é feita, assista ao vídeo onde Andreano Lanusse demonstra como proceder.

Driver nativo para Firebird


Até que enfim a comunidade Delphi que utiliza o FireBird teve seus apelos atendidos, no novo Delphi 2010 o acesso ao banco de dados FireBird está nativo, tendo suporte para versões 1.5 e 2.1.
O novo driver dbExpress para FireBird dá acesso ao banco através do DataExplorer, VCL e do Framework dbExpress assista ao vídeo e confira essa novidade.

Novidades do Delphi 2010


O lançamento do Delphi 2010 traz várias novidades em sua IDE, as novas funcionalidades incluídas são muitas, tornando mais agradável o ambiente de desenvolvimento. Um dos destaques dessas funcionalidades é o IDE Insight, ferramenta que certamente fará alguns desejarem mais que tudo essa nova IDE.
Confira no vídeo apresentado por Andreano Lanusse ( responsável técnico para toda América Latina ) essas novidades.

Confira aqui as Novidades do Delphi 2010

Novo Vírus que infecta códigos em Delphi.



As versões de Delphi que são infectadas são Delphi 4-7.

O que o vírus faz:
Ele substitui o arquivo SysConst.dcu renomeando este para SysConst.bak, assim toda vez que um sistema é compilado ele passa a estar contaminado e a propagar o vírus.

O que você deve fazer!

Utilize um programa de pesquisa (um que seja melhor que a pesquisa do windows, agent Ransak por exemplo ) e procure por "CreateFile (pchar (d + $ $ DCU), 256,0,0,3,0, 0 );". Se você encontrar o arquivo SysConst.bak, significa que o vírus o atacou. Tudo que vc tem que fazer é apagar de SysConst.dcu atual e renomear o arquivo que foi movido para SysConst.bak novamente como SysConst.dcu.

Pronto isso deve resolver seu problema!

Fonte:
Fórum Baboo

Motivação


Olá amigos, minha intenção ao criar esse blog é ter um canal de comunicação com todos, quero falar de programação, música, filmes, cozinha, vinhos, etc. Enfim ter um lugar para trocar idéias com quem visitar esse blog.

abraços!!
 
|  JoséHenriqueBR. Blogger Template By Lawnydesignz Powered by Blogger