quinta-feira, 27 de março de 2008

Pesquisa Delphi 2008 e Delphi On Line Day


Amigos tudo nesse nosso mundo de TI passa e acontece tão rápido que dois ou três meses podem parecer uma era. Pois bem, é quase heróico para nós nos mantermos atualizados. Contudo, é imprescindível que o façamos. Postar aqui no blog o que desejamos e julgamos importante também, quase sempre, é superar restrições severas. Nem tudo que gostaria tenho tempo de documentar. O tempo passa e vamos juntando os cacos ...

Sempre que sobra um tempo dou uma olhada no site da CodeGear, faz tempo quero mencionar aqui no ZN sobre um material muito interessante no site da CodeGear ....

Atenção, atenção comunidade!!!
Antes de qualquer outra coisa, é super importante responder a pesquisa Delphi 2008.


Aconteceu o Delphi on line Day! Quem perdeu??? Quem perdeu ainda tem uma chance de não ficar boiando no assunto.

Sobre as palestras: Recomendo, mesmo que sua área de atuação não seja diretamente ligada ao Delphi, dedicar um tempo e conhecer os novos produtos da Borland, eles ainda poderão salvar sua vida (hehheeh). Um detalhe importante, tudo em português, é o pessoal da CodeGear brazuca mostrando que pode fazer a diferença no cenário internacional. Parabéns para vcs!!!
A CodeGear, divisão da Borland responsável pelas IDEs, promoveu em 7 de dezembro do ano passado, um dia inteiro com apresentações, on-line, sobre informação técnica, visão e conceitos práticos de algumas das tecnologias-chave para os desenvolvedores. As Palestras foram:

  • As principais razões para migrar de Delphi 7 para RAD Studio 2007- por Andreano Lanusse.
  • Generics em RAD Studio 2007 – por Manoel Edésio
  • Utilizando dbExpress 4 Framework – por Bruno Lichot
  • Blackfish SQL sem limites para stored procedures e triggers em Delphi - por Leonel Togniolli
  • Desenvolvendo Aplicações WEB com ASP.NET, AJAX e RAD Studio 2007 – por Andreano Lanusse
  • Melhorando a qualidade de suas aplicações em Delphi – por Ricardo Barbieri
  • ECO IV e RAD Studio 2007 – por Adilson Jr.
Enjoy!!!!

Artigo completo (View Full Post)

domingo, 16 de março de 2008

TYPE CURSOR - Retornar um Resultset numa Procedure - Oracle

Retornar um resultset como parâmetro de saída numa procedure em PL/SQL não é algo tão intuitivo como no Interbase ou no MS SQL Server. Portanto, vamos desenvolver um exemplo onde construiremos um procedure em PL/SQL para retornar um resultset. Em seguida vamos implementar um programa em Delphi que vai executar esse procedimento e recuperaremos na interface o resultado do Select.

Para criar a pakcage:
No PL/SQL Developer, no Object Browser, ou somente Browser, selecione a pasta (folder) “Packages” com o botão direito do mouse click em new. Conforme ilustrado abaixo:



Defina o Nome da package:




Note que será criado uma área de declaração como interface da package e outra área para o “body” da package.



Eu vou definir um tipo cursor o qual será usado para um parâmetro de saída da procedure “CalulaMedia”. Nesse parâmetro retornarei o resultset que desejo exibir na aplicação.

Interface da package:


Body da package:



Construindo a interface em Delphi:

Ok, recapitulando: Vamos construir um aplicativo o qual acessará o banco de dados Oracle onde criamos a package “My_Pkg”. A middleware de acesso a dados será OLE_DB, cujos objetos de acesso a dados estão disponibilizados no Delphi na palheta ADO (Activex Data Object). Estou documentando esse exemplo porque não foi nada fácil, nem intuitivo, recuperar um parâmetro do tipo cursor no Delphi. Na nossa primeira tentativa nos deparamos com muitos problemas o maior deles foi justamente com o parâmetro de retorno do tipo cursor no componente “TADOStoredProc”. Constatamos que nesta tecnologia o tipo “ftCursor” quando atribuído a propriedade “DataType” do parâmetro disparava uma exceção informado que os argumentos estavam incorretos.



Constatamos que para fazer funcionar tínhamos que deletar esse parâmetro da lista de parâmetros, deixando somente o parâmetro de input. Ainda referente ao cenário da primeira tentativa, somente obtivemos sucesso com “TADOStoredProc” enquanto a procedure no banco possuía dois parâmetros, um deles era o tipo cursor, parâmetro de saída, o outro era um parâmetro para filtro na cláusula “where” do comando SQL. Vejamos um exemplo:
Duas condições devem ser atendidas – O tipo cursor deve ser o primeiro parâmetro pois o último, de entrada, deve obrigatoriamente ser definido como “default”. Criei para este exemplo uma procedure que efetua um cálculo simples:


PROCEDURE RetCircunferencia(
ZnCursor OUT ZNCursorType,
Raio IN NUMBER DEFAULT 0) IS
vResultado NUMBER;
BEGIN
/* Calcula a retificação da circunferência */

vResultado := 2 * (Raio * PI);

OPEN ZNCursor FOR
SELECT
'Retificação da Circuferência' AS Descricao,
VResultado AS Resultado
FROM
Dual;
END RetCricunferencia;


A constante “PI” declarei na área de declaração de constantes da package “MY_PKG”. Veja o Código da package agora:

create or replace package body MY_Pkg is

-- Public constant declarations
ValorAprovacao constant NUMBER := 6;
PI CONSTANT NUMBER := 3.1416; -- Constante usada na procedure "RetCricunferencia"

-- Private variable declarations
ResultadoAprovacao VARCHAR2(20);
Media NUMBER;
-- Function and procedure implementations
procedure CalculaMedia(
Nota1 in INTEGER,
Nota2 in INTEGER,
Nota3 in INTEGER,
Nota4 in INTEGER,
ZnCursor OUT ZNCursorType) IS
BEGIN
/* Calcula a média de um aluno */

Media := (Nota1 + Nota2 + Nota3 + Nota4)/ 4;
IF (Media >= ValorAprovacao) THEN
ResultadoAprovacao := 'Aprovado';
ELSE
ResultadoAprovacao := 'Reprovado';
END IF;

/* retornando no CURSOR o resultado do aluno */
open ZnCursor FOR
SELECT 'Aluno Estação ZN: ' AS Nome,
ResultadoAprovacao AS ResultadoZN/*,
Media AS ValorMedia */
FROM dual;

end CalculaMedia;


PROCEDURE RetCircunferencia(
ZnCursor OUT ZNCursorType,
Raio IN NUMBER DEFAULT 0) IS
vResultado NUMBER;
BEGIN
/* Calcula a retificação da circunferência */

vResultado := 2 * (Raio * PI);

OPEN ZnCursor FOR
SELECT 'Aluno Estação ZN: ' AS Nome,
ResultadoAprovacao AS ResultadoZN,
Media AS ValorMedia
FROM dual;

END RetCircunferencia;

end MY_Pkg;


Inicie uma nova aplicação, no form1 adicione um “ADOConnection”, um TADOStoredProc, um TDataSource, um TDBGRid, um TEdit, um TLabel. Conecte o ADOConnection com o banco aonde vc criou a procedure. No ADOConnection, o menu popup, com o botão direito do mouse selecione build connection. Veja a ilustrção abaixo:



Não esqueça de alterar a propriedade “LoginPrompt” do ADOConnetion para “False”.

Em seguida conecte a ADOStoredProc no ADOConnection (pela propriedade “Connection” do ADOStoredProc). Conecte o DataSource no ADOStoredProc (propriedade DataSet do DataSource), conecte o DBGrid no DataSource (propriedade “DataSource” do DBGrid). Na propriedade “ProcedureName” do ADOStoredProc digite “[eschema].MY_PKG.RetCircunferencia”. Veja na propriedade parameters do ADOStoredProc a lista de parâmetros recuperados da procedure.



Alterei a propriedade Name do Tedit para “EdtRaio”. Adicione um TBitBtn, nomeie de BtnExcRaio,No Evento OnClick digite conforme exemplificado abaixo:

procedure TForm1.BtnExcRaioClick(Sender: TObject);
begin
with ADOStoredProc1 do
begin
Parameters[0].Value := StrtoFloat(EdtRaio.Text);
Open;
end;
end;


Ok, tudo parece estar certo, tudo pronto para testarmos, correto? Posso adiantar que se você executar agora vai levar uma exceção bacana na lata.



Pra funcionar ainda temos que, sem razão aparente, deletar o parâmetro “ZNCURSOR” da lista de parâmetros da propriedade “Parameters” do ADOStoredProc.



Para demonstrar o quanto é complicado alcançar o objetivo proposto no início do nosso exmplo (executar um procedure no Oracle e recuperar o valor de um parâmetro tipo cursor), veja que ainda faltam algumas configurações a fazer no ADOStoredProc. Antes garanta que o ADOConnection esteja desconectado (propriedade “Connected = False”):
1° - Altere a propriedade “EnableBCD” do ADOStoredProc para “False”.
2° - Altere a propriedade “DataType” do parâmtro “RAIO” de “ftBCD” para “ftFloat”. Você pode fazer isso na propriedade “Parameters” do ADOStoredProc.

Agora adicione os campos persitentes, no fields Editor do ADOStoredProc. Em seguida execute o programa e teste:





Com um pouco de persistência obtivemos sucesso! Contudo, os problemas não param por aqui. Por exemplo, se você tiver mais de um parâmetro de entra o bicho vai pegar e o bagulho não vai funfar. Justamente, esse é o caso da procedure “CalculaMedia”, de jeito nenhum conseguimos fazer funcionar com o ADOStoredProc. Tentando de várias outras formas conseguimos sucesso trocando o dataset para TADODataSet, só assim funcionou e mesmo assim tivemos que fazer as mesmas alterações quanto ao tipo do parâmetro e deleção o tipo cursor. A única exceção foi a não obrigatoriedade do parâmetro de saída, tipo cursor, na procedure “CalculaMedia” ser o primeiro na declaração.

No próximo artigo daremos continuidade ....

segue o código da package:


create or replace package MY_Pkg is

-- Author : GMottazn
-- Created : 12/03/2008 09:58:08
-- Purpose :

-- Public type declarations
TYPE ZNCursorType IS REF CURSOR;

-- Public variable declarations
-- ;

-- Public function and procedure declarations
procedure CalculaMedia(
Nota1 in out NUMBER,
Nota2 in NUMBER,
Nota3 in NUMBER,
Nota4 in NUMBER,
ValorAprovacao IN NUMBER,
Media out NUMBER,
ZnCursor IN OUT ZNCursorType);

end MY_Pkg;
/
create or replace package body MY_Pkg IS

-- Public constant declarations
ValorAprovacao constant NUMBER := 6;

-- Private variable declarations
ResultadoAprovacao VARCHAR2(20);

-- Function and procedure implementations
procedure CalculaMedia(
Nota1 in out NUMBER,
Nota2 in NUMBER,
Nota3 in NUMBER,
Nota4 in NUMBER,
ValorAprovacao IN NUMBER,
Media out NUMBER,
ZnCursor IN OUT ZNCursorType) is
begin
Media := (Nota1 + Nota2 + Nota3 + Nota4)/ 4;
IF (Media >= ValorAprovacao) THEN
ResultadoAprovacao := 'Aprovado';
ELSE
ResultadoAprovacao := 'Reprovado';
END IF;
open ZnCursor FOR
SELECT 'Aluno Estação ZN: ' AS Nome,
ResultadoAprovacao AS ResultadoZN
FROM dual;

end CalculaMedia;


end MY_Pkg;
/



Artigo completo (View Full Post)

sábado, 15 de março de 2008

Algoritmo III – Um passo além da teoria

Prosseguindo com a série sobre Introdução a Programação, especificamente ao tema Algoritmos, vamos dar mais um passo no sentido de aprofundarmos mais nesse assunto.


Usando estrutura de decisão:

Segue um Algoritmo que lê o nome e as 4 notas bimestrais de um aluno. Em seguida o Algoritmo calcula e escreve a média obtida pelo aluno escrevendo também se o aluno foi aprovado ou reprovado.


Programa MEDIA_FINAL;
Constantes
MediaAprovacaoZN = 6;
Variaveis
NOTA1Zn, NOTA2Zn, NOTA3Zn, NOTA4Zn, MEDIAZn: REAL;
NOMEZn : CARACTERE [35]
INICIO
LER (NOMEZn);
LER (NOTA1Zn, NOTA2Zn, NOTA3Zn, NOTA4Zn);
MEDIAZn := (NOTA1Zn + NOTA2Zn + NOTA3Zn + NOTA4Zn) / 4;
SE MEDIAZn (>= 6) ENTÃO
ESCREVER (‘APROVADO’)
SENÃO
ESCREVER (‘REPROVADO’);

ESCREVER (NOMEZn, MEDIAZn)
FIM.


Desvio condicional aninhado:

Usados para tomadas de decisões para mais de 2 opções.

Exemplo:

SE <<CONDIÇÃO>> ENTÃO
inicio
<<COMANDO 1>>;
<<COMANDO 2>>;
.
.
<<COMANDO N>>;
fim
SENÃO SE <<CONDIÇÃO>> ENTÃO
inicio
<<COMANDO 1>>;
<<COMANDO 2>>;
.
.
<<COMANDO N>>;
fim
SENÃO
início
<<COMANDO 1>>;
<<COMANDO 2>>;
.
.
<<COMANDO N>>;

fim;


Implementação em PL/SQL:


create or replace procedure CalculaMedia(
Nota1 in out NUMBER,
Nota2 in NUMBER,
Nota3 in NUMBER,
Nota4 in NUMBER,
ValorAprovacao IN NUMBER,
Media out NUMBER,
ResultadoAprovacao OUT Varchar2) is
begin
Media := (Nota1 + Nota2 + Nota3 + Nota4)/ 4;
IF (Media >= ValorAprovacao) THEN
ResultadoAprovacao := 'Aprovado';
ELSE
ResultadoAprovacao := 'Reprovado';
END IF;
end CalculaMedia;


PL/SQL é a linguagem de programação do Oracle. Para debuggar no Developer, no object browser, selecione a procedure criada, “CalculaMedia”, com o botão direito do mouse sobre ela selecione “Add debugger information”, em seguida, ainda no mesmo menu popup, selecione “Test”. Passe valores para os argumentos (parâmetros) e pressione F9, para ir para o próximo comando pressione “ctrl + n”.




Implementação em Javascript:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title> Estação ZN - Algoritmos III </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type= "text/javascript">
var ZnNota1 = 0;
var ZnNota2 = 0;
var ZnNota3 = 0;
var ZnNota4 = 0;
var ZnMediaAprovacao = 6;
var Aprovacao, MediaCalculadaZn;

// Input de Dados
// Lendo o valor da primeira nota
ZnNota1 = window.prompt( "Digite a primeira Nota:", "0" );
// Lendo o valor da segunda nota
ZnNota2 = window.prompt( "Digite a Segunda Nota:", "0" );
//Lendo o valor da 3° nota
ZnNota3 = window.prompt( "Digite a Terceira Nota:", "0" );
//Lendo o valor da 4° nota
ZnNota4 = window.prompt( "Digite a Quarta Nota:", "0" );

<!-- Processamento - Calculando a Média | convertendo os valore para numérico -->
MediaCalculadaZn = (parseInt(ZnNota1) + parseInt(ZnNota2) +
parseInt(ZnNota3) + parseInt(ZnNota4)) / 4;
//MediaCalculadaZn = (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;

alert("Calculo media = " + MediaCalculadaZn);

<!-- Verificando Aprovação do Aluno -->
if (MediaCalculadaZn >= ZnMediaAprovacao) {
Aprovacao = "Parabéns, aluno Aprovado!!!!!"}
else { Aprovacao = "Lamento, aluno Reprovado."};

alert(" Verificando Aprovação do Aluno = " + Aprovacao);
// Saída - Exibindo o resultado formatado numa tabela
document.writeln( "<h1> <center>Estação ZN - Resultado </center></h1>" );
document.writeln("<table border=2>" );
document.writeln("<table border =1 width =100%>" );
document.writeln( "<tr><td> Nota na 1° prova = " + ZnNota1 + "</td></tr>" );
document.writeln( "<td> Nota na 2° prova = " + ZnNota2 + "</td></tr>" );
document.writeln( "<td> Nota na 3° prova = " + ZnNota3 + "</td></tr>" );
document.writeln( "<td> Nota na 4° prova = " + ZnNota4 + "</td></tr>" );
document.writeln( "<tr><td> Média = " + MediaCalculadaZn + "</td></tr>" );
document.writeln( "<tr bgcolor=#000066> <td> <font face=Courier New, Courier, mono color=#FFFFFF> Resultado : " + Aprovacao + "</font> </td></tr>" );
document.writeln( "</table>" );

</script>
</head>
<body>

</body>
</html>




Inicie uma nova aplicação. Na seção implementation da página de código digite conforme ilustrado abaixo:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm;
ZnNota1, ZnNota2, ZnNota3, ZnNota4, ZnMedia: Double;
ResultadoAprovacaoZN: string;

implementation

{$R *.dfm}
const
ValorAprovacao = 6;

procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)

{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 2° Nota do Aluno:', '0'));
ZnNota3 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 3° Nota do Aluno:', '0'));
ZnNota4 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 4° Nota do Aluno:', '0'));
ZnMedia := (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;

(* Processamento *)
if (ZnMedia >= unit1.ValorAprovacao) then
ResultadoAprovacaoZN := Aprovado
else
ResultadoAprovacaoZN := Reprovado;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));

Form1.Canvas.TextOut(12, 102, '*******************************');

Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;

initialization
CalculaMediaZN;
end.

No exemplo acima, note que implementei de uma forma completamente diferente de outros programas que construímos no Estação Zn. Meu principal objetivo, além de mostrar como o algoritmo pode ser implementado, foi fazer com que uma pessoa iniciante no Delphi possa perceber alguns detalhes difíceis de explicar e de fazer entender. Vamos agora chamar a tenção para a relação entre o que é declarado na unit, de uma forma independente, e a unit como um todo. Por exemplo, existe uma tendência das pessoas interpretarem que a unit inteira é uma área de definição exclusiva ao form1. Isso não é verdade, o form é somente mais uma declaração dentre outras declarações possíveis numa unit. Observe, o form1 não conhece a procedure “CalculaMediaZN”. Tente fazer um teste, no evento “FormPaint” experimente chamar a execução dela. Veja o exemplo abaixo, a segunda linha da procedure “FormPaint”,você acha que vai compilar?




procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)

{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 2° Nota do Aluno:', '0'));
ZnNota3 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 3° Nota do Aluno:', '0'));
ZnNota4 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 4° Nota do Aluno:', '0'));
ZnMedia := (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;

(* Processamento *)
if (ZnMedia >= unit1.ValorAprovacao) then
ResultadoAprovacaoZN := Aprovado
else
ResultadoAprovacaoZN := Reprovado;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
CalculaMediaZN;
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));

Form1.Canvas.TextOut(12, 102, '*******************************');

Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;


Você esta correto se respondeu sim. Mas, isso não prova que o que acabei de afirmar está errado. Só está compilando porque a “CalculaMediaZN” está declarada primeiro que o evento “FormPaint” na unit. Logo, basta você inverter a ordem dos procedimentos para perceber que o form1 não conhece a procedure que está declarada separadamente na unit. Tente compilar novamente para receber a mensagem “Undeclared identifier: ‘CalculaMediaZN’”. Exemplo:


procedure TForm1.FormPaint(Sender: TObject);
begin
CalculaMediaZN;
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));

Form1.Canvas.TextOut(12, 102, '*******************************');

Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;

procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)

{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
.
.
.



Mesmo que você referencie a “unit1” ao chamar a procedure que calcula a média não adiantará, visto que o ela não está declarada na seção “interface”.




procedure TForm1.FormPaint(Sender: TObject);
begin
unit1.CalculaMediaZN;// Ainda assim não vai compilar
.
.


Estou forçando uma barra somente para ilustrar o que estou tentando explicar, mas não faz o menor sentido chamar a procedure “CalculaMediaZN” novamente. Finalizando argumentação, para a provar de uma vez por todas, declare na seção “interface”, em qualquer lugar antes da palavra reservada “implementation”, desde que não seja dentro do escopo da seção “type” onde a classe TForm1 esta declarada, codifique conforme exemplificado abaixo:



type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
(* Ao ter declarado o cabeçalho deste procedimento na interface ele passou
a estar visível não só para toda unit, mas também para outras que a referenciarem.*)
procedure DesenhaPoligono;

var
Form1: TForm;
.
.

Agora, codifique o corpo do porcedimento “DesenhaPoligono” na seção “implementation”.


procedure DesenhaPoligono;
var
X, Y, DX, DY: Integer;
begin
Randomize;
X := Random(Form1.Width - 10);
Y := Random(Form1.Height - 250);
Randomize;
Form1.Canvas.Pen.Color := Random(65535);
Form1.Canvas.Pen.Width := Random(7);
DX := Random(400);
DY := Random(400);
Form1.Canvas.RoundRect(X, Y, X + DX, Y + DY, DX div 2, DY div 2);
end;

Bem, agora o Form1 ainda não conhece esse novo procedimento, contudo neste momento se você fizer referência a unit1 ele estará visível ao Form1. O compilador, desta forma, não irá reclamar. Segue o código completo da unit1 com as últimas alterações:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
(* Ao ter declarado o cabeçalho deste procedimento na interface ele passou
a estar visível não só para toda unit, mas também para outras que a referenciarem.*)
procedure DesenhaPoligono;

var
Form1: TForm;
.
.


Agora, codifique o corpo do porcedimento “DesenhaPoligono” na seção “implementation”.

procedure DesenhaPoligono;
var
X, Y, DX, DY: Integer;
begin
Randomize;
X := Random(Form1.Width - 10);
Y := Random(Form1.Height - 250);
Randomize;
Form1.Canvas.Pen.Color := Random(65535);
Form1.Canvas.Pen.Width := Random(7);
DX := Random(400);
DY := Random(400);
Form1.Canvas.RoundRect(X, Y, X + DX, Y + DY, DX div 2, DY div 2);
end;

Prosseguindo, o Form1 ainda não conhece esse novo procedimento, contudo neste momento se você fizer referência a unit1 ele estará visível ao Form1. O compilador, desta forma, não irá reclamar. Segue o código completo da unit1 com as últimas alterações:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
(* Ao ter declarado o cabeçalho deste procedimento na interface ele passou
a estar visível não só para toda unit, mas também para outras que a referenciarem.*)
procedure DesenhaPoligono;

var
Form1: TForm;
ZnNota1, ZnNota2, ZnNota3, ZnNota4, ZnMedia: Double;
ResultadoAprovacaoZN: string;

implementation

{$R *.dfm}
const
ValorAprovacao = 6;

procedure TForm1.FormPaint(Sender: TObject);
begin
unit1.DesenhaPoligono;
(* Sída de dados - Outpu*)
Form1.Canvas.TextOut(12, 12, Format('1° Nota: %f', [ZnNota1]));
Form1.Canvas.TextOut(12, 32, Format('2° Nota: %f', [ZnNota2]));
Form1.Canvas.TextOut(12, 52, Format('3° Nota: %f', [ZnNota3]));
Form1.Canvas.TextOut(12, 72, Format('4° Nota: %f', [ZnNota4]));
Form1.Canvas.TextOut(12, 92, Format('Média: %f', [ZnMedia]));

Form1.Canvas.TextOut(12, 112, '*******************************');

Form1.Canvas.TextOut(12, 132, Format('Resultado: %s', [ResultadoAprovacaoZN]));
end;

procedure CalculaMediaZN;
const
Aprovado = 'Parabéns!!! Aluno Aprovado.';
Reprovado = 'Lamento!!! Aluno Reprovado. Vai estudar e RAFM.';
begin
(* Entrada de dados - Input*)

{Preciso converter o valor retornado pela função "InputBox" de string para float}
ZnNota1 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 1° Nota do Aluno:', '0'));
ZnNota2 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 2° Nota do Aluno:', '0'));
ZnNota3 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 3° Nota do Aluno:', '0'));
ZnNota4 := StrToFloat(InputBox('Estação Zn | Algoritmo III',
'Digite a 4° Nota do Aluno:', '0'));
ZnMedia := (ZnNota1 + ZnNota2 + ZnNota3 + ZnNota4) / 4;

(* Processamento *)
if (ZnMedia >= unit1.ValorAprovacao) then
ResultadoAprovacaoZN := Aprovado
else
ResultadoAprovacaoZN := Reprovado;
end;

procedure DesenhaPoligono;
var
X, Y, DX, DY: Integer;
begin
Randomize;
X := Random(Form1.Width - 10);
Y := Random(Form1.Height - 250);
Randomize;
Form1.Canvas.Pen.Color := Random(65535);
Form1.Canvas.Pen.Width := Random(7);
DX := Random(400);
DY := Random(400);
Form1.Canvas.RoundRect(X, Y, X + DX, Y + DY, DX div 2, DY div 2);
end;

initialization
CalculaMediaZN;
end.


Execute o programa e teste.

Artigo completo (View Full Post)

sexta-feira, 14 de março de 2008

Mike Stern - Chromazone

Startamos o projeto Chromazone

Mike Stern, Michael Brecker & Cia ....

No CD Time in Place, a formação de Chromazone foi:

  • Mike Stern - guitar
  • Michael Brecker - tenor saxophone
  • Jim Beard - keyboards
  • Jeff Andrews - electric bass and fretless bass
  • Peter Erskine - drums
  • Don Alias - percussion


Nada mais justo que uma prova, só para dar uma idéia de como o bagulho funfa!!! Funfa, amigo ... e funfa bem!





Não encontrei nenhum video do Mike tocando dessa música. O Google não retornou nada buscando em páginas em português!!! Lamentável









Já que estamos falando sobre este assunto segue um pouco de Michael Brecker



Artigo completo (View Full Post)

segunda-feira, 10 de março de 2008

Quem são, para que servem e como se relacionam os arquivos de um programa em Delphi.

Neste artigo pretendo explicar um pouco sobre quem são, para que servem e como se relacionam os arquivos de um programa em Delphi. Devemos entender um programa em Delphi como um projeto, pois é desta forma que IDE aborda. Um projeto Delphi é subdividido em arquivos, inicialmente falaremos da configuração mais básica para contruirmos um progrma/projetos. Portanto, partindo dessa premissa consideraremos a divisão de um projeto em duas partes:

  • Primeira Parte – Unidades: São arquivois nomeados por “unit” a onde são definidos funções, procedimentos, constantes, tipos e classes. A extenção do arquivo que o compilador entende como uma unidade é “.pas”. Quando você esta trabalhando com um form não perca de vista que existe uma unit associada a esse form, um arquivo “.pas”. Contudo, como trata-se de um componente visual, as definições quanto a essa caracteristicas ficam guardadas num outro arquivo de extenção “.dfm”.
  • Segunda Parte – O Projeto: Uma uidade que define o projeto. Essa unidade gerencia todas as units da aplicação. Sejam elas referentes a forms ou não. Quando você abre um projeto no Delphi, imediatamnente você pode ver uma “unit” (um arquivo que representa uma unidade para codificação) com várias linhas de código. Portanto, quando estamos trabalhando num projeto em Delphi temos: o Project (.dpr) e as Units (.pas, caso algumas delas sejam referentes a formulários, existirão também para cada uma, respectivamente, um arquivo “.dfm”).

Veja na imagem abaixo um modelo exemplificando os arquivos de uma aplicação em Delphi.




Arquivos que Compõem um Aplicação

Arquivos usados no desenvolvimento

.dpr – Significa Delphi Project, este aruivo centraliza todas as demais units do programa.

.dsk – Remete a desktop, é um arquivo que armazena as informações da área de trabalho do Delphi, exemplo: Posição Janelas, units abertas no editor, além de outras configurações.

.pas – Arquivo Pascal: Nele encontra-se o código fonte de uma unidade pascal. Ou seja, declarações e implementações. Caso uma unit .pas o código contido nela defina um classe TForm (de formulário) ela trabalhará conjuntamente com o arquivo homônimo de extensão “.dfm.”

.res – Arquivo de Recurso: O arquivo binário associado ao projeto e que geralmente armazena o ícone. Você pode incluir outros arquivos desse tipo num projeto. O arquivo .res, principal de um aplicativo é reconstruido pelo Delphi de acordo com as informações definidas na página “Application” da caixa de diálogo do “Project Options”.

.dfm – Significa “Delphi Form File” (seria algo como: Arquivo Delphi de formulário)

.~df – Este arquivo só é gerado quando você salva uma edição qualquer que tenha efetuado no form. Treata-se de um arquivo temporário que pode ser usado para o desenvolvedor resgatar a última versão sava anteriormente.

.~pa - Este arquivo só é gerado quando você salva uma edição qualquer que tenha efetuado na unidade de código. Treata-se de um arquivo temporário que pode ser usado para o desenvolvedor resgatar a última versão sava anteriormente.

Obs: .~DF, .~PA , .~DP são arquivos temporários para backup ( Menu Options, Enviroment, Guia Editor Display, Caixa de Grupo Display and file options, opção Create Backup Files, desativa o seu salvamento).
Como você pode notar, num programa Delphi existe uma quantidade enorme de arquivos, por isso devemos organizá-los em diretórios separados. Podemos definir na IDE onde (path/caminho) serão gerados os pré-compilados e o executável separados dos “.pas”, “.dfm” e “.dpr”. Não preciso nem comentar que cada projeto deve estar num diretório específico.


Arquivos Gerados pela Compilação

.dcu – Delphi Compiled Unit: O processo de compilação gera um “.dcu” para cada “.pas” do projeto. O objetivo desses arquivos é tornar o processo de compilação mais rápido. Quando você edita uma unit de um projeto de 200 units, o compilador não recompila todas a partir do zero. As units que não foram editas cujo o “.dcu” foi gerado não são compiladas novamente, exceto de você der um “Build” (Alt + p + b - sucessivamente) no projeto ao invés de compilar simplesmente (Ctrl + F9). O Compilador aproveita os “.dcu” pré-compilados, recompilando apenas a unit “.pas” a qual foi editada desde a última compilação.
Obs: Estes possuem um tamanho arquivos significativo e devem ser apagados, de tempos em tempos, para economizar espaço em disco.

.exe – Arquivo compilado. No processo de compilkação o Delphi gera os arquivos “pré-compilados” “.dcu” a partir das units por você codificadase das bibliotecas nelas declaradas. Então, a partir desses arquivos “.dcu” é gerado o produto final que é o executável. Este por sua vez é distribuido para seus clientes/usuários.

Entendendo o arquivo que gerencia o projeto em Delphi “.DPR”.

Quando você inicia um programa em Delphi, os arquivos onde você codifica não são o programa. O Delphi trata o programa, própriamente dito, de forma relativamente transparente para o programador. O que você codifica são unidades, arquivos nomedos por “unit”, sejam referentes a formulários (Form), ou a uma outra classe, ou apenas a funções, procedimentos, declarações de constantes e tipos. Tanto que se você iniciar o Delphi, sem nenhum projeto aberto, for no menu “File ► New ► Unit” abrir somente esta unit, nada será compilado mesmo que seja codificado nela um milhão de linas. O arquivo cujo a estenção é “dpr”, ou seja “.dpr”, é o arquivo onde de fato esta o código do programa. Neste arquivo está escrito o código de criação da aplicação e seus formulários. O arquivo Project tem apenas uma seção.

Analisando o código e as seções de um arquivo “.dpr”:

PROGRAM – Palavra resrvada nativa da liguagems Pascal. Indica ao compilador que o conteúdo desse arquivo é um programa .

USES – Palavra resrvada nativa da liguagems Pascal. Seção onde é declarado as bibliotecas. Arquivos necessários para compilação.

Forms = Bilbioteca. É a unidade do Delphi onde eestão defindas as classes responsáveis pelas janelas. As quais também chamamos de formulários (windows/forms).

In = Palavra resrvada nativa da liguagems Pascal que indica ao compilador onde encontrar o arquivo referente a uma Unit.

Unit1 = A unidade que você criou

{$R *.RES} - Diretiva de compilação que inclui o arquivo de recursos. Por exemplo, os “.dfm” de cada arquivo “.pas” onde esta definos um form.


Abaixo veja como fica o ".dpr" quando você abre um projeto novo:

program Project1;

uses
Forms,
Unit1 in 'UNIT1.PAS' {Form1};

{$R *.RES}

begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Entendendo o Código fonte do arquivo Unit (.PAS).

Numa unit “.pas”, conforme mencionado anteriormente, são definidos funções, procedimentos, constantes, resource strings, tipos e classes. Esse arquivo remete a era do Pascal, ou seja é uma unit do antigo Pascal.

Seção Unit - Declara o nome da unit. Exemplo:

{*******************************************************}
{ }
{ Borland Delphi Visual Component Library }
{ }
{ Copyright (c) 1995-2002 Borland Software Corporation }
{ }
{*******************************************************}

unit Forms;

{$P+,S-,W-,R-,T-,H+,X+}
{$C PRELOAD}
{$WARN SYMBOL_PLATFORM OFF}

interface


Seção Interface


Nesta seção estão as declarações de constantes, tipos de variáveis, funções e procedures gerais da Unit/Form. As declarações desta seção são visíveis por qualquer Unit. Analizando exemplo de código comunmente encointrado nesta seção:

INTERFACE
- Palavra que inicia a seção;
USES
– seção para declaração de bibliotecas que seraõ usadas para implementação do programa:
SysUtils = biblioteca de utilitários do sistema (strings, data/hora, gerar arquivos).
WinProcs = biblioteca. Unite onde encontramos codificação para acesso a GDI, USER e KERNEL do Windows.
Wintypes = Biblioteca, tipos de dados e valores constantes.
Messages = Biblioteca de constantes com os números das mensagens do Windows e tipos de dados das Mensagens.



Seção Uses- Declaração de bibliotecas, as units acessadas por este arquivo. Para que você possa usar qualquer coisa (constante, funções, procvedimentos, classes) definida em outra unidade, esta deverá ser declarada aqui. A visibilidade das bibliotecas declaradas aqui sofrerão o reflexo das seções “interface” ou “implementation” dependendo de onde a seção uses for subordinada.


Seção Type
- Declaração dos tipos definidos pelo usuário.

Seção Var - Declaração das variáveis, a visibilidade delas será dependente das seções “interface” ou “implementation” que definirá se elas serão privadas ou não (mais detalhes veja em “Escopo de Visibilidade”).

Seção Implementation- Como o próprio no indica, seção específica para implementação. Resumidamente, quando programamos estamos declarando e implmentando. Declamos estruturas de dados e constantes, implementamos procedimentos e funções. Numa unit Delphi/Pascal podemos declarar coisas na seção “implementation”, contudo no que diz respeito a implementação, somente nesta seção podemos codificar. Ela também reflete no grau de visibilidade do que for declarado dentro dela. Toda e qualquer declarção definda dentro do seu escopo não é visível a nenhuma outra unit doi projeto. Ela serve de complemento da seção “interface”, embora sua função não se restrinja somente a isto, na medida que não é possível implementarmos nada na interface. Ou seja, nela estarão os corpos das funções e procedures declaradas nas seções “interface”. Nesta seção , quando trabalhamos com formulários, também estão definidos todos os procedimentos dos componentes que estão incluídos no Form. O mesmo acontece para a implementação dos métodos de qualquer classe definida na seção interface. As declarações codificadas neste seção são visíveis apenas nesta unit. Esta seção é formada pelo seguinte código:

{$R*.DFM} - Diretiva de compilação que indica a utilização de um arquivo de recurso. Neste caso, trastando-se de um form é necessário compilar junto o arquivo que contem as informações visuais do mesmo. Elas estão defindas no *.DFM, homonimo a unit.

{$S+} - Diretiva de compilação que ativa verificação de pilha.

Seção Inicialization - Inicia com a palvra reserva “initialization”. Nesta seção, que é opcional, pode ser definido um código para efetuar tarefas de inicialização da Unit quando o programa começa. Sintaxe: Após a palavra reservada “inicialization”, de preferência indentado, segue uma ou mais declarações para serem executadas em ordem.

Seção Finalization - Opcional, palavra reservada que somente pode ser usada somente se anteriormente houver uma seção “Inicialization”. Esta seção inicia-se com a palavra reservada “finalization” e continua, contendendo comandos que serão executados em ordem até o final da unit. Nela declaramos comandos que deverão ser executados quando o programa for finalizado. Preferencialmente, devemos neste momento liberar recursos alocados na seção “Inicialization”.

Exemplo: Abaixo veja como cada declaração aparece em cada uma das seções as quais nos referimos acima:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure LoadLstBoxZN;
end;

(*
function somar: Double;
begin
Result := 2;
end;
*)

var
Form1: TForm1;
ZnLst: TStringList;

implementation

uses StrUtils, Math;

{$R *.dfm}

{ TForm1 }

procedure TForm1.LoadLstBoxZn;
const
AMsg = 'Dado Estação ZN %d°';
var
i: Integer;
AuxNum: Integer;

begin
ZnLst := TStringList.Create;
for i := 0 to 10 do
begin
Randomize;
AuxNum := RandomRange(100, 200);
ZnLst.Add(Format(AMsg, [AuxNUm]));
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ListBox1.Items.Assign(ZnLst);
end;

initialization
Form1.LoadLstBoxZn;

finalization
ZnLst.Free;
Sleep(1000);
end.

Artigo completo (View Full Post)

domingo, 9 de março de 2008

Type Casting - VB6

Num laço (For) percorrer todos os controles do Form em VB6.



Private Sub Command1_Click()
Dim ZnobjCtlAux As Control
Dim i As Integer

For Each ZnobjCtlAux In Me.Controls
ZnobjCtlAux.Tag = -1
Next ZnobjCtlAux

For i = 0 To Me.Controls.Count - 1
MsgBox Me.Controls(i).Name & " - " & Str(Me.Controls(i).Tag)

'MsgBox Me.Controls(i).Type & " - " & Str(Me.Controls(i).Tag)

If TypeOf Me.Controls(i) Is DTPicker Then
MsgBox "Data picker"

End If
Next i


End Sub

Artigo completo (View Full Post)

Para gravar suas conversas no Skype

Você pode gravar as suas conversas no Skype para ouvi-la posteriormente, isso pode ser bastante útil para registrar a solicitação de um cliente. Alguns desenvolvedores podem através da internet fazer levantamento de requisito, com a vantagem, de gravar o que levantou com o cliente para depois documentar. Jornalistas podem gravar entrevistas, em fim, mil outras utilidades podem ser aproveitada com esse recurso.



O PrettyMay é um programa, muito fácil de ser usado. Por exemplo: Ao iniciar uma conversação no Skype, ele já inicia a gravação da ligação em formato Mp3. Depois, basta ouvir no computador ou qualquer outro dispositivo que toque Mp3. O endereço que encontrei na Internet do fabricante do PrettyMay é http://www.prettymay.net, mas não consegui acessar. O link está quebrado, não encontrei nenhuma informação sobre o pq disso.
Após a instalação, na primeira vez que executar o o Skype, ele irá perguntar se outro programa pode usá-lo. Marque a opção "Permitir que outro programa utilize o Skype". Segundo o que pesquisei na Internet, o próprio Skype recomenda este plugin. Portanto, acho que pode ser usado sem problemas.

Eu testei e gostei bastante do resultado. Só que, pro algum motivo, encontrar o programa para donwload não é muito fácil. Fiz upload do arquivo para área de arquivos do estação ZN no google pages, quem desejar pode baixar de lá:

Opção Donwload 1
Opção Donwload 2

Outras Features do PrettMay:

  • Responde as chamadas e os bate-papos para você quando você estiver ausente ou não quer ser perturbado
  • compartilhamento suas gravações com seus amigos.
  • Conserva chamadas no formato mp3 áudio.
  • Permite enviar voicemails através de email, ou chamada passadas ao contato que quiser.

Existem outros programas para gravar conversar no Skype pagos:

PowerGramo Recorder for Skype

Pamela 4.0: Esse possui uma versão freeware que grava apenas 15 min de conversa.

Artigo completo (View Full Post)

terça-feira, 4 de março de 2008

TYPE … IS TABLE OF - BULK COLLECT

PL/SQL é um universo, estamos em débito com ela aqui no Estação ....
Por favor, vamos jogar os "goto pula" pra casa do landjah!!! O mundo agradece!! ... e o unverso diz AMÉM!!!

No Oracle (10i ), para persistir em memória um conjunto de registros de uma tabela qualquer para mais adiante usá-los:

Passo 1) Declare um array do tipo RowType da tabela a qual deseja armazenar:


DECLARE

I INTEGER;

TYPE My_TIPO_tabela IS TABLE OF <Table name> %ROWTYPE;

V_TabTemp My_TIPO_tabela;


Passo 2) Parra carregar o vetor “V_TabTemp”:


begin
-- Test statements here
SELECT *
BULK COLLECT INTO V_TabTemp
FROM
<table name>
WHERE
<condições>



Passo 3) Imprimindo os dados:

FOR i IN 1..2
dbms_output.put_line(' Dado teste' || V_TabTemp.<ColumnName>(i));
END;


Passo 4) Fazer um insert numa tabela cujo as colunas sejam idênticas as do vetor:


FORALL I IN 1.. V_TabTemp.COUNT
INSERT INTO <tableName> VALUES V_TabTemp.(I);


Exemplo:


DECLARE
type AVet is table of Clientes%rowtype;
i integer;
VetImportaClientes AVet;
BEGIN
-- ***** IMPORTAÇÃO dos Clientes
i := 0;
select
* bulk collect into VetImportaClientes
from
ClientesA
where
ClientesA.Tipo = 'J';

forall i in 1.. VetImportaClientes.count
insert into PossiveisClientesB values VetImportaClientes(i)


Artigo completo (View Full Post)

segunda-feira, 3 de março de 2008

Algoritmos II - exemplificando

Anteriormente falamos sobre algoritmos, neste artigo pretendo exemplificar como resolver, em algumas linguagens, alguns deles.

Antes, veremos um pouco mais da parte teórica:

1 - Comentando linhas de um Algoritmo:

Podemos inserir em um Algoritmo comentários para aumentar a compreensão do mesmo, para isso basta que o texto fique entre Chaves (“{}”).

Exemplo:

LER (RAIO); {ENTRADA, recebendo valor para a variável “RAIO”}


2 - Literais:

Valores que devem possuir significado literal para o usuário, portanto o processador não deve processá-los.
Quando queremos exibir uma mensagem para a tela ou impressora ela deve estar contida entre aspas simples, caso contrário, o computador irá identificar a mensagem como variável que não foi definida (Identificador não definido).
Exemplo:
ESCREVER (‘AREA OBTIDA =’, AREA) {COMANDO DE SAÍDA, exibindo o valor da variável “AREA” formatada pela concatenação com o literal ‘AREA OBTIDA =’}


3 - Estruturas de Decisão:

Executa uma seqüência de comandos de acordo com o resultado de um teste. A estrutura de decisão pode ser Simples ou Composta, baseada em um resultado lógico.
As estruturas de decisão também são conhecidas como “desvio condicional”. A partir de uma expressão lógica, testa-se o resultado: Se verdadeiro, segue um fluxo de comandos. Caso falso, segue um outro fluxo alternativo.
Exemplo:
3.1) Estrutura de decisão simples:

Se <<condição >> Então
<<Comando1>>;

3.2) Estrutura de decisão composta:

Se <<condição>> Então
<<ComandoX1>>
Senão
<<ComandoY1>>;

4 - Exemplo de construção de algoritmo: exemplificando o que falamos acima.

Versão 1 - Algoritmo que lê dois números e escreve o maior.

PROGRAMA ACHA_MAIOR;
VAR A, B : INTEIRO;
INICIO
Leia (A);
Leia (B);
SE (A > B) ENTÃO
Escreva(A)
SENÃO
Escreva(B);
FIM.



Versão 2 - Algoritmo que lê dois números e escreve o maior.

PROGRAMA ACHA_MAIOR;
VAR A, B : INTEIRO;
INICIO
{Solicitando a entrada do primeiro valor}
Escreva(‘Digite o primeiro número:’);
Leia (A); {Recebendo na variável “A” o valor digitado}

{Solicitando a entrada do segundo valor}

Escreva(‘Digite o Segundo número:’);
Leia (B); {Recebendo na variável “B” o valor digitado}

{Exibindo mensagem lieral}
Escreva(‘O Maior valor digitado foi: ’)

{testando qual das duas variáveis recebeu o maior valor}
SE (A > B) ENTÃO
Escreva(A);
SENÃO
Escreva(B);
FIM.


5 - Passando o algoritmo para a linguagem de programação Delphi:
Inicie uma nova aplicação no Delphi, selecionado no menu “File” ▶ “New” ▶ “Application”.



Adicione um TButton (da Palheta “Standard”) no Form1. Na Propriedade “Caption” do Form1 digite: Programa ACHA MAIOR.



Na propriedade “Caption” do Button1, digite: Iniciar Programa



Aumente também a largura. Propriedade “width” para 104.
Para acessar as propriedade dos componentes mencionados acima selecione o componente,
no Object Inspector, na aba “Properties” você pode alterar a propriedade desejada.



No evento OnClick do Button1, digite o código abaixo:

procedure TForm1.Button1Click(Sender: TObject);
var
NumA_Zn, NumB_Zn, Zn_Maior: Integer;
StrNumA_Zn, StrNumB_Zn: String;
begin
(*Garantindo que o Button1 não atrapalhe a saída do nosso programa. hehehe ...*)
Button1.Top := 12;
Button1.Left := 12;

(* Início do Algoritmo *)
Self.Canvas.TextOut(12, 120, 'Iniciando o Programa - Estação ZN');

(* Entrada de Dados *)

{A través da função "InputBox" solicito a entrada do valor e atribui o valor
digitado para variável do tipo "String"}
StrNumA_Zn := InputBox('Digite o Primeiro valor que irá ser testado', ' Valor: ',
'0');
StrNumB_Zn := InputBox('Digite o Segundo valor que irá ser testado', ' Valor: ',
'0');

(* Processamento *)
NumA_Zn := StrToInt(StrNumA_Zn); // Convertendo o dado para um tipo númerico
NumB_Zn := StrToInt(StrNumB_Zn); // Convertendo o dado para um tipo númerico

{testando qual das duas variáveis recebeu o maior valor}
if (NumA_Zn > NumB_Zn) then
Zn_Maior := NumA_Zn
else
Zn_Maior := NumB_Zn;

(* Saída *)
Self.Canvas.TextOut(12, 140, Format('O Maior Valor Digitado foi: %d',
[Zn_Maior]));
Self.Canvas.TextOut(12, 160, 'Final do Programa - Estação ZN');

end;





Palheta de Componentes:



Palheta Standard:



Quem é o TButton na Palheta??





6 - Versão em JavaScript:

Você pode codificar o exemplo abaixo no Notepad. Para testar, salve o arquivo com estenção html (.html) e poderá abri-lo no próprio browser.



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> Estação ZN </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
document.write("<br> Iniciando o Programa - Estação ZN - Implementando Algoritmo <br> ");
var NumA_Zn = prompt ("Digite o Primeiro valor que irá ser testado","0");
var NumB_Zn = prompt ("Digite o Segundo valor que irá ser testado","0");

document.write(" *********************** ");

document.write("<br> Primeiro valor: " + NumA_Zn);
document.write("<br> Segundo valor: " + NumB_Zn);

if (NumA_Zn > NumB_Zn){
ZNMaior = NumA_Zn;
}
else {
ZNMaior = NumB_Zn;
};

alert (" O Maior Valor Digitado foi: " + ZNMaior);
document.write("<br> Final do Programa JavaScript -- Estação ZN");
// -->
</script>
</head>
<body>
</body>
</html>




Uma versão em Java do algoritmo, rola?

/*
/*
* Este é um exemplo de implementação
* de uma algoritmo.
* www.estacaozn.blogspot.com
*/

package verificamaiorzn;

import javax.swing.JOptionPane; // Importando pacote de extenção Java API

/**
*
* @author GMottaZn
*/
public class Main {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
String strNum1Zn, strNum2Zn, msgSaida;
int intNum1Zn, intNum2Zn, ZnMaior;
boolean saoIguais;
// Entrada de dados
strNum1Zn = JOptionPane.showInputDialog("Digite o primeiro número");
strNum2Zn = JOptionPane.showInputDialog("Digite o segundo número");

// processamento
intNum1Zn = Integer.parseInt(strNum1Zn); // convertendo de string para integer
intNum2Zn = Integer.parseInt(strNum2Zn); // convertendo de string para integer
// Comparando para encontrar o maior
saoIguais = (intNum1Zn == intNum2Zn);
if (saoIguais){
msgSaida = "Os números são iguais - ";
ZnMaior = intNum1Zn;
}
else {
msgSaida = "O maior número é: ";
if (intNum1Zn > intNum2Zn){
ZnMaior = intNum1Zn;
}
else {
ZnMaior = intNum2Zn;
};
};
// Saída de dados
JOptionPane.showMessageDialog(null, " Estação Zn - " + msgSaida + ZnMaior,
"www.estacaozn.blogspot.com", JOptionPane.INFORMATION_MESSAGE);

// Finaliza programa
System.exit(0);

}
}


Se Você esta procurando uma boa ferramenta para programar para web, uma que seja free , teste o Notepad ++: http://notepad-plus.sourceforge.net/br/site.htm
Dê um confere no Notepad ++.

Uma opção excelente, alternativa também Free, OJEdit é mais do que você imagina, vai ultrapassar suas espectativas: http://www.jedit.org/

  • Syntax highlighting para mais de 70 tipos de arquivos.
  • Suporte para indentação inteligente para códigos Java, C e Python.
  • Suporte a "Regular Expressions".
  • Faz verificação de bracket ("{}", "( )" e "[ ]");
  • Gravação de Macros;

O Felipe tem usado bastante essa ferramenta ultimanente. Ele destacou o suporte a Plugins como um grande diferencial do JEdit. Através desse recurso você pode aumentar a capacidade do editor, adicionando diversas funcionalidades de grande valia no dia a dia de trabalho. Os exemplos vão desde a edição do código fonte até operações como compilação, gerenciamento e edição de arquivos via FTP, integração com CVS, Visual Source Safe, Jakarta Ant, Tomcat e não para por ai, dezenas de outras funcionalidades podem ser incorporadas. Veja users group do JEdit.

Mais sobre JavaScript:
http://en.wikipedia.org/wiki/JavaScript_syntax
www.deitel.com/ResourceCenters/Programming/JavaScript/tabid/1038/Default
No Estação ZN

Artigo completo (View Full Post)

 
BlogBlogs.Com.Br