segunda-feira, 2 de agosto de 2010

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".

segunda-feira, 26 de julho de 2010

Algumas dicas Uteis

Reproduzir arquivos de som WAV:


{ Inclua na seção uses: MMSystem }

PlaySound('C:\NomedoArquivodeSom.wav', 1, SND_ASYNC);

--------------------------------------------------------------------------------------------------------------

Enviar Arquivo para lixeira :

Inclua na seção uses: ShellApi

{ Coloque a procedure abaixo na seção implementation }

procedure ArqParaLixeira(const NomeArq: string; var MsgErro: string);
var
Op: TSHFileOpStruct;
begin
MsgErro := '';
if not FileExists(NomeArq) then begin
MsgErro := 'Arquivo não encontrado.';
Exit;
end;
FillChar(Op, SizeOf(Op), 0);
with Op do begin
wFunc := FO_DELETE;
pFrom := PChar(NomeArq);
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMATION or FOF_SILENT;
end;
if ShFileOperation(Op) <> 0 then
MsgErro := 'Não foi possível enviar o arquivo para a lixeira.';
end;

{ - Coloque um botão no Form;
- Altere o evento OnClick do botão conforme abaixo: }

procedure TForm1.Button1Click(Sender: TObject);
var
S: string;
begin
ArqParaLixeira('c:\Diretorio\Teste.doc', S);
if S = '' then
ShowMessage('O arquivo foi enviado para a lixeira.')
else
ShowMessage(S);
end;

--------------------------------------------------------------------------------------------------------------

Fechar o Windows:

{ Reinicia o Windows }
ExitWindowsEx(EWX_REBOOT, 0);

{ Desliga o Windows }
ExitWindowsEx(EWX_SHUTDOWN, 0);

{ Força todos os programa a desligarem-se }
ExitWindowsEx(EWX_FORCE, 0);

{ Você já observou a caixa "Propriedades", aquela que mostra
as propriedades de um arquivo no Windows Explorer, não
aparece na lista do Alt+Tab e tampouco na barra de tarefas?

Isto ocorre porque ela funciona como uma ToolWindow, enquanto
os demais aplicativos funcionam como AppWindow. Porém podemos
mudar o comportamento de nossos programas feito em Delphi
para que se comportem como uma ToolWindow também.

Para experimentar, crie um novo projeto e altere o
Project1.dpr como abaixo (não esqueça do uses):
}

program Project1;

uses
Forms, Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

var
ExtendedStyle : Integer;
begin
Application.Initialize;

ExtendedStyle := GetWindowLong(Application.Handle, gwl_ExStyle);
SetWindowLong(Application.Handle, gwl_ExStyle, ExtendedStyle or
ws_Ex_ToolWindow and not ws_Ex_AppWindow);

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

--------------------------------------------------------------------------------------------------------------

Obter nome do usuário e a empresa registrada no Windows:

Inclua na seção uses: Registry

{ Coloque um botão no form e altere seu evento OnCkick
como abaixo: }

procedure TForm1.Button1Click(Sender: TObject);
var
Reg: TRegIniFile;
S: string;
begin
Reg := TRegIniFile.Create('SOFTWARE\MICROSOFT\MS SETUP (ACME)\');
try
S := Reg.ReadString('USER INFO','DefName','');
S := S + #13;
S := S + Reg.ReadString('USER INFO','DefCompany','');
ShowMessage(S);
finally
Reg.free;
end;
end;    

Executar programa do DOS e fechá-lo em seguida

{ Coloque isto no evento OnClick de um botão: }

WinExec('command.com /c programa.exe',sw_ShowNormal);

{ Se quizer passar parâmetros pasta adicioná-los após o
nome do programa. Exemplo: }

WinExec('command.com /c programa.exe param1 param2',sw_ShowNormal);

domingo, 25 de julho de 2010

Como gravar posição do form no registro do windows e recuperá-lo



Caros amigos delphianos, esta dica é muito útil para quem precisa gravar a posição do formulário no registro do windows e assim quando o usuário for abrir aquele mesmo form ele irá buscar esta informações no registro do windows e chamar o form do mesmo jeito que o usuário visualizou pela ultima vez
Basta inserir no FormShow do form a seguinte linha de código:
// Recupera a posição da janela no registro do windows
GetRegWindowState(Self, '\Software\Software Teste\Teste\Cadastro\Form\CadTabPreco');

E para gravar as informações insira esta linha de código no FormClose do form. 
// Grava a posição do form para posterior recuperação no "FormShow" 
SetRegWindowState(Self,'\Software\Software Teste\Teste\Cadastro\Form\CadTabPreco');

Observação: Self: é o próprio objeto form que está sendo executado.
'\Software\Software Teste\Teste\Cadastro\Form\CadTabPreco': Caminho no registro do windows aonde será gravada as informações.



sexta-feira, 23 de julho de 2010

Pesquisa entre faixa de valores com Firebird

Fonte: www.activedelphi.com.br

Caso queira abrir uma tabela do Firebird pelo Delphi, começando por exemplo, pelo registro com ID 11200 até o ID 11400, deverá usar esta procedure e chamá-la por um botão
Você poderá usar os componentes de acesso a dados de sua preferência, mas em meu caso, estou trabalhando com DBExpress (um SQLConection, um SimpleDataSet e um DataSource):
procedure TForm1.SQLFiltra(Sender: TObject);
var
  Campo1, Campo2: string;
  Ok1, Ok2: Boolean;
begin
  Campo1:=
'';
  Campo2:=
'';
  //recupera o código inicial na variável Campo1
  InputQuery(
'Código Inicial',
   
'Digite o Código onde começará a ser salvo a tabela',
    Campo1);
  //recupera o código final na variável Campo2
  InputQuery(
'Código Final',
   
'Digite o Código onde terminará a seleção para ser salvo a tabela',
    Campo2);
  //se informou os dois códigos
  if (Campo1 <> '') and (Campo2 <> '') then
  begin

    //monta o select utilizando o operador BETWEEN, que faz a pesquisa
    //entre uma faixa de valores, seja numérico, caracter ou date/hora

    SimpleDataSet1.Close;
    SimpleDataSet1.DataSet.CommandText :=
'SELECT * FROM TABELA' +
     
' WHERE CAMPOTABELA BETWEEN ' + Campo1 + ' AND ' + Campo2;
    SimpleDataSet1.Open;
  end
  else

    ShowMessage(
'Valor(es) não digitado(s)');
end;

Curso de Delphi: 7.Consultas SQL