quarta-feira, 31 de janeiro de 2007

Introdução a Programação

Tenho alguns amigos super interessados em aprender sobre programação. Fora os alunos, muitos deles ainda iniciando o curso de graduação em informática, outros autodidatas, que sempre precisam de uma introdução sobre o que é programação? Por onde eu começo?

Ouvi falar sobre algoritmo, o que é isso?

Portanto, segue uma tentativa de introdução ao assunto:

INTRODUÇÃO À PROGRAMAÇÃO

Algoritmo:

É a descrição, de forma lógica, dos passos a serem executados no cumprimento de determinada tarefa.

É a forma pela qual descrevemos soluções de problemas do nosso mundo, a fim de serem implementadas utilizando os recursos do mundo computacional. Como este possuí severas limitações em relação ao nosso mundo, exige que sejam impostas algumas regras básicas na forma de solucionar os problemas para que possamos utilizar os recursos de hardware e software disponíveis.

Algoritmo x Programa

Um algoritmo é uma seqüência lógica de ações a serem executadas para se executar uma determinada tarefa. Um programa é a formalização de um algoritmo em uma determinada linguagem de programação, segundo suas regras de sintaxe e semântica, de forma a permitir que o computador possa entender a seqüência de ações.

Linguagem de Programação

Uma linguagem de programação é um conjunto de símbolos ( comandos, identificadores, caracteres ASCII, etc. ... ) e regras de sintaxe que permitem a construção de sentenças que descrevem de forma precisa ações compreensíveis e executáveis para o computador.

LINGUAGEM DE PROGRAMAÇÃO = SÍMBOLOS + REGRAS DE SINTAXE

Uma linguagem de programação é uma notação formal para descrição de algoritmos que serão executados por um computador. Como todas as notações formais, uma linguagem de programação tem dois componentes: Sintaxe e Semântica. A sintaxe consiste em um conjunto de regras formais, que especificam a composição de programas a partir de letras, dígitos, e outros símbolos. Por exemplo, regras de sintaxe podem especificar que cada parênteses aberto em uma expressão aritmética deve corresponder a um parênteses fechado, e que dois comandos quaisquer devem ser separados por um ponto-e-vírgula. As regras de semântica especificam o “significado” de qualquer programa, sintaticamente válido, escrito na linguagem.

Tipos de Linguagens de Programação

Existem diversas linguagens de programação, cada uma com suas características específicas e com níveis de complexidade e objetivos diferentes, como pode ser visto na tabela abaixo:


LINGUAGEM

CARACTERÍSTICAS

Linguagem de Máquina

Única compreendida pelo computador.

Específica de cada computador.

Linguagens de Baixo Nível

Utiliza mnemônicos para representar instruções elementares

Ex.: Assembly

Linguagens de Alto Nível

Utiliza instruções próximas da linguagem humana de forma a facilitar o raciocínio.

Ex.: Uso Científico : Fortran

Propósito Geral : Pascal, C, Basic

Uso Comercial : Java, Delphi, PHP, C#

Uso específico : Lisp, Prolog

Artigo completo (View Full Post)

Padrões e Protocolos da WWW

O W3c (World Wide Web Consortium) é um consórcio de empresas do ramo de tecnologia com o objetivo da adoção e formalização de protocolos que padronizassem todo tipo de tecnologia pertinente ao ambiente web. Sites, ou sistemas, desenvolvidos segundo esses padrões podem ser acessados independente do hardware, ou software utilizados, como por exemplo: Telefone celular, PDA, eletrodomésticos, micro computadores, etc... tornando a questão da plataforma, anteriormente fundamental, agora, totalmente relevante. Exemplo: Um programa para Mac jamais poderia ser executado no Windows do tio Bill.

O Problema em questão é que qualquer fabricante de tecnologia, seja hardware (placa de rede, moden, placa mãe e etc ...), ou software (sistema operacional, browser, aplicativos e etc..), não necessariamente é obrigado a fabricar seu produto para que ele seja compatível com o produzido pelo seu concorrente. Isso conflita com a premissa principal, que sustenta a tecnologia da informação, a possibilidade de sistemas computacionais interagirem. Um consórcio como o W3c, funciona como uma entidade cujo a finalidade é garantir que padrões sejam adotados pelos fornecedores e produtores de tecnologia na fabricação de seus produtos.

Tenho observado o fato do W3C não ser muito conhecido no Brasil, embora que os protocolos por ele definidos: Webservice (SOAP/XML), Javascript, Hyper Text Markup Language (HTML), eXtensible Hypertext Markup Language (XHTML), Cascading Style Sheets (CSS) e uma centena de outros padrões, sejam muito populares, em muitos casos são usados de forma errônea devido ao desconhecimento da especificação. Muitos dos problemas encontrados no desenvolvimento para a www pode ser solucionado se o desenvolvedor conhecer e respeitar os padrões definidos por essa entidade.

http://www.w3.org

Artigo completo (View Full Post)

Internet, Client Side, Javascript

A Internet trouxe uma enxurrada de novidades para os mais variados setores. Mais que mero conteúdo, quero dizer produto final, no que diz respeito a novidades, foi contundentemente impactante no surgimento de novos paradigmas. Os quais, por sua vez, são as origens, o pano de fundo, para novos conteúdos que diariamente se tornam parte integrante desse famigerado gênese virtual. Para mim, foi muito emocionante dar os primeiros passos no cyber espaço. Poder constatar que antigas referências culturais poderiam tomar uma forma totalmente nova, mas, ainda assim, preservando elementos, digamos, estruturais, essenciais conservados, era pra mim inimaginável.

Fico imaginado que nem todas as pessoas compartilham, ou compartilharam, de sentimentos semelhantes aos meus. Outras, me refiro aos mais jovens, provavelmente nem sentiram o impacto dessas mudanças. Mas, nem por isso são menos afetados pela heróica tarefa de se manterem atualizados, antenados, sintonizados com a cultura do seu tempo.

Inúmeras vezes, principalmente quando estou lecionando, me deparo tendo que arranjar um forma de explicar alguma coisa fruto desse fenômeno. Um novo conceito, uma nova metodologia. Algumas vezes o aluno até domina a forma, a aplicabilidade, contudo, o que mais me chama a atenção é a facilidade como se deixa em plano de menor importância do conceito que sustenta determinada tecnologia. Ainda mais escondido, mais distante, está o conhecimento dos fundamentos de um determinado conceito. Não pretendo fechar o assunto por aqui, muito pelo contrario, vou deixar em aberto pois acredito que os demais participantes e eventuais blogers possam acrescentar suas próprias percepções.

Agora, baixando o nível de abstração, aproveitando a deixa, já que estamos falando de web e conceitos novos, decidi aleatoriamente falar sobre Javascript (hehehehehhehe ....).

Uma parte muito sensível no que tange a desenvolvimento de sistemas que suportem a plataforma web é a introdução do conceito de programação do lado servidor e programação do lado cliente. Vamos conduzir nossa discussão, como diria jack, por partes: O que é o lado cliente? De forma objetiva compreendemos o lado cliente, no contexto www (web) o browser (Navegador: Internet Explorer, da MS; Netscape, Opera, Fire Fox, dentre outro são os navegadores mais populares). Nele é efetivado que chamamos de programação do lado cliente (client side).

O JavaScript foi criado para dar mais interatividade e maior funcionalidade às páginas da Web. Desenvolvida pela Netscape, a linguagem JavaScript acabou por dar origem à especificação técnica ECMAScript, que é um padrão oficial reconhecido pela indústria. Apesar de não ser a única a cumprir esse objetivo, é com certeza a mais conhecida. A versão produzida pela Microsoft recebeu o nome de JScript, na verdade trata-se de implementações que, sendo fiéis à norma ECMAScript, cada fabricante lhe acrescentaram novas funcionalidades úteis, mas respeitando sempre as especificações oficiais. O Padrão ECMA, o ECMA-262, conhecido como ECMAScript é adotado também pela linguagem ActionScript da Macromedia (utilizada no Flash).

O código escrito em JavaScript destina-se a ser executado pelo browser quando a página HTML que o contém é construída. Desta forma ela passa a ser não apenas um conteúdo para mera visualização, mas muito além disso permite que processos complexos possam ser executados, de acordo com o objetivo do desenvolvedor, mediante a interação do internauta, ou em resposta a eventos ocorridos no próprio browser. O JavaScript é uma parte integrante da página e permite que o browser seja capaz de tomar decisões quanto ao modo como o conteúdo é apresentado ao utilizador (internauta/usuário) e como pode ser manipulado.

JavaScript é uma linguagem de programação criada pela Netscape em 1995, que a princípio se chamava LiveScript, para atender, principalmente, as seguintes necessidades:

  • Validação de formulários no lado cliente (programa navegador, browser);
  • Interação com a página. Por isso, feita como uma linguagem de script. Ou seja, não compilada, interpretada, no caso pelo navegador. Javascript tem sintaxe semelhante a do C, conseqëntimente também do Java, mas é totalmente diferente no conceito e no uso.
  • Alterar valores de elementos HTML;
  • Criar elementos HTML;
  • Controlar interação entre molduras.
  1. Oferece tipagem dinâmica - tipos de variáveis não são definidos;
  2. É interpretada, ao invés de compilada;
  3. Possui ótimas ferramentas padrão para listagens (como as linguagens de script, de modo geral);
  4. Oferece bom suporte a expressões regulares (característica também comum a linguagens de script).
  5. Suporta Orientação a Objetos (OO).

Sua união com o CSS é conhecida como DHTML. Usando o Javascript, é possível modificar dinamicamente os estilos dos elementos da página em HTML.

O uso de JavaScript em páginas XHTML, pelo padrão W3C, deve ser informado ao navegador da seguinte forma:


"<script type="text/javascript">

/* aqui fica o script */

</script>"



Ou seja, para que o navegador saiba que determinado trecho de código seja interpretado como Javascript basta que ele esteja entre as “tags” exemplificadas acima.

Javascript não é Java:

O LiveScript, linguagem da Netscape terminou mudando de nome com a participação da Sun Microsystems no projeto. A versão Beta 2 do Netscape, em 1995, já trazia estampada para a linguagem o novo nome: JavaScript, por pura questão de marketing. uma linguagem que se tornaria um padrão e sinônimo de processamento cliente em páginas web.

Links para pesquisa:

o http://www.artifice.web.pt/tutoriais/cntd/intro_js1.html

o http://pt.wikipedia.org/wiki/JavaScript

o http://www.javascript-tutorial.com.br/

o http://bardo.cyaneus.net/node/311

o http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/1e9b3876-3d38-4fd8-8596-1bbfe2330aa9.asp

o http://www.javascript-tutorial.com.br/content-cat-1.html

Referências:

o http://www.artifice.web.pt/tutoriais/cntd/intro_js1.html

o http://pt.wikipedia.org/wiki/JavaScript

o http://bardo.cyaneus.net/node/311

o http://www.ecma-international.org/

o http://www.w3.org/

Artigo completo (View Full Post)

Métodos estáticos Vs Métodos de instância

Olá a todos. O post de hoje traz um assunto muito interessante: métodos estáticos e métodos de instância.

Primeiro vamos às explicações: Métodos de instância são os métodos que declaramos normalmente na nossa classe e devem ser chamados dentro de uma instância de classe. Exemplo:

class Exemplo {
public int Soma(int a, int b) {
return (a + b);
}
}

Este método deve ser chamado apenas dentro de uma instância da classe Exemplo, como segue:

Exemplo ex = new Exemplo();
int resultado = ex.Soma(2, 1);
// resultado será 3


Enfim esta é a forma padrão de implementar métodos. Agora veremos uma outra forma, usando a mesma classe Exemplo

class Exemplo {
public static int Soma(int a, int b) {
return (a + b);
}
}


No método estático não precisamos de uma instância para executar; então podemos fazer a chamada direta ao método. Veja a chamada:

int resultado = Exemplo.Soma(2, 1);
// resultado será 3


Desta forma não fazemos alocação de memória e processamento para criar instância, nem dá trabalho para o Garbage Collector.

Os métodos estáticos são usados principalmente em operações matemáticas e outras operações que não dependem da instância. A .NET Framework tem uma classe chamada Math que implementa muitos métodos estáticos.

Então é isso. Boa semana a todos e pratiquem bastante!

Artigo completo (View Full Post)

terça-feira, 30 de janeiro de 2007

Fim de Semana de PS2

Olá meus amigos! (meio gay, mas agora já era...)

Esse fds resolvi detonar no meu PS2 jogando FIFA 07. Eu jogava da dificuldade Professional e tava me achando o máximo quando soube que o Daniel já tava dando coro na máquina no World Class. Eu pensei "não posso ficar pra trás". Coloquei a máq no World Class e meu irmão, depois de perder pra mim no FIFA e no WE me desafiou: "Coloca botafogo contra Barcelona". "Valeu então, já é". O Jogo começa: bla bla bla bla bla... final 6x2........ Barcelona. Quase quebrei o controle hehe.

Depois também coloquei Chelsea x Barcelona e consegui ganhar. Issa!!!!

Valeu pessoal. Daqui a pouco posto sobre algum assunto sério. Valeu.

Artigo completo (View Full Post)

segunda-feira, 29 de janeiro de 2007

Post #2. O Ruby dá luz em cima, o Delphi dá luz embaixo. E o Java???

Falae, pessoal!

Tô eu navegando na internet, procurando artigos interessantes para postar aqui no blog, quando descobri uma coisa interessante. Uma empresa que faz pesquisas sobre a popularidade das linguagens de programação mensalmente, baseando-se nas ferramentas web de pesquisa como Google, Yahoo, MSN...

A última pesquisa foi feita esse mês e, pra minha decepção, descobri que o Delphi perdeu 3 posições entre as linguagens mais populares, ocupando da 12ª posição. Neste mesmo período do ano passado, o Delphi era a 9ª ferramenta mais popular. Será que isso quer dizer alguma coisa?
Como era de se esperar, o Java encabeça a lista (grrrrrrrrrrrr), seguido do C e do C++.

Mas o que me impressionou foi uma linguagenzinha criada por um japonês chamada Ruby. Ela subiu 11 posições com relação a pesquisa feita em 2006. O que será que essa japonezinha tem de bom, hein? Fiquei um tanto quanto intrigado.

Agora pasmem! O Visual Basic conseguiu subir uma posição e hoje ocupa, nada mais, nada menos, do que a 4ª posição entre os mais populares! É, amigo! Eu acho que a boa é deixar de ser desenvolvedor Delphi e começar a fazer transporte de dlls pros programadores VB ou então virar digitador de código Java... Vou ficar rico! Hehehehe!
A pesquisa completa vocês encontram em http://www.tiobe.com/tpci.htm

Abraço a todos!

Artigo completo (View Full Post)

Post #1. Toma essas teclas, carai!

Fala aí, galera!

Bom, pra quem não me conhece, sou Daniel Bezerra e fui convidado pra participar desde blog, enviando novidades, notícias, códigos, musiquinhas, mp3 (quem conhece, entendeu)...

Eu estou preparando uns possíveis posts legais, mas como ando meio sem tempo, vai ser meio complicado postar tão rápido o que eu estou pretendendo mostrar pra vocês.

Diante disso, pra eu confirmar a minha participação, vou postar pra vocês aqui uma solução pra quem está de saco cheio de ficar fazendo comandos repetitivos.

Aquele que não teve que testar seu programa, ou até mesmo programas de terceiros, que nunca teve que digitar milhões de vezes um usuário e uma senha e nunca ficou de saco cheio disso que atire a primeira pedra. É claro que, sendo um programa desenvolvido por você mesmo, no caso do Delphi, por exemplo, você pode colocar uma diretiva de compilação e suprimir o login. Mas vai dizer que você, pelo menos uma vezinha, não quase mandou pra produção um sistema sem login (hehehe)?

Hoje estou trabalhando como analista. Especifico e testo as aplicações desenvolvidas pelos programadores. Não tenho como suprimir uma tela de login, uma vez que, teoricamente, não tenho acesso aos fontes. Diante disso, pensei: por que eu estou digitando milhares de vezes um usuário e senha, se o computador pode fazer isso por mim? Gente! Vamos automatizar os processos, pelo amor de Deus! Pra quê nós, humanos, fazermos trabalhos repetitivos, se a máquina pode fazer isso pra gente? Foi daí que surgiu a idéia do sistema de impressão automática, postado mais aqui abaixo pelo meu caro amigo Gerson (quem quiser saber da história, um dia a gente pode contar).

Diante do problema, fui pedir ajuda ao Pai da informática atual: Google. Se não tem no Google, é porque não existe! Logo, achei! Uma bibliotecazinha que faz todo o trabalho pra você. Muito fácil de implementar! Vocês encontram a biblioteca em http://home.conceptsfa.nl/~gvdvenis/downloads/sndkey32.pas.

A biblioteca tem vários procedimentos e funções, mas o básico é o seguinte: você chama a função AppActivate, passando o nome da janela que você pretende manipular. Se retornou True, é porque ele achou a janela. Daí é só começar a brincadeira. Chama a função SendKeys passando no primeiro parâmetro as teclas que você quer enviar ao programa e, no segundo parâmetro, se a função deve esperar cada tecla ser processada. Pra quem conhece o VB (eca!), qualquer semelhança não é mera coincidência.

Teclas especiais do teclado também podem ser enviadas, como, por exemplo, um F10 ou um TAB. Basta colocar entre chaves, assim: {F10}{TAB}. Na própria biblioteca você encontra uma “documentação” mostrando como trabalhar com as teclas especiais.

Eu, por exemplo, fiz um projetinho onde eu cadastro num ClientDataSet desconectado (XML) o caminho do executável de um programa, o nome da tela dele e a combinação de teclas que eu quero enviar. Daí, quando eu quero executar um programa, é só dar um duplo clique no registro da grid! =D Meu sisteminha já abre o programa “tomaticamente” e manda a combinação de teclas pra ele. Login em sistemas, nunca mais! Hehehehe!

Bom, é isso, pessoal! Quem tiver alguma dúvida ou quiser fazer algum comentário, manda aí que eu tô na área. Abraço a todos!


Artigo completo (View Full Post)

quinta-feira, 25 de janeiro de 2007

Ligue para 5150

Essa é muito boa.

Nos EUA há um número que você pode ligar quando algum maluco estiver fazendo merda na rua: 5150

A definição em inglês:
Police code for crazy one on the loose. Danger to property, danger to others, and danger to themselves....

Significa que, se alguma pessoa fora de si começar a fazer merda por aí, você (o americano no caso) liga para este número e a polícia vem.

you better call the cops before she goes 5150 on your ass.

Abraços.

Artigo completo (View Full Post)

Centralizando o conteúdo na página com Layout fixo


Olá a todos (novamente). Agora uma dica rápida de css para quem quer definir um layout de largura fixa e centralizado. Antigamente isso era possível usando table ou div para colocar o conteúdo centralizado. Agora podemos fazer isso facilmente definindo um estilo para o objeto body. Vejam só:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<style type="text/css">
body {
width: 700px;
margin: 0 auto;
}
</style>
</head>
<body>
<div style="border: solid 1px black;">
Oi Conteúdo centarlizado ocupando todo o tamanho disponível
</div>
</body>
</html>


Estou usando aqui o XHTML 1.1. Eu já testei com XHTML 1.0 e HTML 4.01 e também rola. Falando de navegadores, no IE7 e no Firefox 2 rola. Acho que no IE6 também rola, já que é CSS padrão.

Analisando o CSS:

body {
width: 700px;
margin: 0 auto;
}


Definimos a largura padrão para o documento de 700px e as margens como: 0 para superior e inferior e automática prar esquerda e direita.

O CSS para margens funciona assim:

margin: [superior] [direita] [esquerda] [inferior];


Caso informe somente um valor este será aplicado para todas as margens. Caso informe dois serão repetidos conforme a explicação acima.

As margens auto na direita e na esquerda indicam para o navegador dividir o espaço que sobra entre os lados, centralizando o conteúdo.

Acabou sendo mais longo que eu pensei, mas tá maneiro :) Abraços e até mais.

Artigo completo (View Full Post)

BDS 2006, Delphi e .NET

Olá a todos. O Gerson me arrumou finalmente uma cópia do Borland Developer Studio 2006 (BDS 2006).

Eu pude perceber que ainda usa a versão 1 da .NET Framework (O VS 2005 já usa a 2).

Procurando um pouco na Internet eu encontrei este artigo bem interessante:

Artigo sobre BDS 2006, Delphi e .NET (em inglês).

Eu acabei concordando com vários pontos do artigo. Quem me conhece sabe que eu também sou um dos muitos que levanta a bandeira do Delphi.

Como estou entrando no .NET agora e decidi aprender C# eu acredito que o Visual Studio seja a melhor opção para mim. Para quem desenvolve em Delphi e quer continuar com Delphi acho que vale a pena usar o BDS.

Falou então. Leiam o artigo e tirem suas conclusões. E comentem também para que a gente consiga fazer uma boa discussão sobre esse assunto. Abraços.

Artigo completo (View Full Post)

Tela azul da morte!


Olá Pessoal (hauahuahauahuahaua). Este post é diferente: venho mostrar algo muito estranho(?) que aconteceu comigo: Blue Screen of Death.

Ora Felipe, tela azul da morte? Haha... Tá maluco.. no Grandioso Windows XP (Xuxa Park) isso não acontece mais... Ora ora... para quem não acredita aí está a prova:

Free Image Hosting at www.ImageShack.us

Hauhauahauhauaha não perdi tempo e tirei logo a foto para ficar 'resistrado'.

É isso aí. Abraços a todos e até mais.

Artigo completo (View Full Post)

quarta-feira, 24 de janeiro de 2007

Uma forma inteligente de abrir um DataSet em Delphi

Em nossos aplicativos Delphi sempre temos muitas linhas de códigos repetidas para fechar DataSet, passar parâmetros e abrir novamente. Para reduzir um pouco o código digitado e o tempo de digitação; e ainda deixar o código mais limpo, legível e bonito, vamos implementar um método padrão de abrir DataSet passando os parâmetros.

Primeiro o Gerson construiu métodos com sobrecarga para cobrir os diferentes casos. A idéia já era ótima, mas nós acabamos juntos chegando a esta 'ultimate' solução Hehe.

Este método deve ser um procedimento global ou um método público de um objeto:

procedure AbrirDataSet(DataSet: TDataSet; Parametros: array of Variant);
var
i: Integer;
begin
DataSet.Close;
for i := 0 to Pred(Length(Parametros)) do
DataSet.Params[i].Value := Parametros[i];
DataSet.Open;
end;


Pronto. Simples, não :)

Lembrando: na unit em que este método for declarado tem que ter as units DB e Variants na cláusula uses

O parâmetro DataSet representa o DataSet que vai ser usado - Pode ser qualquer classe derivada de TDataSet (como TClientDataSet, TADODataSet, TBDEDataSet, etc...).

O Parâmetro Parametros é um array contendo os valores dos parâmetros que serão passados para o DataSet. Detalhe: os parâmetros devem ser passados na mesma ordem que está na propriedade Params do DataSet.

Pronto. Agora na aplicação ao invés de ter no mínimo 3 linhas de código para abrir o DataSet só precisa uma:

AbrirDataSet(CdsProdutos, [EditDescricao.Text]);


O exemplo acima vai passar o valor do EditDescricao para o primeiro parâmetro do DataSet CdsProdutos e vai abrir o DataSet.

Para mais parâmetros é só separá-los com vírgulas dentro dos colchetes - Os colchetes são necessários porque o parâmetro é um array.

Então é isso. Divirtam-se e procurem sempre maneiras de fazer o menor e mais bonito código possível. Abraços.

Artigo completo (View Full Post)

Implementando um layout mais limpo e sem tabelas

Este assunto não é muito novo, mas acho que vale a pena falar algo aqui sobre este assunto. Há um tempo atrás era uma obrigação usar e abusar de tabelas para conseguir fazer um layout de várias colunas dentro do site.

Hoje em dia há uma nova forma de construir layout: tableless. Quem é/era acostumado a construir layouts com tabelas sabe como é chato e trabalhoso trabalhar com tabelas para layout. E ainda tem outro problema: quando temos que mexer no layout nós temos um sério problema se usamos tabelas. Principalmente na relação designer/programador (hehe).

Agora com divs e CSS nós conseguimos construir estes layouts de forma muito mais fácil e prática. Com um pequeno código html vou mostrar como fazer um layout padrão de site com 3 colunas somente usando div.

código HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>Layout de colunas sem tabelas</title>

<style type="text/css">
#cabecalho {
clear: both;
height: 50px;
background: #eaeaea;
margin-bottom: 5px;
}

#esquerda {
float: left;
width: 120px;
height: 300px;
background: #eaeaea;
}

#direita {
float: right;
width: 120px;
height: 300px;
background: #eaeaea;
}

#conteudo {
margin-left: 130px;
margin-right: 130px;
height: 300px;
}

#rodape {
clear: both;
height: 20px;
background: #eaeaea;
margin-top: 5px;
}

</style>

</head>


<body>

<div id="cabecalho">
Cabeçalho
</div>

<div id="esquerda">
Esquerda
</div>

<div id="direita">
Direita
</div>

<div id="conteudo">
Conteúdo
</div>

<div id="rodape">
rodapé
</div>

</body>

</html>


o resultado fica assim:



Cabeçalho


Esquerda


Direita


Conteúdo


Rodapé



Os tamanhos foram reduzidos para caber aqui mas as propriedades são as mesmas.

Agora vamos estudar os estilos css dos elementos acima:

float: indica onde a camada vai 'flutuar' de acordo com o próximo elemento - possui como opções left, right e none.

clear: indica que esta camada não vai permitir flutuações na posição especificada - possui como opções left, right e both.

A regra deste layout é que a ordem das colunas deve ser sempre esta: primeiro coluna da esquerda, depois coluna da direita e por último a coluna do meio.

Nas colunas da esquerda e da direita definimos uma largura de 120px, cada uma com seu respectivo float. Na div do conteúdo definimos as margens esquerda e direita como 130px. Isso é para fazer com que o texto do conteúdo sempre fique dentro destes limites, mesmo que as colunas laterais já tenham acabado.

O cabeçalho e o rodapé possuem a propriedade clear: both para não serem afetados pela flutuação das camadas. A margem inferior do cabeçalho e inferior do rodapé são apenas para manter um espaço entre os elementos.

Quem quiser aprender mais sobre tableless, há um ótimo site brasileiro sobre o assunto, inclusive com vídeo aulas: www.tableless.com.br.

Então é isso. Agora nós já podemos construir layouts de forma mais simples e que permita alteração mais facilmente. Tabelas agora serão somente para o que elas servem: dados tabulares. Até mais.

Artigo completo (View Full Post)

Validação de form ficou muito mais fácil

Olá a todos. Neste post vou mostrar mais dois componentes muito valiosos do ASP.NET: RequiredFieldValidator e RegularExpressionValidator.

Estes componentes fazem validação de dados automaticamente no lado cliente e servidor (é possível escolher apenas um dois dois também). O RequiredFieldValidator testa se o campo está preenchido ou não; já o RegularExpressionValidator faz validação de acordo com uma string de validação que é uma RegularExpression (para saber mais sobre Regular Expression clique aqui).

Como eles funcionam? Primeiro associamos nosso componente de validação a um controle do WebForm através da propriedade ControlToValidate. Depois definimos a mensagem que deverá ser exibida para o usuário na propriedade ErrorMessage. No caso do RequiredFieldValidator está pronto; no caso do RegularExpressionValidator precisamos informar a expressão de validação na propriedade ValidationExpression. No exemplo abaixo vamos ver uma validação de um campo de e-mail com esses componentes.


<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
Entre com o e-mail para validação:
<asp:TextBox ID="TxtEmail" runat="server"></asp:TextBox>
<asp:Button ID="BtnOk" Text="Ok" runat="server" />
<br />
<asp:RequiredFieldValidator ID="RequiredFieldValidator1"
runat="server" ControlToValidate="TxtEmail"
Display="Dynamic" ErrorMessage="Este campo é obrigatório">
</asp:RequiredFieldValidator>

<asp:RegularExpressionValidator ID="RegexValidator"
ControlToValidate="TxtEmail" runat="server" Display="Dynamic"
ErrorMessage="E-mail inválido"
ValidationExpression="\b[a-zA-z0-9_.%-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z]{2,4}\b">
</asp:RegularExpressionValidator>

</div>
</form>
</body>
</html>



Vamos dar uma olhada à nossa Regular Expression de validação:
\b[a-zA-z0-9_.%-]+@[a-zA-Z0-9_.-]+\.[a-zA-Z]{2,4}\b


\b indica para pesquisar antes e depois de qualquer seqüência alfanumérica
[a-zA-z0-9_.%-]+ - pesquisar um caractere entre a e z, A e Z, 0 a 9 e os _, ., % e - repetidas vezes (nome do usuário)
@ - o literal @
[a-zA-Z0-9_.-]+ - mesmo do anterior, apenas com menos símbolos (domínio)
\. - o literal "."
[a-zA-Z]{2,4} - somente letras, mas com limite entre 2 e 4 caracteres.

A validação de dados é feita no lado cliente e no servidor também. Caso o cliente não tenha script cliente ativado (ou funcionando) a validação ainda é feita no servidor. Se você for neurótico (como eu hehe) ainda pode fazer o teste de validação no lado servidor. Sempre que temos estes componentes de validação no WebForm a cada postback (envio de dados para o servidor) a propriedade IsValid do objeto Page é atualizada. Ou seja: se você quiser fazer validação no lado servidor é só checar a expressão Page.IsValid dentro de qualquer método dentro do WebForm.

Bem, ainda não posso dizer que isso é tudo, mas é um bom começo. Há muito mais componentes de validação no ASP.NET e vimos com estes que agora a tarefa de validação ficou muito mais fácil e divertida. até mais para todos e não deixem de acessar o site do nosso amigo Bruno Lichot.

Abraços.

Artigo completo (View Full Post)

terça-feira, 23 de janeiro de 2007

Saaaalve galera!

La vamos começar os posts colocando meu link, downloads, matérias, exemplos, slides e vídeos...de Delphi é claro... hehehehe

http://cc.codegear.com/Author.aspx?ID=795118

Abraços

Bruno Lichot
CodeGear Team Brazil

http://www.codegear.com
http://cc.codegear.com/Author.aspx?ID=795118

Artigo completo (View Full Post)

Evoluindo o Programa de Impressão

                          Delphi Automação OLE - Pate II

Construi esses exemplos a partir de uma experiência no trabalho. Certa vez,
o lider da equipe entra na sala bem nervoso, semi-desesperado, pedidinod que nós
interronpessemos o que estavamos fazendo por conta de uma situação administrativa.
Toda a documentação de um sistema gigante deveria ser impressa. Não havia, é claro
profissionais específicamente designados para tal tarefa, ou pelo menos não o
sufiente. Portanto, toda a fabrica de software estaria convocada a imprimir toda
documentação. Fui rememetido as profundesas do meu pensamento, indignado,
ainda indeciso sobre como responderia a essa situação, quando o Daniel,
compartinhando da mesma indignação sugeriu que fosse codificado um programa tal
realizar tal tarefa ...
(continua nos próximos post - O desafio ... tchan
tchan tchan!!)

1) Inicie uma applicação no Delphi
No menu principal selecione: File - New - Application
2) Adicione no Form1 os seguintes componentes, seguindo exatamente a ordem abaixo,
e configure suas respectivas propriedades conform listado:

I Panel (Palheta Standard):
BevelOuter = bvNone
Name = PnlTreeView
Align = alLeft

II Splitter(Palheta Additional):
Name = Splitter1
Beveled = True
Align = alLeft

III Panel (Palheta Standard):
Name = PnlListView
BevelOuter = bvNone
Align = alLeft

IV Splitter(Palheta Additional):
Name = Splitter2
Beveled = True
Align = alLeft

V PopUpMenu(Palheta Standard):
Name = PopupMenu
Com o botão direito do mouse no PopupMenu selecione Menu Designer.
Adicione os Seguntes Itens de menu:
- Imprimir Todos
- Imprimir Selecionados
- Excluir Todos
- Excluir Selecionados

VI Panel (Palheta Standard):

Name = PnlLstFile
BevelOuter = bvNone
Align = alClient

VII FileListBox(Palheta Win3.1)
Coloque o FileListBox no PnlLstFile
Name = LstFile
PopupMenu = PopupMenu //Para associar o PopupMenu ao LstFile
Align = alClient

VIII ShellTreeView (Palheta Samples):
Coloque o ShelTreeView no PnlTreeView
Name = ShellTreeView
Align = alClient

XIII ShellListView (Palheta Samples):
Coloque o ShelTreeView no PnlListView
Name = ShellListView
Align = alClient

IX WordApplication (Palheta Servers):

X WordDocument (Palheta Servers):

XI ExcelWorkbook (Palheta Servers):

XII ExcelApplication (Palheta Servers):


3) Vamos oo Código agora.
A seção Type na unit do Fomr1 deverá estar assim
  Type          
TForm1 = class(TForm)
PnlTreeView: TPanel;
PnlListView: TPanel;
Splitter1: TSplitter;
PnlListFile: TPanel;
ShellTreeView1: TShellTreeView;
ShellListView1: TShellListView;
Splitter2: TSplitter;
LstFile: TFileListBox;
PopupMenu: TPopupMenu;
ImprimirTodos1: TMenuItem;
ImprimirSelecionados1: TMenuItem;
N1: TMenuItem;
ExcluirTodos1: TMenuItem;
ExcluirSelecionados1: TMenuItem;
WordApplication1: TWordApplication;
WordDocument1: TWordDocument;
ExcelWorkbook1: TExcelWorkbook;
ExcelApplication1: TExcelApplication;
private
{ Digite as Funções em vermelho codificadas abaixo,
em seguida pressione "CTRL + SHIFT + C" }

procedure FindFiles(FilesList: TListBox; StartDir,
FileMask: string);
procedure PrintFile(SelectedOnly: Boolean = False);

public
{ Public declarations }
end;

3.1) Uma função que listará os arquivos que serão impressos - FindFiles

procedure TForm1.FindFiles(FilesList: TListBox; StartDir, FileMask: string);
var
SR: TSearchRec;
DirList: TStringList;
IsFound: Boolean;
i: integer;
begin
if StartDir[length(StartDir)] <> '\' then
StartDir := StartDir + '\';


{ Contruindo a Lista de Diretórios - StartDir}

IsFound :=
FindFirst(StartDir+FileMask, faAnyFile - faDirectory, SR) = 0;
while IsFound do
begin
FilesList.Items.Add(StartDir + SR.Name);
IsFound := FindNext(SR) = 0;
end;
FindClose(SR);

// Contruindo a listagem dos Subdiretórios
DirList := TStringList.Create;
IsFound := FindFirst(StartDir + '*.*', faAnyFile, SR) = 0;
while IsFound do
begin
if ((SR.Attr and faDirectory) <> 0) and (SR.Name[1] <> '.') then
DirList.Add(StartDir + SR.Name);

IsFound := FindNext(SR) = 0;
end;
FindClose(SR);

for i := 0 to DirList.Count - 1 do
FindFiles(FilesList, DirList[i], FileMask);

DirList.Free;

end;



3.2) Codificando o evento OnClick do item do menu Popup "Excluir Selecionados"

procedure TForm1.ExcluirSelecionados1Click(Sender: TObject);
begin
LstFile.DeleteSelected;
end;


3.3) Codificando o evento OnClick do item do menu Popup "Excluir Selecionados"

procedure TForm1.PrintFile(SelectedOnly: Boolean);
const

LCID: DWORD = LOCALE_SYSTEM_DEFAULT;
var
i: Integer;
MyDoc: _Document;
MyExel: _Workbook;
MyPath: String;
MyArq, ASave, AReadOnly: OleVariant;
Printed: Boolean;
StatusImpressora: TWMSpoolerStatus;
begin
Printed := False;
Asave := False;
AReadOnly := True;

(* A função IncludeTrailingPathDelimiter garante no final do path name a presensa do "\" *)
MyPath := IncludeTrailingPathDelimiter(ShellTreeView1.Path);

for i := 0 to Pred(LstFile.Items.Count) do
begin
if (SelectedOnly and LstFile.Selected[i]) xor not(SelectedOnly) then
begin
MyArq := MyPath + LstFile.Items[i];
if (pos(UpperCase('.doc'), UpperCase(LstFile.Items[i])) > 0) then
begin
MyDoc := WordApplication1.Documents.Open(MyArq, EmptyParam,
AReadOnly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam);
WordDocument1.ConnectTo(MyDoc);
WordDocument1.Activate;
WordDocument1.PrintOut;
WordApplication1.Disconnect;
WordDocument1.Close(ASave);
WordDocument1.Disconnect;
Self.Caption := MyArq;
end
else if pos(UpperCase('.xls'), UpperCase(LstFile.Items[i])) > 0 then
begin
MyExel := ExcelApplication1.Workbooks.Open(MyArq , EmptyParam,
AReadOnly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
EmptyParam, EmptyParam, EmptyParam, EmptyParam, LCID);
ExcelWorkbook1.ConnectTo(MyExel);
ExcelWorkbook1.Activate;
ExcelWorkbook1.PrintOut;
ExcelWorkbook1.Close(ASave);
ExcelWorkbook1.Disconnect;
Self.Caption := MyArq;
end;
end;
end;

end;

3.5) Codificando o evento OnClick do item do menu Popup "Excluir Todos"

procedure TForm1.ExcluirTodos1Click(Sender: TObject);

begin
LstFile.Clear;
end;


3.6) Codificando o evento OnClick do item do menu Popup "Imprimir Selecionados"


procedure TForm1.ImprimirSelecionados1Click(Sender: TObject);

begin
PrintFile(True);
end;


3.7) Codificando o evento OnClick do item do menu Popup "Imprimir Todos"


procedure TForm1.ImprimirTodos1Click(Sender: TObject);

begin
PrintFile;
end;


3.8) Codificando o evento OnChange do ShellTreeView1 - " ShellTreeView1Change "

procedure TForm1.ShellTreeView1Change(Sender: TObject; Node: TTreeNode);

begin
if (ShellListView1.ShellTreeView.Path = '') or
(Pos(':\', ShellListView1.ShellTreeView.Path) = 0) then Exit;
LstFile.Directory := ShellListView1.ShellTreeView.Path;
end;


3.9) Codificando o evento OnClick do item do menu Popup "Imprimir Todos"

procedure TForm1.ImprimirTodos1Click(Sender: TObject);
begin
PrintFile;
end;

Artigo completo (View Full Post)

Autoboxing

Quando se usam estruturas de dados, é interessante armazenar objetos genéricos, da classe Object, dentro delas para que seus elementos fiquem independentes dos aplicativos que as usam. Dessa forma, uma estrutura pode ser usada por qualquer aplicativo sem nenhuma modificação. Em muitos casos, o polimorfismo permite o tratamento genérico de um objeto deixando para a máquina virtual a descoberta de sua classe específica.

No entanto, é freqüente a necessidade de manter números, caracteres, ou valores lógicos nessas estruturas, mas a linguagem Java define esses tipos como primitivos, ou seja, não são objetos. Para resolver este problema, há uma classe invólucro (wrapper, em inglês) para cada tipo primitivo. Essas classes, Byte, Short, Integer, Long, Character, Float, Double, Boolean, encapsulam os valores primitivos correspondentes e permitem armazená-los em estruturas genéricas.
O preço que se pagava ao resolver este problema era a exigência de muitas conversões explícitas feitas pelo programador porque os operadores associados aos tipos primitivos só podem ser aplicados a esses tipos primitivos. Lembre-se que em Java não há sobrecarga de operadores aritméticos ou lógicos. O código é tedioso na escrita e confuso na leitura.

O autoboxing endereça justamente este problema. Além de permitir o armazenamento de tipos primitivos, como no passado, esta novidade evita as conversões explícitas antes exigidas dos programadores. Em outras palavras, as conversões são feitas implicitamente pelo compilador.
Para ilustrar o que dissemos, o exemplo abaixo mostra dois métodos, objeto e primitivo, que recebem, respectivamente, um parâmetro do tipo objeto e um do tipo primitivo. As chamadas destes métodos, feitas no método main, passam argumentos primitivos inteiros e objetos do tipo inteiro para cada um dos métodos. O exemplo também mostra o uso direto de objetos em operações aritméticas. As conversões, que antes tinham que ser feitas explicitamente pelo programador, agora são implicitamente feitas pelo compilador. Exemplo:

public class AutoBoxing {
public static void main(String[] args) {

objeto(8); // primitivo em objeto
objeto(new Integer(8)); // objeto em objeto
primitivo(9); // primitivo em primitivo
primitivo(new Integer(9)); // objeto em primitivo

System.out.println("Operação aritmética: " +
(new Integer(20) + new Integer(30)));

Integer a = new Integer(5);
System.out.println(++a);

}
public static void objeto(Integer x) {
System.out.println("Parâmetro objeto com valor: " + x);
System.out.println("Operação aritmética: " + (2 * x + 2));
}
public static void primitivo(int x) {
System.out.println("Parâmetro primitivo com valor: " + x);
}
}
Resumindo, autoboxing é a conversão implícita feita entre os tipos primitivos e seus correspondentes invólucros. Este açúcar introduzido na linguagem evita as conversões explícitas, tediosas e confusas, quando se usam objetos genéricos dentro de coleções.

Artigo completo (View Full Post)

Declação de Classes

Quando escreve código em Java, você está escrevendo classes ou interfaces. Dentro dessas classes, como você sabe, existem variáveis e métodos (além de algumas outras coisas).
O modo como você declara as suas classes, métodos e variáveis afeta dramaticamente o comportamento do seu código. Por exemplo, um método público pode ser acessado a partir de código que esteja rodando em qualquer parte da sua aplicação. No entanto, se você marcar esse método como privado, ele desaparecerá de todos os radares (exceto o da classe na qual foi declarado).

Regras de Declaração para Arquivos-Fontes

. Só pode haver uma classe public em cada arquivo de código-fonte.
. Os comentários podem aparecer no início ou no fim de qualquer linha no arquivo do código-fonte; eles são independentes de qualquer das regras de posicionamento discutidas aqui.
. Se houver uma classe public em um arquivo, o nome do arquivo deve ser o mesmo da classe public. Por exemplo, uma classe declarada como public class Dog { } precisa estar em um arquivo de código-fonte chamado Dog. java.
. Se a classe fizer parte de um pacote, a declaração package deve estar na primeira linha do arquivo do código-fonte, antes de quaisquer declarações import que estejam presentes.
. Se houver declarações import, elas devem ficar entrea declaração package (se houver) e a declaração da classe. Se não houver uma declaração package, então a(s) declaração(ões) import deve(m) estar na(s) primeira(s) linha(s) do arquivo do código-fonte. Se não houver declarações package nem import, a declaração da classe deve estar na primeira linha do arquivo do código-fonte.
. As declarações import e package aplicam-se a todasas classes dentro de um arquivo de código-fonte. Em outras palavras, não é possível declarar múltiplas classes em um arquivo e tê-las em diferentes pacotes,ou usar diferentes importações.
. Um arquivo pode ter mais de uma classe não-pública.
. Arquivos que não tenham classes públicas podem ter um nome que não seja o mesmo de nenhuma das classes do arquivo

Artigo completo (View Full Post)

Projeto JEDI Java

Iniciado pela Universidade das Filipinas, nasce através do Java Research & Development Center, a iniciativa JEDI (Java Education and Development Initiative), em Fevereiro de 2005.
A partir desta data, o JEDI vem sendo desenvolvido como um projeto colaborativo, que
conta com o apoio da comunidade Java em todo o mundo. Tem como principais objetivos o de melhorar a experiência do ensino e da aprendizagem; Aumentar a qualidade dos graduados em Ciência da Computação e Tecnologia da Informação (disponibilizando os materiais de seus cursos gratuitamente para quem se interessar); Aumentar o banco de especialistas em Java e, Fornecer serviços e produtos a altura das necessidades do mercado mundial.


O JEDI, entra neste contexto de forma totalmente gratuita para a comunidade e
disponibiliza todo o acesso aos cursos e materiais. O aluno terá ao seu dispor manuais,
slides de apresentação das aulas, provas, exercícios e material de referência e vídeo-aulas.
Contando ainda com os softwares, o treinamento de instrutores, o acesso a suporte e a lista de discussão da comunidade.

A comunidade JEDI tem contribuído bastante para o sucesso desta iniciativa, em todo o mundo existem mais de 80 pessoas contribuindo ativamente. Os treinamentos são
realizados pelos membros do JEDI que conduzem os testes e recebem cada vez mais
pessoas como voluntárias. O JEDI possui, atualmente, parcerias globais nas Filipinas
através de John Paul (Java champion), no Brasil através de Daniel deOliveira (Java
champion), na França através de Vicent Brabant (Java champion) e de coordenações na Malásia, Tailândia, Singapura, Japão e Vietnam.


O Brasília Java Users Group - DFJUG é responsável pela coordenação do JEDI em países de língua portuguesa. Para mais detalhe clique aqui http://www.dfjug.org/

O DFJUG possui mais de 9.900 membros e é totalmente baseado em trabalho voluntário, sem personalidade jurídica e patrocinado pelo Instituto CTS, OSCIP, voltada para a pesquisa e desenvolvimento de tecnologias de software, que
fornece ao grupo apoio logístico, administrativo e jurídico.


O JEDI em língua portuguesa utilizará o Moodle, um software para a criação de cursos em sítios WEB baseados na Internet. É um projeto desenvolvido para dar suporte a Educação Social Construtivista.
Moodle é gratuito, distribuído como Software livre (sobre a licença pública GNU).
Basicamente isto significa que o Moodle tem preservado os direitos sobre o autor
(copyright), entretanto existem algumas liberdades. Pode-se copiar, utilizar e modificar o Moodle proporcionando o código fonte a outros, não é possível modificar ou eliminar a licença original e os direitos do autor, e deve-se aplicar esta mesma licença a qualquer trabalho derivado deste.
Moodle pode funcionar em qualquer computador que rode PHP, e suporta vários tipos de bancos de dados (em especial MySQL).

Artigo completo (View Full Post)

segunda-feira, 22 de janeiro de 2007

Projeto JEDI

Para quem julga conhecer Delphi, mas nunca ouviu falar no projeto Jedi tem muito que se surpreender com essa ferramenta.
O Projeto JEDI é uma iniciativa de desenvolvedores Delphi do mundo inteiro. Essa iniciativa foi impulsionada por uma queixa comum entre os desenvolvedores que participavam de um famosa lista de discussão, sobre a demora da Borland em disponibilizar APIs novas para o Delphi. Um participante dessa lista em seu questionamento considerou que algo deveria ser feito ante a esse problema. A resposta da comunidade foi imediata e furiosa, vários programadores experts se uniram e desenvolveram um biblioteca de componentes ótima, robusta, OpenSource. (Referência http://homepages.codegear.com/jedi/wiki/index.php?title=AboutJedi).

Conheça o projeto Jedi, faça donwload da suit de componentes da Jedi (JCL e JVCL):

http://sourceforge.net/project/showfiles.php?group_id=45786

http://www.delphi-jedi.org/

http://sourceforge.net/projects/jcl

http://www.delphi-jedi.org/apilibrary.html

Acredito que através da Jedi muitos problemas complicados podem ser resolvidos de forma simples, rápida e eficiente. Tenho usado bastante os componentes da Jedi, e na maioria das vezes obtendo resultado satisfatório.

Pretendo postar aqui vários exemplos que utilizarão a Jedi, tanto para as versões antigas do Delphi, quanto para as mais novas. :)

Artigo completo (View Full Post)

Acesso a dados de forma não acoplada com ObjectDataSource

Neste post vou falar de um componente muito interessante que eu conheci semana passada estudando ASP.NET: o ObjectDatasource.

Este objeto funciona da mesma maneira que eu SqlDatasource: é conectado no WebForm que vai usar os dados e faz as operações do banco de dados. Mas o SqlDataSource deixa nossa interface totalmente acoplada à camada de dados. porque é diretamente conectado ao banco de dados e leva inclusive comandos SQL na camada de apresentação; com certeza não é a melhor opção.

Este componente ObjectDataSource nos permite, em vez de conectar diretamente à base de dados, conectar com algum objeto de negócio criado por nós na camada lógica de negócio e selecionar métodos implementados por nós no nosso objeto de negócio para implementar as operações de select, insert, update e delete, inclusive com parâmetros.
Outra coisa interessante sobre este objeto é que não é obrigatório definir operações que nós não vamos usar: se nossa página for apenas de consulta não precisamos configurar métodos de insert, update e delete.

O método que representa o select pode retornar um DataSet ou um DataTable e pode ter parâmetros ou não; os métodos que representam o insert, update e o delete devem ter os parâmetros que representam os campos da tabela que serão afetados na operação.

Vou dar um exemplo básico dos métodos do objeto de negócio para usarmos o ObjectDataSource. Nossa tabela de exemplo será chamada Usuarios e os campos serão:

UsuarioID int,
Nome string,
Email string,
Login string,
Senha string.

nossos métodos devem ter as seguintes assinaturas:


select:
public DataSet Selecionar() {
// implementação...
}

insert:
public void Incluir(int UsuarioID, string Nome, string Email, string Login, string Senha) {
// implementação...
}

update:
public void Alterar(int UsuarioID, string Nome, string Email, string Login, string Senha) {
// implementação...
}

delete:
public void Delete(int UsuarioID) {
// implementação...
}


Os parâmetros dos métodos devem ter o mesmo nome e tipo dos campos retornados pelo método do select, pois o ObjectDataSource usa estes campos como valores dos parâmetros para as demais operações.

É isso aí. Espero que tenha ajudade e até a próxima.

Artigo completo (View Full Post)

domingo, 21 de janeiro de 2007

Definindo o layout padrão do site com MasterPage

Geralmente quando criamos o layout de um site há elementos que se repetem em todas as páginas, como cabeçalho, barra de menu e rodapé.

O ASP.NET nos fornece uma forma muito prática e inteligente de trabalhar com essa 'identidade': a MasterPage. A MasterPage é uma página modelo onde nós definimos todo o layout que não irá mudar em todas as páginas. Então, nos locais em que irá entrar o conteúdo de cada página colocamos um componente chamado ContentPlaceHolder. É possível colocar mais de um ContentPlaceHolder na nossa MasterPage; e também podemos ter mais de uma MasterPage no site.

Abaixo segue o código de uma MasterPage de um layout padrão de cabeçalho, menu no lado esquerdo, conteúdo e rodapé:

Arquivo MasterPage.master

<%@ Master Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0

Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Exemplo de Master Page</title>
<style type="text/css">
@import url(StyleSheet.css);
</style>
</head>
<body>
<form id="form1" runat="server">
<div id="cabecalho">Cabeçalho</div>

<div id="esquerda">
Menu Principal<br />
<br />
> Item 1<br />
> Item 2<br />
> Item 3<br />
> Item 4</div>

<div id="conteudo">
<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
</asp:contentplaceholder>
</div>

<div id="rodape">
</div>
</form>
</body>
</html>


Abaixo segue o arquivo StyleSheet.css que é usado no HTML acima:

Arquivo StyleSheet.css

body {
width: 700px;
margin: 0 auto;
font: 12px 'Trebuchet MS';
}


div#cabecalho {
height: 70px;
border: solid 1px black;
clear: both;
background: #eaeaea;
}


div#esquerda {
width: 180px;
float: left;
background: #99ccff;
margin: 10px 0;
}


div#conteudo {
margin: 10px 0 10px 190px;
}


div#rodape {
height: 50px;
border: solid 1px black;
background: #eaeaea;
clear: both;
}


Então, com este layout definido, nós iremos sempre criar nossas páginas (WebForms em ASP.NET) derivando deste MasterPage.

Abaixo segue um exemplo de página herdando de um MasterPage:

Arquivo Default.aspx

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" Title="Untitled  Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
</asp:Content>


Dentro da tag <asp:Content ...> </asp:Content> nós vamos definir o que irá ficar dentro da seção de conteúdo definida na nossa MasterPage.

Então neste pequeno artigo nós vimos como construir um site padronizado de maneira muito fácil com este recurso tão legal do ASP.NET. Até mais.

Artigo completo (View Full Post)

sexta-feira, 19 de janeiro de 2007

Aprendendo ASP.NET com o VS2005

Recentemente decidi estudar algo novo e estou indo muito bem com meu aprendizado de ASP.NET e C#. A tecnologia é boa a a linguagem é tranqüila. Estou usando o Visual Studio 2005 (VS2005) e realmente estou gostando muito.

Já criei muitas coisas e aprendi muitas técnicas (sozinho infelizmente).

No fim de semana eu vou postar algumas coisas que eu já faço em .NET. Caso alguém tenha algo a contribuir, sinta-se à vontade de incluir seu comentário ou até dar endereço para trocar informações.

Grande abraço a todos e bom fim de semana.

Artigo completo (View Full Post)

Delphi: Usando compenentes da Palheta Servers (TWordApplication; TWordDocumen )




Desenvolvendo um exemplo de um programa para imprimirdocumentos word, usando Delphi 7
1°) Inicie uma aplicação: No menu: "File - New - Application"
2°)Adicione no Form os seguintes componentes:
  Palheta Standard:Button1: TButton; Label1: TLabel;
  Palheta win 31:FileListBox1: TFileListBox; DirectoryListBox1: TDirectoryListBox; DriveComboBox1:TDriveComboBox;
  Palheta Servers:WordApplication1:TWordApplication; WordDocument1: TWordDocument;


3°) Configure as propriedades de cada um doscomponentes seguindo a listagem abaixo:
  Form1:Left = 262; Top = 142; Width = 350; Height = 370
  Label1:Left = 12; Top = 56
  FileListBox1:Left = 12; Top = 196; Width = 268; Height = 113; Mask = '*.doc'
  DirectoryListBox1: Left = 12; Top = 80; Width = 268; Height = 97; DirLabel = Label1
  DriveComboBox1:Left = 12; Top = 24; Width = 268; Height = 19; DirList = DirectoryListBox1
  Button1:Left = 320; Top = 24; Caption = 'Imprimir'
4°) No evento onChange do DirectoryListBox1 codifique como exemplificado abaixo:
 

procedureTForm1.DirectoryListBox1Change(Sender: TObject);
begin 
 FileListBox1.Directory := DirectoryListBox1.Directory;
end; 


5°)Codifique o evento onClick do Button1 comoexemplificado abaixo:
 



procedureTForm1.Button1Click(Sender: TObject);
var
 i: Integer;
 MyDoc: _Document;
 MyPath: String;
 AReadOnly, MyArq, ASave: OleVariant;
 
begin
 Printed := False;
 Asave := False;
 AReadOnly := True;
 fori := 0 toPred(FileListBox1.Items.Count)do
 begin  
  MyArq := DirectoryListBox1.Directory + FileListBox1.Items[i];
  MyDoc := WordApplication1.Documents.Open(MyArq, EmptyParam, AReadOnly, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  WordDocument1.ConnectTo(MyDoc);
  WordDocument1.Activate;
  WordDocument1.PrintOut;
   WordDocument1.Close(ASave);
  WordDocument1.Disconnect;
  Self.Caption := MyArq;
 end;  
end;   
 

Artigo completo (View Full Post)

quinta-feira, 18 de janeiro de 2007

Saudação

Olá para todos (?). Este é meu primeiro post e eu quero dizer que eu farei o possível para postar com uma boa freqüência e sempre sobre assuntos interessantes.

Abraços a todos.

Artigo completo (View Full Post)

Iniciando nosso trabalho aqui ...

"Há grandes homens que fazem com que todos se sintam pequenos. Mas o verdadeiro grande homem é aquele que faz com que todos se sintam grandes." - Charles Dickens

"Devemos julgar um homem mais pelas suas perguntas que pelas suas respostas."- Voltaire

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br