segunda-feira, 9 de agosto de 2010

Rave - Imprimindo Gráficos (Chart)

Uma coisa muito comum nos sistemas, são os relatórios com gráficos estatísticos, os famosos Charts.
Antigamente eu usava o QuickReport e o ReportBuilder, porém relatórios com gráficos só precisei fazer no QuickReport e não tive muitas dificuldade, pois ele já tem um componente que facilita a vida.
Mas, como agora larguei o QuickReport e estou usando somente o Rave, houve então a necessidade de saber como fazer relatórios nele com gráficos.
Comecei então a fuçar no Rave e percebi que não existia nenhum componente que facilitasse a vida. Então fiz algumas pesquisas na internet para saber se não existiam componentes de terceiros, mas infelizmente não achei nenhum, porém nessas pesquisas, achei duas soluções para o caso :
1 Salvar o conteúdo de um TCustomChart em um BMP e imprimir esse BMP no Rave
2 Usar o método WriteChartData disponível na unit RPTChart
Esta última solução é a indicada pela Nevrona.
Fiz o teste com as duas soluções e as duas foram satisfatórias, porém gostei mais da última solução, pois como disse, é indicada pela própria Nevrona e não aparenta ser uma "gambiarra" :-) como a primeira solução.
Depois desta pesquisa, resolvi escrever este artigo para demonstrar como não é um bicho de sete cabeças fazer isso funcionar.
Então vamos lá...
Antes de iniciarmos, gostaria de explicar como a "coisa funciona", para depois partirmos para prática.
O método WriteChartData, "escreve" o conteúdo de um TCustomChart dentro de um campo do tipo Graphic. Então, a princípio, nosso gráfico será montado no TChart ou TDBChart do Delphi, e depois disso, iremos utilizar o WriteChartData para fazer com que o conteúdo do gráfico seja impresso, desenhado dentro do nosso relatório.
Agora vamos colocar em prática esta teoria...
Irei utilizar um RVCustomConnection, pois não preciso estar conectado a um DataSet para gerar o gráfico no Rave, só preciso de alguém que me disponibilize um campo para poder usá-lo na impressão, então o RVCustomConnection é o ideal para isso. Para quem não sabe para que serve o RVCustomConnection, vale a pena começar a mexer nele, pois é muito interessante.
Agora é serio, chega de teoria e vamos para prática...:-)
1 - Insira os seguintes componentes no Form:
TRVProject
TRVCustomConnection
TRVSystem
TChart
2 Na clausula uses, insira a unit RPTChart. É esta unit que nos disponibilizará o método WriteChartData
3 - Ajuste a propriedade Engine do RaveProject, apontando para o RVSystem.
4 - Ajuste o Chart, de forma que represente algum gráfico, só para podermos visualizar o resultado final.
5 Agora iremos ajustar dois eventos do componente RVCustomConnection:
OnGetCols:
Este evento é chamado quando o Rave necessita extrair os meta-data dos campos. É aqui que criaremos nosso campo do tipo graphic. Para isso, coloque o seguinte código neste evento:
with Connection do
begin
WriteField('CampoChart', dtGraphic, 0, '', '');
end;

OnGetRow:
Este evento é chamado quando o Rave necessita extrair os valores dos campos do registro atual. É aqui que iremos alimentar o valor do campo que criamos acima. Para isso, coloque o seguinte código neste evento:
WriteChartData(Connection, Chart1);

Chart1 é o nome do TChart que inserimos no Form.
A parte de codificação já está pronta, agora vamos para parte visual.
6 Entre no RaveDesigner
7 Crie uma Region e dentro desta Region crie uma banda simples.
8 Dentro da Band1(que acabou de ser criada), insira o componente MetaFile, que está na palheta Standard do Rave.
9 Crie uma DataView, da mesma forma que se fosse criar uma outra qualquer, a diferença é que os dados agora virão de um RVCustomConnection.
10 - Após ter criado, perceba que na TreeView o DataView1 está disponível, porém se clicar no sinal de mais do DataView1 para exibir os campos, perceberá que o campo que criamos via código(CampoChart) não está disponível, só tem um campo, que é o que vem de brinde, mas não use-o. Para que o nosso campo possa ser criado, o evento OnGetCols terá que ser chamado, e como fazer isso em tempo de projeto ?
O segredo é : O RaveDesigner tem que estar aberto juntamente com a aplicação e depois chamar o Refresh do DataView.
Então vamos lá...
11 - Execute a aplicação e volte para o RaveDesigner, mas não feche a aplicação ainda.
12 Selecione o DataView1 lá na TreeView e clique com o botão direito do mouse sobre o DataView1. Aparecerá um item chamado Refresh, basta clicar nele e...bingo :-). Pronto, o campo que criamos via código irá aparecer na lista. Quando clicar pela primeira vez no Refresh, vai aparecer uma mensagem, é uma alerta de que um campo será excluído, isso ocorre pois quando criamos a DataView, já veio aquele campo de brinde, mas como não criamos ele no OnGetCols, então a mensagem alertará de que o mesmo será excluído.
13 Agora selecione o componente MetaFile que foi inserindo em Band1 e altere duas propriedades dele:
DataField : CampoChart (nome do campo que criamos)
DataView : DataView1 (nome da dataview criada)
Pronto...Pode executar a aplicação e fazer o teste.
Caso queira fazer o teste no próprio preview do RaveDesigner, basta deixar a aplicação aberta, caso contrário, se a aplicação não estiver aberta e você chamar o preview do RaveDesigner, receberá de presente um errinho básico, o famoso "Acess violation..." :-)
Lembre-se, o exemplo que fizemos foi com um TChart, o mesmo poderá ser feito com um TDBChart.
Outro detalhe, utilizamos um RVCustomConnection, mas poderíamos utilizar um RVDataSetConnection sem problemas, porém neste caso, só fique atento com o seguinte:
No evento OnGetCols, antes de criar o campo, chame o método DoGetCols do Connection que vem como parâmetro neste evento. Isso deve ser feito para que primeiro sejam criadas as colunas do DataSet que está associado e depois sim poder criar as suas colunas.
E no evento OnGetRow, antes de chamar o WriteChartData, chame o método DoGetRow do Connection que vem como parâmetro neste evento. Isso deve ser feito para que primeiro seja alimentando os campos do DataSet que está associado e depois sim poder alimentar seus campos criados manualmente.
Espero que um dia possa surgir um componente para utilizarmos no Rave, pois assim ficará muito mais fácil, mas enquanto isso não acontece, temos esta solução.

Utilizando DBExpress de uma Maneira Fácil

DBExpress, segundo meus testes, é a melhor tecnologia para comunicação com banco de dados. Mas, infelizmente, exige a configuração de vários parâmetros e manipulação de vários componentes visuais.
Pensando neste problema, resolvi criar um componente que contém um conjunto de classes, para facilitar a vida do programador em trabalhar com esta maravilhosa tecnologia.
Procurei criar as classes da melhor maneira possível, com os nomes dos métodos e propriedades o mais parecido possível com o que conhecemos e utilizamos em BDE, Zeos, ADO e mesmo no DBExpress.
Neste artigo, descreverei como instalar e fazer uma aplicação simples. Espero que seja útil para a comunidade e, talvez, os pacotes e classes de suas regras de negócio a utilizem.

Passo 1

Download http://sourceforge.net/projects/dddbxfacil/
Este pacote comtém o componente dddbxfacil com suas classes, bem como uma aplicação simples para utilizá-la.

Passo 2

Criar arquivo de configuração. Este arquivo, já está contido no pacote de exemplo e, ele contém a estrutura que é usada pelo dbconnections.ini e, serve para indicar os parâmetros para conexão ao banco de dados. Eu não costumo deixar o login e password contido neste arquivo mas, nada impede de se inserir nele.
A configuração que defini, foi para o Oracle mas, pode ser para qualquer banco que o Dbexpress é compatível que, acho que são todos:
[NOMESECAOCONFIGORACLE]
CONNECTIONNAME=OracleConnection
GETDRIVERFUNC=getSQLDriverORACLE
VENDORLIB=oci.dll
LibraryName=dbxora30.dll
DriverName=Oracle
HostName=
Database=
User_Name=
Password=
BlobSize=-1
ErrorResourceFile=
LocaleCode=0000
Compressed=False
Encrypted=False

Passo 3

No uses de sua unit, vamos inserir as seguintes units:
DB, DBTables, ddcomumDBX, ddconexaoDBX, ddsqlDBX, ddproviderDBX.

Passo 4

Vamos no private e, colocar as seguintes “variáveis”:
ConexaoDBX: TConexaoDBX;
ProviderDBX: TProviderDBX;
SqlDBX: TsqlDBX;

Passo 5

Este passo é opcional mas, para mostrar melhor o funcionamento da classe, criaremos um método chamado MeuDataChange, novamente apontar ele.
//No private:
procedure MeuDataChange(Sender: TObject; Field: Tfield); //No implementation
procedure TForm2.MeuDataChange(Sender: TObject; Field: TField);
begin
// Nao é necessário colocar teste para ver se tabela tá aberta, DisableControls, etc…
grbTesteGrid.Caption := ‘Testando o grid. Agora são ‘+
FormatDateTime(‘dd/mm/yyyy hh:nn:ss’, now);
end;

Passo 6

Precisamos instanciar as variáveis que criamos no private. Para isso, criei procedimentos para facilitar isso. No formShow, colocaremos o seguinte código:
ddconexaoDBX.ConexaoDBXInit(ConexaoDBX,  nil,
IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName))+‘configuracao.ini’,
‘NOMESECAOCONFIGORACLE’); ConexaoDBX.Login := ‘usuario’;
ConexaoDBX.Senha := ‘senha’;
ddproviderDBX.ProviderDBXInit(ProviderDBX,
ConexaoDBX,
DBGrid1,
‘ROWID’,
true,
MeuDataChange);
ddsqlDBX.SqlDBXInit(SqlDBX, ConexaoDBX);

Passo 7

Exemplo de código para executar busca no banco de dados:
procedure TForm2.btnProcurarClick(Sender: TObject);
var
Retorno: TProviderRetorno;
begin
ConexaoDBX.ConectarSeDesconectado; ProviderDBX.ClearAll;
with ProviderDBX, ProviderDBX.LinhaSQL do
begin
Add(‘SELECT * FROM TABELA’);
Retorno := OpenDQL;
end;
end;

Passo 8

Exemplo de evento de inclusão:
procedure TForm2.btnincluirClick(Sender: TObject);
var
iProximoCodigo: integer;
begin
ConexaoDBX.ConectarSeDesconectado; // Pegar Próximo Codigo
with SQLDBX do
begin
setLinhaSQL(‘SELECT MAX(CODIGO) PROXIMO FROM TABELA’);
OpenDQL;
iProximoCodigo := SQLDQl.FieldByName(‘PROXIMO’).AsInteger+1;
end;
ConexaoDBX.Transacao_Abrir;
try
// Incluir
with SqlDBX do
begin
ClearAll;
with LinhaSQL do
begin
Add(‘INSERT INTO TABELA (CODIGO, DESCRICAO)’);
Add(‘VALUES’);
Add(‘(:P_CODIGO, :P _DESCRICAO)’);
end;
AddParam(ftInteger, ‘P_CODIGO’, iProximoCodigo);
AddParam(ftString, ‘P_DESCRICAO’, ‘nome ‘+IntToStr(iProximoCodigo));
ExecDML;
end;
ConexaoDBX.Transacao_Commit;
except
on E:Exception do
begin
ConexaoDBX.Transacao_RollBack;
ShowMessage(E.Message);
end;
end;
end;

DBGrid com Imagens

Esta é uma dica muito simples mas que produz um efeito muito legal.
Já encontrei vários programas que, ao mostrar determinados dados em um DBGrid, pecavam pela falta de clareza. Por exemplo: Para mostrar se um cadastro estava ativo ou não, apresentava no grid uma coluna que era preenchida com Sim / Não.  Errado? Não. Mas você concorda que pode ficar melhor não é?
Então ai vai minha dica para aperfeiçoar suas aplicações:
1. Estou partindo do ponto em que você ja tem seu ClientDataSet vinculado a um DataSource o qual ja se encontra vinculado a um DBGrid. No exemplo o ClientDataSet se chama TabAux e o DBGrid se chama Grade.
2. Insira um TImageList no seu form e adicione duas imagens.
Você pode baixar as imagens clicando aqui
TImageList
3. No evento OnDrawColumnCell do seu DBGrid escreva o seguinte código:
if Column.Field=TabAuxATIVO then
begin Grade.Canvas.FillRect(Rect);
// Desenha o Quadrado
ImageList1.Draw(Grade.Canvas,Rect.Left+10,Rect.Top+1,0);
// Desenha o check sobre o quadrado quando ativo = ‘S’
if TabAuxATIVO.Text=‘S’ then // Cadastro está ativo
ImageList1.Draw(Grade.Canvas,Rect.Left+10,Rect.Top+1,1);
end;
4. O Resultado ficará assim
DBGrid com Imagem
Espero que aproveite esta dica. Ela é simples, mas da um toque mais profissional para a sua aplicação.

Delphi Function e Procedure


O pessoal que está começando no Delphi geralmente ficam em dúvida quando ouvem sobre Function e Procedure. Vou explicar rapidamente o que é cada uma delas de modo bem resumido.

Function: Define uma subrotina que retorna um valor.

Procedure: Define uma subrotina que não retorna um valor.

É isso, a function retorna algo e a procedure não. Vejamos um exemplo do delphi basics:
 
//–Coloque este código em uma unit chamada Unt1 com um form
//–chamado Frm1 que tenha o evento OnCreate chamado FrmCreate. unit Unt1;
interface
uses
Forms, Dialogs;
type
TFrm1 = class(TForm)
procedure FrmCreate(Sender: TObject);
end;
var
Frm1: TFrm1;
implementation
{$R *.dfm}
Function GetSum(a, b : Integer) : Integer;
begin
//Soma os dois números e retorna o resultado.
Result := a + b;
end;
procedure TFrm1.FormCreate(Sender: TObject);
var
total : Integer;
begin
//Mostra o resultado
total := GetSum(1,2);
ShowMessageFmt(‘%d + %d = %d’,[1,2,total]);
total := GetSum(62,444);
ShowMessageFmt(‘%d + %d = %d’,[62,444,total]);
end;
end.

sexta-feira, 6 de agosto de 2010

Instalando o Zeos em 7 Passos.

Nesse artigo, vamos mostrar a instalação do Zeos (um componente para conexão nativas com banco de dados). Eu particularmente utilizo muito o Zeos em minhas aplicações quando trabalho com o database PostGreSQL, mais ele também suporta outros como Firebird, MySQL, SQL Server, SysBase, Oracle SQLite.
1º Primeiramente vamos realizar o download do mesmo, para isso acesse o site http://sourceforge.net/projects/zeoslib e faça o download da versão Zeos Database Objects que atualmente está na versão “6.6.4”.


 
2º E na próxima tela escolha a versão como mostra na figura 2.
 

 
3º Após realizar o download, descompacte o mesmo em um diretório á sua escolha.
Eu criei um diretório denominado
Zeos na unidade C:, onde foi colocado todos os arquivos que estavam no nosso “Zip”.




4º Com o Delphi 7 Aberto, clique em File, Open Project e escolha a pasta Packages e logo após a pasta Delphi 7, e abra o arquivo “ZeosDbo.bpg”.
 


 
5º Logo após, clique em Project e Compile All Projects.


6º Na janela “Project Manager” clique com o botão direito em “ZComponentDesign70.bpl” e clique em Install.


 
7º Pronto, o Zeos foi instalado com sucesso.
 
 
 


terça-feira, 3 de agosto de 2010

Trabalhando com métodos comparando delphi com java.

Dentro do Delphi, a princípio, todos os métodos quando não acrescidos das cláusulas "Virtual" ou "Dynamic" ao final de sua assinatura, são considerados estáticos, ou seja, o Delphi permite utilizar todos os métodos que não são Virtual ou Dynamic, sem precisar instanciar os Objetos.

Tal qual o Java, o Delphi é fortemente tipado, ou seja, voce precisa declarar variáveis e métodos antes de usá-lo. Só que existe um enorme diferença, eis que a linguagem Object Pascal que o Delphi usa, tem uma lógica de escrita na programação quase parecida com o COBOL, ou seja, voce tem que declarar as classes, variáveis e métodos antes em uma seção chamada Interface e depois implementar os métodos e usar as váriáveis e classes na seção Implementation. A Unidade (Unit) é um arquivo *.pas que é definida inicialmente assim:

unit MeuProjeto;
interface
{ Aqui voce declara primeiro as classes, variáveis e métodos }

implementation
{ Aqui voce implementa as classes, variáveis e métodos } 
end.

Voce pode criar métodos a saber:

1º) Procedure: São métodos que não retornam nada, como se fosse Void no Java.

2º) Function: São métodos que retornam valores.

Como voce quer usar um método globalmente, toda variável ou método declarado antes de implementation, e fora do corpo das classes, ficam visíveis em todo o projeto, assim:
unit Unit2;
interface

uses   // Como se fosse a cláusula Import e abaixo os nomes das Units
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
// Definição de classe, como se fosse public class TForm2 extends TForm no Java
typeTForm2 = class(TForm)  private
{ Private declarations }
public
{ Public declarations }
end;
// Aqui voce declara as suas variáveis com a cláusula var e ou métodos que ficarão visíveis em todo projeto (global), assim:
var
Form2: TForm2; variável tipo Objeto

procedure Incluir;   // método Void sem parâmetro

procedure Mensagem(Mens: String; Flags: Boolean); // método Void com 2 parâmetros
function AtivarBtns: Boolean; // método que retorna valor booleano sem parâmetros;
function AtivarBtns(Ativo: Boolean): Boolean; // método que recebe parâmetro booleano e retorna outro valor booleano.

implementation
{$R *.dfm}

procedure Incluir:
begin
  ....
  ....
end;

procedure Mensagem(Mens: String; Flags: Boolean);
begin
  ....
  ....  end;
function AtivarBtns: Boolean;
begin
  ...
  ...
end;
function AtivarBtns(Ativo: Boolean): Boolean;
begin
   ...
   ...
end;
end.
Se voce pretende criar várias variáveis e métodos globalmente, então eu sugiro que voce crie uma Unit somente para isso, com o nome Unit Biblioteca, e depois é só declarar essa Unit Biblioteca na seção Uses de cada Unit de um Classe Formulário.

Como criar essa Unit ? Vá no menu File -> New -> Unit e pronto.

Nunca esquecer que os blocos de Instruções que no Java são as chaves "{ }", no Delphi são as cláusulas "Begin....End"

Se voce declarar variáveis dentro dos blocos Private e Public do escopo da classe, então dentro de Implementation, voce terá que digitar o nome da classe primeiro seguido de um ponto e logo em seguida a asssinatura do método, como eles podem ser estáticos, o objeto da classe não precisa estar instanciado, entretanto os métodos declarados em Private só ficará visíveis dentro da própria Unit onde a classe é declarada, enquanto que em Public, ele fica visível em outras Units, desde que voce o declare a Unit que contém o método da classe, na Seção Uses (Import do Java) da Unit que voce vai utilizar o método.


Trabalhando com DBCtrlGrids


Desta vez, apresento-lhes a um componente que traz uma alternativa ao “DBGrid” e também um pouco mais de versatilidade com relação ao seu incansável similar. Dentre suas habilidades, a mais louvável seria a de poder agregar outros componentes, geralmente “DataWare”, pois trata-se de um objeto do tipo “Container”, fazendo assim expandir suas possibilidades. Dentre os objetos que podemos adicionar posso citar:

- DBEdit;
- DBComboBox;
- DBImage;
- DBCheckBox;
- DBChart;
- Chart;
- Entre outros.


Para iniciar os trabalhos, adicionemos os seguintes componentes ao seu projeto:

Componente
Aba
DBCtrlGrid
Data Controls
DBEdit
Data Controls
DBComboBox
Data Controls
DBImage
Data Controls
Table
BDE
DataSource
Data Access
Labels (2)
Standard



Talvez você esteja se perguntando. Como vou adicionar estes componentes ao DBCtrlGrid ?
Resposta: Da mesma forma como adicionaria um componente a um “Painel” por exemplo. Clicando no componente desejado em uma das abas do Delphi, e clicando de volta sobre o componente “DBCtrlGrid”.

Dica: Se você tentar adicionar um componente e uma tela surgir com esta mensagem “Cannot control be used in a DBCtrlGrid.” é porque o componente não implementa as Propriedades e Eventos do Objeto escolhido.

Configurando componentes:

Componente
Propriedade
Valor
DataSource1
DataSet
Table1
Table1
TableName
c:\Arquivos de Programas\Arquivos Comuns\Borland Shared\Data\biolife.db
Table1
Active
True
Table1
ReadOnly
True
DBCtrlGrid1
DataSource
DataSource1
DBCtrlGrid1
Width
633

Ao executar o programa, perceberá que apareceram outras linhas “registros”, tanto com relação à quantidade de peixes, quanto à de exibição por página, que vem configurada para três. Isso pode ser modificado para quantas quiser, mas não aconselho um número muito alto, pois não caberia na tela. A propriedade que altera este valor é “RowCount” e só aceita números inteiros. Outra propriedade interessante é a que altera a orientação “Orientation” e que vem por padrão setada para “goVertical”.

Fiz este projeto com um componente “Table” pela facilidade de configuração, mas poderia ter sido com qualquer outro suportado pelo Delphi.

Curiosidade: Em outros testes realizados posteriormente, percebi que o “DBCtrlGrid” suporta adicionar até mesmo um componente do tipo “QuickRep”, da aba QReport, que para quem não conhece, trata-se de um componente gerador de relatórios. Segue a dica para quem quiser aprofundar seus conhecimentos e usar de criatividade para desenvolver seus sistemas.

Com a leitura desse artigo você aprendeu:

- Configurar e exibir dados de uma fonte de dados em um “DBCtrlGrid”;
- Adicionar componentes em um “DBCtrlGrid”.

segunda-feira, 2 de agosto de 2010

Instalação de Componentes no Delphi

O Delphi nos proporciona várias formas de instalação de componentes, isso confunde um pouco quem vai fazer tal tarefa.

Às vezes, instalamos um componente e só um ano depois, após formatarmos nossas máquinas, iremos reinstalar os mesmos. Por este motivo, esquecemos de como é feita a sua instalação.

Podemos instalar componentes cuja extensão dos arquivos é: *.pas, *.dcu, *.dpk.

Explicando todas as instalações:

1- *.pas

Arquivos que necessitam de um Package (componentes que possuem o *.pas), execute o Delphi e feche o projeto, acesse o menu ‘Component’ e clique na opção ‘install component’, na tela que abrirá clique na aba ‘Into new package’, clique no botão Browse...(figura 1.1). Abra o arquivo com a extensão *.pas, clique em OK e após compile e instale. Após isto, o Delphi irá criar uma aba na barra de componentes com o nome do seu novo componente.

(Figura 1.1)
Clique para ver a imagem em seu tamanho real

2 - *.DPK

Para a instalação de pacotes (arquivos com extensão *.DPK), execute o Delphi, feche o projeto, acesse o menu File e clique na opção ‘Open’, abra o arquivo que contém os componentes. Clique em OK e após clique em ‘Install’. (Figura 2.1).

(Figura 2.1 – exemplo instalação do Crystal Report).
Clique para ver a imagem em seu tamanho real

3- *.DCU

Para a instalação de componentes cujo arquivo tem a extensão *.DCU acesse o menu ‘Component’ e clique na opção ‘Install Package’. Verifique se na lista ‘Design Packages’ existe a opção ‘Borland user component’, se sim, clique nela e em seguida clique no botão ‘Edit’(Figura 3.1), abrirá uma caixa de mensagem, clique no botão ‘Yes’. Na janela que aparece, clique no botão ‘Add’, na janela que se abrirá, clique no botão ‘Browse’ da caixa de texto ‘unit file name’. Na caixa de combinação ‘files of type’ escolha ‘Delphi compiled unit’. Depois, na caixa de texto ‘File Name’ direcione o arquivo a ser instalado, clique no botão ‘Open’. Clique o botão ‘OK’ na janela que aparece e clique no botão ‘install’.

Se na lista Design packages não tiver a opção Borland user component você deverá primeiro instalar componentes que estão em arquivos com extensão *.pas.

(Figura 3.1)
Clique para ver a imagem em seu tamanho real

OBS.: É imprescindível que seja copiado os arquivos de cada componente para a pasta lib do Delphi, do contrário o delphi acusará a falta de arquivos para a compilação/instalação dos componentes.

Um pouco mais...

Quando precisamos de mais alguns recursos no Delphi, ele nos dá a possibilidade de utilizar ActiveX de softwares que já estão instalados em nossa máquina. É necessário importar o ActiveX e o Delphi irá criar uma paleta com o nome ActiveX com o componente.

Acesse o menu ‘Component’, clique em ‘Import ActiveX Control...’. Irá aparecer uma tela(Figura 4.1) com a lista dos ActiveX que podemos instalar, escolha um e clique em Install, para fazer este teste escolhi o Media Player, a tela seguinte (Figura 4.2) irá especificar o Package que será utilizado pelo componente. Clique em OK.

Confirme a instalação do Package e instale o ActiveX (Figura 4.3).

Pronto, agora você pode visualizar vídeos em seus projetos, preencha a URL com o endereço do vídeo.

(Figura 4.1)
Clique para ver a imagem em seu tamanho real

(Figura 4.2)
Clique para ver a imagem em seu tamanho real

(Figura 4.3)
Clique para ver a imagem em seu tamanho real

Função para gerar senhas aleatórias

Essa é uma dica simples e que para os que trabalham com redes sem fio pode ser muito útil. O que a função faz é gerar um string com caracteres hexadecimais, mas que podem ser adaptados para qualquer outro tipo. Esta função recebe como parâmetros o comprimento da senha como um integer, e outros três parametros do tipo boolean que indicam se estarão presentes letras minúsculas, maiúsculas e números.

Aqui vai o código e as explicações seguem logo abaixo.
function GeraSenhaHex(Digitos: Integer; Min: Boolean; Mai: Boolean; Num: Boolean): string;
const
MinC = 'abcdef';
MaiC = 'ABCDEF';
NumC = '1234567890';
var
p, q : Integer;
Char, Senha: String;
begin
Char := '';
If Min then Char := Char + MinC;
If Mai then Char := Char + MaiC;
If Num then Char := Char + NumC;
for p := 1 to Digitos do
  begin
    Randomize;
    q := Random(Length(Char)) + 1;
    Senha := Senha + Char[q];
  end;
Result := Senha;
end;
 
Explicações:

Primeiro criamos as constantes que trarão os caracteres referentes a letras minúsculas, maiúsculas, e números, depois, iniciamos como vazia, só por desencargo de consciência já que o delphi faz isso por padrão, a variável "Char", que conterá todos os caracteres a serem usados para a geração da senha randômica.
Após isso, testamos os parâmetros para letras maiúsculas, minúsculas e números, acrescentando à "Char" cada um dos que forem verdadeiros segundo os parâmetros passados na chamada da função.
E depois, para finalizar, um laço com o número de repetições igual aos dígitos passados também como parâmetro na chamada, que usando a função Random do delphi gera números aleatórios dentro do limite estabelecido pelo cumprimento da variável "Char", lembrando que o fato de acrescentar o "+ 1" é por que as posições dos caracteres dentro de um string iniciam em 1, e a função Random gera números de 0 até o valor estipulado como limite. Por exemplo uma String = 'teste' temos os valores a seguir:
String[1] = 't'
String[2] = 'e'
String[3] = 's'
String[4] = 't'
String[5] = 'e'
Terminado. Simples, fácil e bem útil.
 

Função para criar diretorio na Exportação de dados

Essa é uma dica para gerar um diretório no diretório padrão do sistema em exportação de dados em um txt.

Variaveis
var
arq: TextFile;
pasta: String;
Função que para pegar o Diretorio do sistema e gerar a o Diretorio.
 function IniciaDirArq(dirNome: string; arqNome: string): string;
  begin
    pasta := GetPath(Application.ExeName) + '' + dirNome + '';
    CreateDirectory(PAnsiChar(pasta), nil);
    pasta := pasta + arqNome;
    AssignFile(arq, pasta);
    Rewrite(arq);
  end;

Explicação:
Primeiro Declaramos as variaveis arq do tipo TextFile e pasta do tipo string, a variavel pasta na função receberá o GetPath da aplicação(onde está o executavel) + o nome do diretório a ser criado (dirNome),  em seguida gera o direório (CreateDirectory), apos gerar o diretório é precisso gerar o arquivo cujo nome será passado por parametro da função (arqNome) faz a atribuição ao caminho do arquivo (Assingfile), Rewrite deixa o arquivo pronto para excrita.
Aqui chama a função:
IniciaDirArq('Teste', 'Teste.txt');
A função recebe os parametros Teste (dirNome), teste.txt (arqNome)
Gera um txt com os dados da exportação
  Write(arq,
    '2'+
    'T'+ 
    '0.00' +
    '0.00' +
    '0.00' +
    '0.00');
  CloseFile(arq);
Escrevendo os dados no arquivo teste.txt  e fecha o arquivo (CloseFile)

O DBA de Alta Performance


Hoje conversaremos a respeito do trabalho do profissional responsável por Banco de Dados e seus desafios. Sabemos que o grande objetivo de ter um banco de dados em uma empresa é registrar e manter suas informações mais importantes. O responsável pela manutenção e administração dessas informações e de todos os sistemas que rodam utilizando bancos de dados é o Administrador de Banco de Dados, mais conhecido como DBA
A cada ano que passa o trabalho deste profissional está cada vez mais complexo, pois os fatores que mais o afetam estão em constante crescimento, mais dados, mais bancos de dados, virtualização e carência de profissionais eficientes no mercado de trabalho.

O crescimento de dados, por exemplo, tem sido enorme nos últimos anos. Há alguns anos atrás (década passada), os DBAs se preocupavam com Megabytes, hoje tem que lidar com Terabytes e já em algumas grandes companhias com Pentabytes.

Isto tem gerado tarefas bem complexas para seu gerenciamento. Como, por exemplo, monitorar com segurança seus backups, o monitoramento e planejamento desse crescimento, Multiplataforma, Virtualização, Tunning, Capacitação e muitos outros.

E isso é apenas parte de suas funções, o DBA deve se preocupar se as aplicações que rodam utilizando os bancos de dados foram criadas dentro dos padrões, que o banco exige, com tabelas modeladas, quantidade de índices nas aplicações, usuários que as utilizarão, enfim uma série de outros fatores que podem, e muito, atrapalhar seu desempenho. Digo "seus", pois à medida que crescem o volume dos bancos de dados crescem também os tipos de plataformas e de versões a serem administradas.

Hoje a grande maioria dos DBAs tem que gerenciar ambientes de múltiplos bancos de dados e o seu mais novo desafio é estender seus conhecimentos a outros tipos não conhecidos anteriormente pelo profissional.

Outro fator que esta se tornando cada vez mais comum é a virtualização. Com o grande crescimento de “datacenters” virtualizados, criou-se outro tipo de problema para se administrar banco de dados, que vão desde o planejamento da capacidade de seus servidores ao monitoramento da performance.

Performance, este é o grande desafio. Quem nunca ouviu "minha aplicação esta travada" ou ainda "nosso sistema está com problemas hoje", frases comuns que afetam diretamente os DBAs, pois todos acreditam ser deles a responsabilidade de uma aplicação rodar "a todo vapor". O constante monitoramento da performance de um banco de dados é a garantia que os usuários acessem os dados mais rápidos com facilidade e que o banco de dados utilize seus recursos de maneira eficiente.

Hoje temos uma carência de bons profissionais. Administradores de bancos de dados experientes sempre foram difíceis de encontrar, o treinamento é fundamental na sua formação e para quem deseja estar atualizado para o mercado. Apesar de esses fatores aumentarem os desafios do dia-a-dia, fornecedores de banco de dados têm trabalhado para que seus bancos sejam cada vez mais "autogerenciáveis", algo tremendamente positivo e com melhorias já notadas. Porém, a complexidade do ambiente de SGBD está aumentando e não parece ter um fim para a gestão e intervenção humana.

Independente desses desafios, espera-se que o DBA, sobrecarregado de trabalho, mantenha os sistemas de banco de dados essenciais disponíveis e otimizados para ter alta performance. O DBA de alta performance deve concentrar-se nas áreas fundamentais do gerenciamento de banco de dados, que são: Armazenamento, Capacidade e Performance.

Segundo Scott Walz, diretor sênior de produtos da Embarcadero, "Para cumprir essas metas, o DBA deve adotar uma estratégia e equipar-se com as ferramentas certas para enfrentar esses desafios, pois ainda há muito que aprender, compreender e dominar a cada novo lançamento de banco de dados".

Curso de Delphi: 7.Consultas SQL