<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Juliano Ribeiro &#187; Desenvolvimento</title>
	<atom:link href="http://julianoribeiro.com.br/blog/category/desenvolvimento/feed/" rel="self" type="application/rss+xml" />
	<link>http://julianoribeiro.com.br/blog</link>
	<description>Development and Design</description>
	<lastBuildDate>Mon, 06 Sep 2010 13:46:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Criando listas com PHP/MySQL</title>
		<link>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql/</link>
		<comments>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql/#comments</comments>
		<pubDate>Tue, 31 Aug 2010 01:51:45 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Função]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=362</guid>
		<description><![CDATA[Hoje resolvi variar um pouco. Como estou ajudando um amigo no seu TCC, escrevi para ele uma função bem legal, pelo menos eu achei, depois me falem o que acharam. Eu vou colocar ela aqui em duas etapas. Nessa primeira, vamos criar uma lista, somente passando uma tabela do banco. A assinatura da função vai [...]]]></description>
			<content:encoded><![CDATA[<p>Hoje resolvi variar um pouco. Como estou ajudando um amigo no seu TCC, escrevi para ele uma função bem legal, pelo menos eu achei, depois me falem o que acharam. Eu vou colocar ela aqui em duas etapas. Nessa primeira, vamos criar uma lista, somente passando uma tabela do banco. A assinatura da função vai ficar mais ou menos assim:</p>
<pre class="brush: php;">
&lt;?php
	include_once('conexao.php');
	include('funcoes.php');

	CriarLista('Estado');
?&gt;
</pre>
<p>A conexão é bem simples, faça como quiser.<br />
Já a função, baseia-se na instrução SQL: <strong>SHOW FULL COLUMNS FROM TB_CLIENTE</strong>. Essa instrução retorna uma lista com os campos: <em>Field, Type, Collation, Null, Key, Default, Extra Privileges e Comment</em>. Para nós, nesse momento só interessam Field e Comment. Explico. Pegaremos os campos que retornam nessa SQL e com eles, comporemos a nova SQL com os campos que a primeira retornou, ficou claro?<br />
Nos comments da tabela em questão, eu coloquei a descrição dos campos, tipo o campo <strong>EST_CODIGO</strong> tem o comentário <strong>&#8220;Código&#8221;</strong>.<br />
<span id="more-362"></span><br />
Para usar, eu fiz o trechinho de código abaixo:</p>
<pre class="brush: php;">
		$sql = 'SHOW FULL COLUMNS FROM ' . $tabela; // Crio a string
		$res = mysql_query($sql); // Envia a string para o banco e guarda o retorno
		$sql = 'select '; // Crio a nova SQL
		$estrutura = array(); // Inicializo o array
		$pos = 1; // Inicializa 1ª posição

		echo &quot;&lt;table border='1'&gt;
				&lt;tr&gt;&quot;; // Monta o início da tabela

		while ($lin = mysql_fetch_assoc($res)) {
			echo &quot;&lt;td&gt;&quot;.$lin['Comment'].&quot;&lt;/td&gt;&quot;;
			$estrutura[$pos++] = $lin;
			$sql .= $lin['Field'] . ', ';
		}
		echo &quot;&lt;/tr&gt;&quot;;
		$sql = substr($sql, 0, strlen($sql) - 2);
		$sql .= &quot; from &quot;. $tabela ;
</pre>
<p>Com esse código ai conseguimos compor uma nova SQL, algo como <em>Select EST_CODIGO, EST_NOME from ESTADO</em>. Assim, poderemos fazer a nova consulta como deve ser. Além disso, todo o resultado daquele <em><strong>resource</strong></em> fica armazenado em um array chamado <strong>estrutura</strong>, para consulta posterior.<br />
Com esses dados em mãos, vamos simplesmente fazer a nova consulta no banco e trazer os dados para dentro da tabela. Veja como fica esse trecho:</p>
<pre class="brush: php;">
		$res = mysql_query($sql);
		while ($lin = mysql_fetch_assoc($res)) {
			echo &quot;&lt;tr&gt;&quot;;
			foreach ($estrutura as $campo) {
				echo &quot;&lt;td&gt;&quot;.$lin[$campo['Field']].&quot;&lt;/td&gt;&quot;;
			}
			echo &quot;&lt;/tr&gt;&quot;;
		}
		echo &quot;&lt;/table&gt;&quot;;
</pre>
<p>e assim funciona, e no próximo post eu coloco o arquivo para download e também como paginar o resultado dessa função.</p>
<p>Até mais</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/criando-listas-com-phpmysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Orientação à Objetos em Delphi (Parte 1 e 1/2)</title>
		<link>http://julianoribeiro.com.br/blog/orientacao-a-objetos-em-delphi-parte-1-e-12/</link>
		<comments>http://julianoribeiro.com.br/blog/orientacao-a-objetos-em-delphi-parte-1-e-12/#comments</comments>
		<pubDate>Fri, 27 Aug 2010 17:16:15 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[classe]]></category>
		<category><![CDATA[Encapsulamento]]></category>
		<category><![CDATA[OO]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=337</guid>
		<description><![CDATA[Apesar do povo no twitter querer me massacrar quando digo que o Delphi é uma linguagem (muito boa por sinal), há muito que ele não trata mais de Pascal com uma IDE bonitinha. Mas como eu respondi lá, isso é uma questão comercial, que pouco me importa, afinal, não ganho ou perco um centavo com [...]]]></description>
			<content:encoded><![CDATA[<p>Apesar do povo no twitter querer me massacrar quando digo que o Delphi é uma linguagem (muito boa por sinal), há muito que ele não trata mais de Pascal com uma IDE bonitinha. Mas como eu respondi lá, isso é uma questão comercial, que pouco me importa, afinal, não ganho ou perco um centavo com isso. Quanto a linguagem ser boa, não há dúvidas, com ela eu construi minha casa, estou pagando o carro, os meus treinamentos, a educação do meu filho&#8230;</p>
<p>Piadas à parte, vamos ao ponto, no último post que eu tratei sobre o assunto (Orientação à Objetos) a coisa ficou meio descontextualizada, principalmente por se tratar de uma palestra que fiz aqui na Produtec. Assim, vou tentar simplificar um pouco mais o conceito, sem necessariamente entrar na conversa com o banco.<br />
Primeiro vamos imaginar um problema. Alguém lhe fez a solicitação: </p>
<blockquote><p>Criar uma classe Lampada, que tenha como ser ligada, desligada e possa me responder seu atual estado (ON/OFF). Essa pessoa lhe solicitou também um formulário que interagisse com essa classe, acessando os seus métodos.</p></blockquote>
<p>Então vejamos, temos uma classe mais ou menos como a desenhada abaixo:</p>
<p><a href="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/classe_lampada.jpg"><img src="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/classe_lampada.jpg" alt="" title="classe_lampada" width="211" height="117" class="aligncenter size-full wp-image-340" /></a><br />
Como vemos, teremos então a classe <strong>Lampada</strong>, que possuirá um atributo privado chamado <strong>acesa</strong> do tipo <strong>boleano</strong> e três métodos públicos bastante simples; ligarLampada() muda o atributo acesa para true, desligarLampada() seta o atributo para false e isLampadaLigada() que retorna o estado do atributo. Até aqui bem simples.<br />
Para a implementação eu vou herdar de TControl, por enquanto isso será suficiente, afinal não quero ter que implementar as coisas mais básicas na mão, como a criação do componente e tal. Isso fica mais ou menos assim:</p>
<pre class="brush: delphi;">
unit uLampada;

interface

uses Controls;

type
  TLampada = class(TControl)
  private
      Facesa: Boolean;
      procedure Setacesa(const Value: Boolean);
      property acesa: Boolean read Facesa write Setacesa;
  public
      procedure LigarLampada;
      procedure DesligarLampada;
      function isLampadaLigada: Boolean;
  end;

implementation

{ TLampada }

procedure TLampada.DesligarLampada;
begin
   acesa := False;
end;

function TLampada.isLampadaLigada: Boolean;
begin
   Result := acesa;
end;

procedure TLampada.LigarLampada;
begin
   acesa := True;
end;

procedure TLampada.Setacesa(const Value: Boolean);
begin
   Facesa := Value;
end;

end.
</pre>
<p>Percebam aqui algumas particularidades do Delphi. Pra começar, os métodos tem um <em>&#8220;tipo&#8221;</em>. Métodos que necessitam retornar valores são declarados como <strong>function</strong> e os que não precisam retornar valor, portanto são somente procedimentos, são assim chamados <strong>procedure</strong>. Ambos podem receber parâmetros, mas no nosso exemplo não tivemos necessidade. A única diferença é mesmo o retorno.</p>
<p>Para declarar a propriedade <strong>acesa</strong>, eu simplesmente digitei <strong>property acesa:boolean;</strong> e pressionei o atalho <strong>Ctrl+Shift+C</strong>. Isso nos leva a outro ponto legal de destacar que é o encapsulamento. Veja como ficou o código:</p>
<pre class="brush: delphi;">
  private
      Facesa: Boolean;
      procedure Setacesa(const Value: Boolean);
      property acesa: Boolean read Facesa write Setacesa;
</pre>
<p>Assim, na prática, o valor será gravado em Facesa (o &#8220;F&#8221; é padrão do Delphi, não pergunte). Como se percebe ele completou a linha com as cláusulas read e write, determinado assim o Getter e o Setter da propriedade acesa. Portanto quando uma chamada um outro objeto acessar a propriedade acesa, a classe irá ler o valor da variável Facesa e na hora de atribuir o valor, o procedimento <strong>Setacesa(<em>const </em>Value: Boolean);</strong>.</p>
<blockquote><p>A cláusula <strong>const </strong>antes do parâmetro indica que o mesmo não pode ser alterado no corpo do procedimento. Ele pode ser atribuído normalmente na chamada.</p></blockquote>
<p>Com o procedimento SetAcesa podemos colocar quaisquer tratamentos que se fizerem necessários. Mas isso é assunto para outro post.</p>
<p>Para a aplicação rodar como pedido, devemos criar um formulário que interaja com um objeto da classe criada. Vou não criar muita firula aqui, serão apenas 3 botões, Ligar, Desligar e Status.</p>
<p><a href="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/frmInterruptor.jpg"><img src="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/frmInterruptor.jpg" alt="" title="frmInterruptor" width="282" height="78" class="aligncenter size-full wp-image-355" /></a></p>
<p>Aqui fica mais clara ainda a simplicidade desse sistema. Basta criar uma instância da classe TLampada e fazer com que os botões acessem os seus métodos. Veja como ficou simples.</p>
<pre class="brush: delphi;">unit uInterruptor;

interface

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

type
  TfrmInterruptor = class(TForm)
    btnLigar: TButton;
    btnDesligar: TButton;
    btnStatus: TButton;
    procedure btnStatusClick(Sender: TObject);
    procedure btnDesligarClick(Sender: TObject);
    procedure btnLigarClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    MinhaLampada: TLampada;
  public
  end;

var
  frmInterruptor: TfrmInterruptor;

implementation

{$R *.dfm}

procedure TfrmInterruptor.btnDesligarClick(Sender: TObject);
begin
   MinhaLampada.DesligarLampada;
end;

procedure TfrmInterruptor.btnLigarClick(Sender: TObject);
begin
   MinhaLampada.LigarLampada;
end;

procedure TfrmInterruptor.btnStatusClick(Sender: TObject);
var
   cMsg: String;
begin
   cMsg := 'A lâmpada ';

   if not MinhaLampada.isLampadaLigada then
      cMsg := cMsg + 'não ';

   cMsg := cMsg + 'está ligada.';
   ShowMessage(cMsg);
end;

procedure TfrmInterruptor.FormCreate(Sender: TObject);
begin
   MinhaLampada := TLampada.Create(Self);
end;

end.
</pre>
<p>A única dica é criar a MinhaLampada na criação do formulário. Não preciso me preocupar com dispor dela, pois ela foi criada &#8220;afiliada&#8221; ao form, portanto quando um for para o vinagre o outro vai junto.</p>
<p>Bom pessoal, agora que desaceleramos e começamos de maneira mais básica acho que consegui isolar um pouco mais os conceitos. Acredito que todos entendem que temos uma classe TLampada, com atributos privados, com métodos públicos que nos permitem controlar a lâmpada. Esclarecemos também que o que se manipula posteriormente é a instancia, o objeto MinhaLampada, não a classe. E podemos ter quantas instancias da Lampada criadas dentro da nossa aplicação.</p>
<p>No próximo post sobre o assunto vamos criar um serviço que controle a &#8220;energia&#8221; do exemplo. Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/orientacao-a-objetos-em-delphi-parte-1-e-12/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Executando scripts via Delphi</title>
		<link>http://julianoribeiro.com.br/blog/executando-scripts-via-delphi/</link>
		<comments>http://julianoribeiro.com.br/blog/executando-scripts-via-delphi/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 14:24:09 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[ErrorCode]]></category>
		<category><![CDATA[Interbase]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[TMemo]]></category>
		<category><![CDATA[TSQLConnection]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=325</guid>
		<description><![CDATA[Já me ocorreu necessidade de rodar alguns scripts simples, para dar manutenção em clientes. A procedure abaixo coleta o conteúdo de um TMemo e envia para banco executar. Qualquer ErrorCode maior que zero indica que houve uma mensagem de retorno negativa. Infelizmente não tenho essa tabela de códigos disponível. procedure TForm1.ExecutaScript; var ErrorCode: Integer; begin [...]]]></description>
			<content:encoded><![CDATA[<p>Já me ocorreu necessidade de rodar alguns <strong>scripts </strong>simples, para dar manutenção em clientes. A <strong>procedure </strong>abaixo coleta o conteúdo de um <strong>TMemo </strong>e envia para banco executar. Qualquer <strong>ErrorCode </strong>maior que zero indica que houve uma mensagem de retorno negativa. Infelizmente não tenho essa tabela de códigos disponível.</p>
<pre class="brush: delphi;">
procedure TForm1.ExecutaScript;
var
  ErrorCode: Integer;
begin
   try
      ErrorCode := Conexao.ExecuteDirect(MemoSQL.Text);
      // Conexao é um TSQLConnection já conectado ao banco.

      if ErrorCode = 0 then
          ShowMessage('Script rodado com sucesso');

      {Se retornar diferente de &quot;0&quot; é porque algo de errado aconteceu}
      if ErrorCode &lt;&gt; 0 then
         raise Exception.Create( 'Error: code = ' + IntToStr( ErrorCode ) )

   except
      on E: Exception do
         ShowMessage( E.Message );
   end
end;
</pre>
<p>Só testei em <strong>Oracle</strong>, mas não vejo motivos para não rodar em <strong>Interbase</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/executando-scripts-via-delphi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Porque não programamos em casa?</title>
		<link>http://julianoribeiro.com.br/blog/porque-nao-programamos-em-casa/</link>
		<comments>http://julianoribeiro.com.br/blog/porque-nao-programamos-em-casa/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 13:37:33 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Cotidiano]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=321</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/tirinha1369.gif"><img class="aligncenter size-full wp-image-320" title="tirinha1369" src="http://julianoribeiro.com.br/blog/wp-content/uploads/2010/08/tirinha1369.gif" alt="" width="509" height="162" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/porque-nao-programamos-em-casa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tratando mensagem MaskEdit</title>
		<link>http://julianoribeiro.com.br/blog/tratando-mensagem-maskedit/</link>
		<comments>http://julianoribeiro.com.br/blog/tratando-mensagem-maskedit/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 19:06:24 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Máscara]]></category>
		<category><![CDATA[TMaskEdit]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=311</guid>
		<description><![CDATA[Aconteceu de eu precisar tratar uma mensagem no TMaskEdit e minha memória idosa não se lembrar de como fazê-lo. Para que isso não ocorra mais e caso alguém tenha a mesma dúvida, deixo aqui registrada a solução. Hoje, o componente em questão, estava com a máscara &#8216;!00:00:00;1;_&#8217; o que obriga o que as posições marcadas [...]]]></description>
			<content:encoded><![CDATA[<p>Aconteceu de eu precisar tratar uma mensagem no <strong>TMaskEdit </strong>e minha memória idosa não se lembrar de como fazê-lo. Para que isso não ocorra mais e caso alguém tenha a mesma dúvida, deixo aqui registrada a solução.</p>
<p>Hoje, o componente em questão, estava com a máscara<strong> &#8216;!00:00:00;1;_&#8217; </strong>o que obriga o que as posições marcadas pelo 0 sejam preenchidas. Por mais bobo que seja, basta trocar o 0 por 9 e fazer o tratamento no evento que mais lhe convier, no meu caso no <strong>OnExit </strong>do mesmo, como se segue:<br />
<span id="more-311"></span></p>
<pre class="brush: delphi;">
procedure TFrmCadFichaOper.edTempoExit(Sender: TObject);
var
tTemp: TDateTime;
begin
try
tTemp := StrToTime(edTempo.Text);
except
MsgAtencao('Formato de tempo inválido, preencha corretamente.');

if (edTempo.CanFocus) then
edTempo.SetFocus;
end;
end; </pre>
<p>No final a máscara ficou assim: <strong>&#8216;!99:99:99;1;_&#8217;</strong>.</p>
<p>Para quem riu da minha velha memória, isso eu vi em 1997 na <strong>revista Clube Delphi</strong> e vou transcrever o artigo todo aqui:</p>
<p>A propriedade EditMask é uma variável do tipo string que define a máscara que limita os dados que podem ser digitados num componente do tipo EditMask ou em um campo de um registro de um Banco de Dados. A máscara limita os caracteres considerados válidos a serem digitados pelo usuário.</p>
<p>Uma máscara consiste de três campos separados por ponto-e-vírgula. O primeiro campo é a máscara propriamente dita, o segundo campo consiste num caracter que define se os caracteres ou máscara devem ser salvos como parte dos dados. O terceiro define o caracter usado para representar os espaços em branco na máscara.</p>
<ul>
<li>! &#8211; Se um ! aparecer na máscara, caracteres em branco não são armazenados como dados.</li>
<li>&gt; &#8211; Se um &gt; aparecer na máscara, todos os caracteres seguintes estarão em letras maiúsculas, até que seja encontrado um caractere igual a &lt;.</li>
<li>&lt; &#8211; Se um &lt; aparecer na máscara, todos os caracteres seguintes estarão em letras maiúsculas, até que seja encontrado um caractere igual a &gt;.</li>
<li>&lt;&gt; &#8211; Este sinal significa que as letras maiúsculas e minúsculas serão armazenadas como digitadas pelo usuário.</li>
<li>\ &#8211; Os caracteres que seguem este sinal serão tratados como literais.</li>
<li>L &#8211; Apenas caracteres alfabéticos (a-z e A-Z) sejam aceitos nessa posição.</li>
<li>l &#8211; Apenas caracteres alfabéticos (a-z e A-Z) sejam aceitos nessa posição, mas aceita que sejam omitidos.</li>
<li>A &#8211; Apenas caracteres alfanuméricos (0-9, a-z e A-Z) sejam aceitos nessa posição.</li>
<li>a &#8211; Apenas caracteres alfanuméricos (0-9, a-z e A-Z) sejam aceitos nessa posição, mas aceita que sejam omitidos.</li>
<li>C &#8211; Este caractere faz com que quaisquer caracteres sejam aceitos nesta posição.</li>
<li>c &#8211; Este caractere faz com que quaisquer caracteres sejam aceitos nesta posição, mas aceita que sejam omitidos.</li>
<li>0 &#8211; Apenas caracteres numéricos (0-9) sejam aceitos nessa posição.</li>
<li>9 &#8211; Apenas caracteres numéricos (0-9) sejam aceitos nessa posição, mas aceita que sejam omitidos.</li>
<li># &#8211; Apenas caracteres numéricos (0-9) e sinais de mais (+) ou menos(-) sejam aceitos nessa posição, mas aceita que sejam omitidos.</li>
<li>: &#8211; Este caractere (dois pontos) é usado para separar horas, minutos e segundos em dados horários. Se outro caractere separador de horas, minutos e segundos é definido nos atributos internacionais do Painel de Controle do sistema, este caractere será usado ao invés dos dois pontos.</li>
<li>/ &#8211; É usado para separar meses, dias e anos em dados de datas. Se outro caractere separador de meses, dias e anos é definido nos atributos internacionais do Painel de Controle do sistema, este caractere será usado ao invés do caractere /.</li>
<li>; &#8211; O ponto-e-vírgula é usado para separar máscaras.</li>
<li>_ &#8211; O caractere _ insere espaços em branco na caixa de edição.</li>
</ul>
<p>Embora essa dica pareça muito boba, ajuda muito lembrar dessas coisas no momento de apuro.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/tratando-mensagem-maskedit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delphi orientado à objetos &#8211; parte 1</title>
		<link>http://julianoribeiro.com.br/blog/delphi-orientado-a-objetos-parte-01/</link>
		<comments>http://julianoribeiro.com.br/blog/delphi-orientado-a-objetos-parte-01/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 13:47:20 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Artigo]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=293</guid>
		<description><![CDATA[Já tem um bom tempo que programo com Delphi. E sempre ouvi críticas pesadíssimas sobre o quanto a linguagem é ruim. Eu sempre acreditei que existiram sempre programadores ruins e que os programas saiam ruins, o que gerou essa impressão negativa, bem como os vários problemas que a Borland (fabricante do Delphi, agora CodeGear) impôs [...]]]></description>
			<content:encoded><![CDATA[<p>Já tem um bom tempo que programo com Delphi. E sempre ouvi críticas pesadíssimas sobre o quanto a linguagem é ruim. Eu sempre acreditei que existiram sempre programadores ruins e que os programas saiam ruins, o que gerou essa impressão negativa, bem como os vários problemas que a <strong>Borland </strong>(fabricante do Delphi, agora <strong>CodeGear</strong>) impôs nas mudanças de versão. Assim, resolvi desmistificar essa coisa de que é impossível programar orientado à objetos usando o Delphi.</p>
<p>Segue o material do nosso último treinamento, sobre como usar o Delphi, orientado à objetos.<br />
Embora pareça que estamos trabalhando com OO desde sempre, afinal instanciamos objetos baseados em classes, isso não é inteiramente verdade.<br />
Como me disse um professor certa vez: <em>&#8220;Seu sistema é orientado à objetos? Ótimo. Me mostre a sua classe NotaFiscalSaída.&#8221;</em></p>
<p>Assim achei por bem usar um exemplo bem simples, estados e cidades para mostrar o poder que o Delphi tem e de quebra demonstrar que o que está errada é a maneira como programamos e não a linguagem que usamos, seja ela qual for.<br />
<span id="more-293"></span><br />
Primeiramente, começamos com alguns paralelos. No Delphi, para criarmos uma classe, precisamos cria-la como um componente, para mais tarde, criar instancias dele. Usando o <strong>Delphi 2006</strong>, eu vou em <em><strong>File > New > Package</strong></em>. Então no Project Manager eu clico sobre o pacote com o botão direito e escolho <em><strong>Add New > Other&#8230;</strong></em></p>
<p>A janela que se abrirá me dá várias opções, a que vamos usar está em<em> <strong>Delphi Projects > Delphi Files > Component</strong></em>. No Wizard seguinte escolhemos de qual componente o nosso irá herdar suas características (não vou explicar herança aqui). Nesse momento escolheremos <strong>TComponent</strong>, para pegar somente o mínimo necessário. Na próxima tela, escolha o nome do componente em C<strong>lass Name</strong>, para nós será TCidade (o &#8220;T&#8221; é padrão do Delphi, use sem questionar). Escolha a Pallete Page que deseja ou digite uma nova, lembre que esse campo é Case Sensitive, portanto atenção ao digitar. Preencha os demais campos se precisar.</p>
<p>A classe cidade:</p>
<pre class="brush: delphi;">
unit cidade;

interface

uses
  SysUtils, Classes, Estado;

type
  TCidade = class(TComponent)
  private
    Fcid_nome: string;
    Fcid_codigo: integer;
    Festado: TEstado;
    procedure Setcid_codigo(const Value: integer);
    procedure Setcid_nome(const Value: string);
    procedure Setestado(const Value: TEstado);
    { Private declarations }
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
    property cid_codigo: integer read Fcid_codigo write Setcid_codigo;
    property cid_nome: string read Fcid_nome write Setcid_nome;
    property estado: TEstado read Festado write Setestado;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Objetos Produtec', [TCidade]);
end;

{ TCidade }

procedure TCidade.Setcid_codigo(const Value: integer);
begin
  Fcid_codigo := Value;
end;

procedure TCidade.Setcid_nome(const Value: string);
begin
  Fcid_nome := Value;
end;

procedure TCidade.Setestado(const Value: TEstado);
begin
  Festado := Value;
end;

end.</pre>
<p>Vamos falar um pouco da classe cidade. Nela eu coloquei os principais atributos de uma cidade, somente para exemplo. Percebam que os mesmos foram criados baseado na seguinte estrutura: </p>
<pre class="brush: delphi;">
private
    Fcid_nome: string;
published
    property cid_nome: string read Fcid_nome write Setcid_nome;
</pre>
<p>(&#8230;)</p>
<pre class="brush: delphi;">
procedure TCidade.Setcid_nome(const Value: string);
begin
  Fcid_nome := Value;
end;
</pre>
<p>Traduzindo, teremos uma propriedade com o nome cid_nome, do tipo string (notem que sem tamanho definido) que lê o valor para uma variável Fcid_nome e grava através de uma procedure chamada como Setcid_nome. Ótimo, mas o que ganhamos com isso? Para que esconder o real valor de uma variável ao invés de simplesmente torná-la pública? E para que criar um procedimento para atribuir o valor, se a mudança da visibilidade já resolveria? Parece tudo uma grande perda de tempo, mas é um foco na segurança e no reuso.<br />
Imaginem que em determinado momento, nós precisaremos delimitar o tamanho da cidade para o máximo de caracteres que existem no banco de dados, que para o nosso exemplo é de 60 caracteres. Alterando o procedimento SetCid_Nome todo, eu disse TODO, o sistema passa a respeitar a nova regra, sem precisar avisar a nenhuma outra parte do sistema que isso aconteceu. Vejam como ficaria: </p>
<pre class="brush: delphi;">
procedure TCidade.Setcid_nome(const Value: string);
begin
   if Length(Value) &lt; 60 then
      Fcid_nome := Value;
end;
</pre>
<p>Viram que simples? Poderíamos melhorar ainda, criando uma mensagem de erro (exceção) que poderia ser tratada pela tela que realizou a chamada ou simplesmente exibida diretamente em tela. Algo mais ou menos assim: </p>
<pre class="brush: delphi;">
procedure TCidade.Setcid_nome(const Value: string);
begin
   if Length(Value) &lt; 60 then
      Fcid_nome := Value
   else
      raise Exception.Create('O nome da cidade não pode conter mais do que 60 caracteres.');
end;
</pre>
<p>Várias validações ou procedimentos poderiam ser feitos no momento em que a propriedade é atribuída, como preencher uma outra propriedade, carregar outros componentes em tela, enfim, o limite fica por conta da necessidade do programador.<br />
Se eu não disse antes, o nome desse método chama-se <a href="http://pt.wikipedia.org/wiki/Encapsulamento">encapsulamento</a>, pois os atributos ficam protegidos (encapsulados) em métodos que lêem e escrevem nas variáveis.<br />
Isso é meio caminho para um estereótipo usado em UML chamado JavaBean, que os meninos que mexem com Java devem conhecer bem.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/delphi-orientado-a-objetos-parte-01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Novo Site W3Tutor</title>
		<link>http://julianoribeiro.com.br/blog/novo-site-w3tutor/</link>
		<comments>http://julianoribeiro.com.br/blog/novo-site-w3tutor/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 11:26:16 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Agência]]></category>
		<category><![CDATA[W3Tutor]]></category>
		<category><![CDATA[WebDesign]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=269</guid>
		<description><![CDATA[Já está no ar desde o EDTED de Curitiba (06/06), o novo site da Agência W3Tutor. O site foi criado com a estrutura adequada para mostrar os trabalhos realizados pelo nossa intrépida trupe. Visite e conheça um pouco sobre nós e sobre as nossas realizações.]]></description>
			<content:encoded><![CDATA[<div id="attachment_272" class="wp-caption alignleft" style="width: 442px"><a href="http://julianoribeiro.com.br/blog/wp-content/uploads/2009/08/w3tutor.png"><img class="size-full wp-image-272   " title="Site W3Tutor" src="http://julianoribeiro.com.br/blog/wp-content/uploads/2009/08/w3tutor.png" alt="Site W3Tutor" width="432" height="218" /></a><p class="wp-caption-text">Site W3Tutor</p></div>
<p>Já está no ar desde o EDTED de Curitiba (06/06), o novo site da <a title="Agência W3Tutor" href="http://www.w3tutor.com.br" target="_blank">Agência W3Tutor</a>.</p>
<p>O site foi criado com a estrutura adequada para mostrar os trabalhos realizados pelo nossa intrépida trupe. Visite e conheça um pouco sobre nós e sobre as nossas realizações.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/novo-site-w3tutor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Delphi] Relógio usando Canvas</title>
		<link>http://julianoribeiro.com.br/blog/delphi-relogio-usando-canvas/</link>
		<comments>http://julianoribeiro.com.br/blog/delphi-relogio-usando-canvas/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 11:25:44 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[Relógio]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=264</guid>
		<description><![CDATA[Segue um exemplo usado no Dojo de 06/08/2009, aqui na Produtec. Não houve tempo de concluí-lo, mas os conceitos básicos estão presentes. No código abaixo, tem somente o corpo básico, mais o ponteiro dos segundos. Fiquem à vontade para concluí-lo. Para que o exemplo funcione, basta criar um form com ClientHeight e ClientWidth de no [...]]]></description>
			<content:encoded><![CDATA[<p>Segue um exemplo usado no Dojo de 06/08/2009, aqui na <a href="http://www.produtec.com.br">Produtec</a>.</p>
<p>Não houve tempo de concluí-lo, mas os conceitos básicos estão presentes. No código abaixo, tem somente o corpo básico, mais o ponteiro dos segundos. Fiquem à vontade para concluí-lo.</p>
<p>Para que o exemplo funcione, basta criar um form com ClientHeight e ClientWidth de no mínimo 300 e neste colocar um Timer com parâmetros padrões.</p>
<pre class="brush: delphi;">
procedure TForm1.Timer1Timer(Sender: TObject);
const
   LARGURA = 300;
var
   XFinal, YFinal: Integer;
   Hora, Minuto, Segundo, MiliSegundo: Word;
   Angulo: Integer;
begin
   Refresh;
   Caption := TimeToStr(Time);  

   // Disco do Relógio
   Canvas.Pen.Width := 1;  

   Canvas.Brush.Color := clWhite;
   Canvas.Brush.Style := bsSolid;
   Canvas.Ellipse(0, 0, LARGURA, LARGURA);  

   // Ponteiros
   Canvas.Pen.Style := psSolid;
   Canvas.Pen.Width := 3;
   Canvas.Pen.Color := clBlack;  

   Canvas.MoveTo(LARGURA div 2, LARGURA div 2);  

   DecodeTime(Time, Hora, Minuto, Segundo, Milisegundo);  

   XFinal := (LARGURA div 2) + Trunc(Sin(DegToRad(180 - Segundo * 6)) * (LARGURA div 2));
   YFinal := (LARGURA div 2) + Trunc(Cos(DegToRad(180 - Segundo * 6)) * (LARGURA div 2));  

   Canvas.LineTo(XFinal, YFinal);  

end;
</pre>
<p>Dúvidas, coloquem a seguir.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/delphi-relogio-usando-canvas/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oficina de SQL</title>
		<link>http://julianoribeiro.com.br/blog/oficina-de-sql/</link>
		<comments>http://julianoribeiro.com.br/blog/oficina-de-sql/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 11:16:03 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Oficina]]></category>
		<category><![CDATA[Produtec]]></category>
		<category><![CDATA[Treinamento]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=259</guid>
		<description><![CDATA[Tem alguns dias já, realizamos na Produtec uma oficina sobre SQL. A nossa equipe é bastante jovem, então valeu a pena rever alguns conceitos básicos aplicáveis à base de dados de nosso maior produto, o Maximum (ERP). Abaixo seguem os slides. Qualquer dúvida podem perguntar que eu esclareço. Talvez fique um pouco descontextualizado, porque os [...]]]></description>
			<content:encoded><![CDATA[<p>Tem alguns dias já, realizamos na <a href="http://www.produtec.com.br">Produtec</a> uma oficina sobre SQL. A nossa equipe é bastante jovem, então valeu a pena rever alguns conceitos básicos aplicáveis à base de dados de nosso maior produto, o Maximum (ERP).</p>
<p>Abaixo seguem os slides. Qualquer dúvida podem perguntar que eu esclareço.</p>
<p><iframe height="335" width="450" name="Treinamento-SQL-ppt" style="border:1px solid #AABBCC" scrolling="no" src="http://show.zoho.com/embed?id=559650000000005001" frameBorder="0"></iframe></p>
<p>Talvez fique um pouco descontextualizado, porque os slides não são nada sem a narração, mas como me pediram, ai está.</p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/oficina-de-sql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dez idéias para motivar sua equipe sem gastar dinheiro</title>
		<link>http://julianoribeiro.com.br/blog/dez-ideias-para-motivar-sua-equipe-sem-gastar-dinheiro/</link>
		<comments>http://julianoribeiro.com.br/blog/dez-ideias-para-motivar-sua-equipe-sem-gastar-dinheiro/#comments</comments>
		<pubDate>Fri, 29 May 2009 18:15:25 +0000</pubDate>
		<dc:creator>Juliano Ribeiro</dc:creator>
				<category><![CDATA[Artigos]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Equipe]]></category>
		<category><![CDATA[Negócio]]></category>
		<category><![CDATA[Pessoa]]></category>
		<category><![CDATA[Venda]]></category>

		<guid isPermaLink="false">http://julianoribeiro.com.br/blog/?p=232</guid>
		<description><![CDATA[Geralmente, temos três cenários quando o fim do ano se aproxima: a empresa que está muito bem, vendeu muito, cresceu, ganhou e fidelizou clientes; a empresa que está mais ou menos, perdeu alguns clientes, ganhou um pouco, mas vendeu o suficiente para pagar as contas, não conseguindo grandes lucros; e a empresa que foi mal, [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #808080;">Geralmente, temos três cenários quando o fim do ano se aproxima: a empresa que está muito bem, vendeu muito, cresceu, ganhou e fidelizou clientes; a empresa que está mais ou menos, perdeu alguns clientes, ganhou um pouco, mas vendeu o suficiente para pagar as contas, não conseguindo grandes lucros; e a empresa que foi mal, cujos clientes foram comprar da concorrência e o lucro é apenas uma hipótese pouco provável.</span></p>
<p>A verdade é que todas as empresas, não importa em que cenário se encaixam, precisam motivar seus vendedores para o final do ano. Para algumas, esse é um período de altos volumes de vendas &#8211; isso geralmente acontece com o varejo – e, para outras, é um período de poucos negócios.<br />
Porém, mesmo que você esteja ganhando muito dinheiro no início deste ano, que esteja programando uma comemoração regada a <em>champagne</em> francês, você certamente vai adorar motivar sua equipe gastando pouco.</p>
<p>Existem muitas coisas que podem ser feitas sem nenhum – ou quase nenhum – dinheiro para estimular a equipe. Vejamos dez idéias diferentes que podem ser, <em>agora mesmo</em>, facilmente colocadas em prática em sua empresa:<br />
<span id="more-232"></span><br />
<strong>1- Sirene</strong> – Instale uma sirene ou sino que possa ser tocado sempre que alguém atingir determinada meta.</p>
<p><strong>2- Apareça para conversar</strong> – Faça com que os diretores da empresa apareçam regularmente para conversar com os funcionários. Muitas vezes, simplesmente aparecer, sentar em frente á mesa e perguntar como vão as coisas estimula mais do que outras formas que poderiam passar meses sem ser notada.</p>
<p><strong>3- Música</strong> &#8211; Deixe os funcionários escutarem música no ambiente de trabalho – mas cuidado com essa idéia, pois muitas vezes acaba em bagunça. Estabeleça algumas regras e faça com que sejam respeitadas, sem exceções.</p>
<p><strong>4- Agradeça</strong> &#8211; Diga “obrigado”! Antes de ir embora, tente agradecer pelo menos uma pessoa dentro da empresa por ter ajudado você durante o dia. Com o passar do tempo isso traz resultados fantásticos.</p>
<p><strong>5- Mantenha todos informados</strong> &#8211; Crie um <em>newsletter</em> interno, só com notícias, informações e comentários internos divertidos. Peça para que as pessoas mandem novidades para seu e-mail, junte tudo uma vez a casa 15 dias e passe para a sua lista interna de contatos. Com certeza vai ser um sucesso.</p>
<p><strong>6- Economia</strong> &#8211; Ajude a empresa a economizar dinheiro. Agora com essa história de racionamento de energia, ficou ainda mais importante economizar. Faça um campeonato interno, pedindo idéias sobre como economizar energia e premie os vencedores com uma daquelas velas de decoração – algumas são muitos bonitas e caras – ou qualquer outra lembrança estimulante.</p>
<p><strong>7- Não desmoralize, estimule </strong>- Evite dar prêmios para os piores; é desmotivador e desmoralizador. Durante um vôo de avião em que as aeromoças cometeram uma série de erros – por exemplo: derrubando café em um passageiro – o capitão, ao dar o seu discurso de sempre pelo microfone, disse: “Nossa empresa tem as melhores aeromoças do país. Infelizmente, nenhuma delas está no vôo de hoje”. Foi muito engraçado na hora, mas constrangedor para toda a equipe. Melhor mesmo é premiar publicamente a excelência e chamar para uma conversa pessoal quem não estiver atingindo suas metas.</p>
<p><strong>8- Trabalho em equipe</strong> &#8211; Premie com dinheiro e outros incentivos a todos da empresa, não apenas quem está diretamente ligado a vendas; afinal, sem o suporte do restante da empresa, os vendedores dificilmente terão sucesso. Esse apoio precisa ser reconhecido, se você quiser que os outros departamentos continuem motivados para dar o suporte necessário a uma equipe de vendas campeã.</p>
<p><strong>9- Fale a verdade, sempre</strong> &#8211; Estimule todos na equipe a admitirem os erros, reconhecendo imediatamente quando pisarem na bola. Isso faz com que o ambiente seja muito mais produtivo. Mas o exemplo deve vir de cima, senão fica só o discurso bonito e, na prática, mentiras, conchavos e um bando de incompetentes jogando a culpa em cima dos outros.</p>
<p><strong>10- Presentes</strong> &#8211; Aproveite feriados para dar presentes baratos para a equipe. Panetones no Natal ou Páscoa, bombons no Dia dos Namorados, bolas antiestresse em aniversários. Enfim, simples lembranças que são dadas para que a equipe saiba que a empresa pensa nela. Outra coisa muito popular e que não exige um investimento monetário são os “vales-descanso”. Como o nome diz, são vales que as pessoas podem trocar – sair mais cedo um hora, uma manhã ou tarde de folga, um dia inteiro; tudo depende das metas estabelecidas. Esse é um prêmio que todos querem ganhar e não vai exigir que o cartão de crédito seja usado.</p>
<p>Veja que essas são apenas dez idéias para motivar a equipe sem gastar dinheiro. Que tal reunir a sua equipe e fazer um <em>brainstorm</em>? Converse com eles e peça para que contribuam com alguma idéia que poderá motivá-los sem que haja um gasto. Podem surgir mais cinco, dez grandes idéias que irão acelerar as vendas de final de ano. Aproveite enquanto há tempo, só não esqueça de colocar essas idéias em prática.<br />
<em></em></p>
<p> </p>
<p><em>Texto retirado da revista Venda Mais 13 anos, de Abril de 2007, ano 13, nº 156, pág. 60</em></p>
<p><em>Nota do copiador: o texto fala sobre vendedores, mas acho que todos percebem que se aplica a qualquer ambiente em que precise gerir pessoas.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://julianoribeiro.com.br/blog/dez-ideias-para-motivar-sua-equipe-sem-gastar-dinheiro/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
