sexta-feira, 19 de fevereiro de 2010

Gerar senhas aleatórias

Salve, salve amigos,

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 cumprimento da senha como um integer, e outros três parâmetros 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'


Veja o exemplo de uso:

ShowMessage( GeraSenhaHex(8, False, True, True) );

//Senhas com 8 Caracteres e Letras Maiúsculas e Números


Take care

Verificar se diretório esta vazio

Por Wesley Y


Nossa rotina precisa de um parâmetros para funcionar, o caminho do diretório que desejamos verificar se esta vazio ou não.


function TFrmPrincipal.ValidaDiretorio(Dir: string): Boolean;

var

SR: TSearchRec;

I: Integer;

begin

Result := False;

FindFirst(IncludeTrailingPathDelimiter(Dir) + '*', faAnyFile, SR);

for I := 1 to 2 do

if (SR.Name = '.') or (SR.Name = '..') then

Result := FindNext(SR) <> 0;

FindClose(SR);

end;


No onClick de um BitBtn


procedure TFrmPrincipal.BtnVerificar1Click(Sender: TObject);

begin

if DirectoryExists(EdtPasta.Text) then

begin

if ValidaDiretorio(EdtPasta.Text) then

TaskMessageDlg('Atenção', 'Diretório esta vazio', mtInformation, [mbOK], 0);

else

TaskMessageDlg('Atenção', 'Diretório não está vazio', mtInformation, [mbOK], 0);

end

else

TaskMessageDlg('Erro', 'Diretorio ' + EdtPasta.Text + ' não existe ', mtError , [mbOK], 0);

end;


Take care

Imprimir qualquer arquivo direto do Delphi

Por Wesley Y


Vamos mostrar como imprimir qualquer tipo de arquivo direto pelo Delphi, seja um Doc, txt, XLS, ou qualquer formato.

Vamos ao exemplo


Adicione

1 OpenDialog

2 Button (BtnImprimir e BtnAbrir)

1 Edit ( EdtCaminho)


Obs : Precisamos dar uses em ShellAPI.





No onClick do BtnAbrir

procedure TFrmPrincipal.BtnAbrirClick(Sender: TObject);

begin

if OpenDialog1.Execute then

EdtCaminho.Text := OpenDialog1.FileName;

end;


No onClick do BtnImprimir – Enviamos um comando através do Delphi enviando o arquivo direto pra impressora padrão do Windows.



procedure TFrmPrincipal.BtnImprimirClick(Sender: TObject);

begin

ShellExecute(Handle, 'print',

PChar(OpenDialog1.FileName ),

nil, nil, SW_HIDE) ;

end;

end.


Take care

DLL para validar CPF e CNPJ - Parte II

-- Por Wesley Y

DLL para validar CPF e CNPJ - Parte II


Bom pessoal neste artigo será mostrado como consumir a DLL de validação de CNPJ e CPF que foi desenvolvida na Parte I.


Vamos criar uma Aplicação. Adicionar:


2 Edits ( edtCPF, EdtCNPJ)

1 Button – BtnValidar




Vamos fazer algumas inclusões em nossa Unit.

Unit uFrmPrincipal;

Interface


uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;


const

DLLData = 'prj_DLL_CNPJ_CPF.dll';


// Coloque a DLL junto com o Executável, ou então fixe o caminho da
// mesma , C:\DLL\_DLL_CNPJ_CPF.dll'


type

TForm2 = class(TForm)

Edit1: TEdit;

BtnValidar: TButton;

Edit2: TEdit;

Label1: TLabel;

Label2: TLabel;

procedure BtnValidarClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

{Funções da DLL }


Function TestaCpfCgc(Value: String): String; stdcall; external DLLData;

// Declaração Identica como fazemos na criação da DLL,
// e dizemos que vamos usar a DLLData


implementation

{$R *.dfm}


{Clique do BtnValidar}

procedure TForm2.BtnValidarClick(Sender: TObject);

begin

TestaCpfCgc(Edit1.Text);

TestaCpfCgc(Edit2.Text)

end;


end.



Conclusão

Temos agora de forma encapsulada, funções muito usadas para validação de CPF e CNPJ, obviamente que as funçoes/algoritimos foram retirados da internet e apenas foram transcritas para a DLL, tornando assim acessível para qualquer aplicação, seja em Delphi ou não.



Take care

DLL para validar CPF e CNPJ - Parte I

-- Por Wesley Y


DLL para validar CPF e CNPJ - Parte I

Vamos criar uma DLL para validar CPF e CNPJ, então vamos criar a DLL.



Para maiores informações sobre DLL veja os links abaixo..

http://www.devmedia.com.br/articles/viewcomp.asp?comp=15450

http://www.devmedia.com.br/articles/viewcomp.asp?comp=15451

http://www.devmedia.com.br/articles/viewcomp.asp?comp=15452



Para criarmos a DLL.

Menu File / New / Other / DLL Wizard.

Agora iremos implementar nossa DLL. Salve a mesma com o nome prj_DLL_CNPJ_CPF, este será o nome da nossa DLL.



library prj_DLL_CNPJ_CPF;


{ Important note about DLL memory management: ShareMem must be the

first unit in your library's USES clause AND your project's (select

Project-View Source) USES clause if your DLL exports any procedures or

functions that pass strings as parameters or function results. This

applies to all strings passed to and from your DLL--even those that

are nested in records and classes. ShareMem is the interface unit to

the BORLNDMM.DLL shared memory manager, which must be deployed along

with your DLL. To avoid using BORLNDMM.DLL, pass string information

using PChar or ShortString parameters. }


uses

SysUtils, Dialogs,

Classes;


{$R *.res}


// Valida dígito verificador de CNPJ

function TestaCGC(Dado : string) : boolean;stdCall;

var D1 : array[1..12] of byte;

I, DF1,

DF2, DF3,

DF4, DF5,

DF6, Resto1,

Resto2, PrimeiroDigito,

SegundoDigito : integer;

begin

Result := true;

if Length(Dado) = 14 then

begin

for I := 1 to 12 do

if Dado[I] in ['0'..'9'] then

D1[I] := StrToInt(Dado[I])

else

Result := false;

if Result then

begin

DF1 := 0;

DF2 := 0;

DF3 := 0;

DF4 := 0;

DF5 := 0;

DF6 := 0;

Resto1 := 0;

Resto2 := 0;

PrimeiroDigito := 0;

SegundoDigito := 0;

DF1 := 5*D1[1] + 4*D1[2] + 3*D1[3] + 2*D1[4] + 9*D1[5] + 8*D1[6] +

7*D1[7] + 6*D1[8] + 5*D1[9] + 4*D1[10] + 3*D1[11] + 2*D1[12];

DF2 := DF1 div 11;

DF3 := DF2 * 11;

Resto1 := DF1 - DF3;

if (Resto1 = 0) or (Resto1 = 1) then

PrimeiroDigito := 0

else

PrimeiroDigito := 11 - Resto1;

DF4 := 6*D1[1] + 5*D1[2] + 4*D1[3] + 3*D1[4] + 2*D1[5] + 9*D1[6] +

8*D1[7] + 7*D1[8] + 6*D1[9] + 5*D1[10] + 4*D1[11] + 3*D1[12] +

2*PrimeiroDigito;

DF5 := DF4 div 11;

DF6 := DF5 * 11;

Resto2 := DF4 - DF6;

if (Resto2 = 0) or (Resto2 = 1) then

SegundoDigito := 0

else

SegundoDigito := 11 - Resto2;

if (PrimeiroDigito <> StrToInt(Dado[13])) or

(SegundoDigito <> StrToInt(Dado[14])) then

Result := false;

end;

end

else

if Length(Dado) <> 0 then

Result := false;

end;




// Valida dígito verificador de CPF

function TestaCPF(Dado : string) : boolean;stdCall;

var D1 : array[1..9] of byte;

I, DF1,

DF2, DF3,

DF4, DF5,

DF6, Resto1,

Resto2, PrimeiroDigito,

SegundoDigito : integer;

begin

Result := true;

if Length(Dado) = 11 then

begin

for I := 1 to 9 do

if Dado[I] in ['0'..'9'] then

D1[I] := StrToInt(Dado[I])

else

Result := false;

if Result then

begin

DF1 := 0;

DF2 := 0;

DF3 := 0;

DF4 := 0;

DF5 := 0;

DF6 := 0;

Resto1 := 0;

Resto2 := 0;

PrimeiroDigito := 0;

SegundoDigito := 0;

DF1 := 10*D1[1] + 9*D1[2] + 8*D1[3] + 7*D1[4] + 6*D1[5] + 5*D1[6] +

4*D1[7] + 3*D1[8] + 2*D1[9];

DF2 := DF1 div 11;

DF3 := DF2 * 11;

Resto1 := DF1 - DF3;

if (Resto1 = 0) or (Resto1 = 1) then

PrimeiroDigito := 0

else

PrimeiroDigito := 11 - Resto1;

DF4 := 11*D1[1] + 10*D1[2] + 9*D1[3] + 8*D1[4] + 7*D1[5] + 6*D1[6] +

5*D1[7] + 4*D1[8] + 3*D1[9] + 2*PrimeiroDigito;

DF5 := DF4 div 11;

DF6 := DF5 * 11;

Resto2 := DF4 - DF6;

if (Resto2 = 0) or (Resto2 = 1) then

SegundoDigito := 0

else

SegundoDigito := 11 - Resto2;

if (PrimeiroDigito <> StrToInt(Dado[10])) or

(SegundoDigito <> StrToInt(Dado[11])) then

Result := false;

end;

end

else

if Length(Dado) <> 0 then

Result := false;

end;



// Validar a CPF e CNPJ, esta é a função que iremos executar na aplicação

function TestaCpfCgc(Dado: string): String; stdCall;

var

i: integer;

begin

for i:= 1 to length(Dado) do begin

if not (Dado[i] in ['0'..'9']) then delete(Dado,i,1);

end;

if ((length(Dado) <> 11) and (length(Dado) <> 14))then

MessageDlg('ATENÇÃO: O número informado NÃO representa' + #13 +

'um CPF ou CGC válido pelas regras da Receita Federal',mtWarning,[mbOK],0);

if length(Dado) = 14 then begin

if TestaCGC(Dado) then begin

insert('-',Dado,13);

insert('/',Dado,9);

insert('.',Dado,6);

insert('.',Dado,3);

end

else MessageDlg('O número informado NÃO representa um CGC' + #13 +

'válido pelas regras da Receita Federal', mtWarning, [mbOK], 0);

end;

if length(Dado) = 11 then begin

if TestaCPF(Dado) then begin

insert('-',Dado,10);

insert('.',Dado,7);

insert('.',Dado,4);

end

else MessageDlg('O número informado NÃO representa um CPF' + #13 +

'válido pelas regras da Receita Federal', mtWarning, [mbOK], 0);

end;

Result := Dado;

end;


exports

// Exportamos somenet a Function TestaCPFCGC, pois esta é quem irá validar, as
// demais não precisam ser exportadas pois não serão usadas.


TestaCpfCgc;


begin

end.


//Fim da implementação da DLL


Proximo post veremos como consumir esta DLL.

Take care.

quinta-feira, 11 de fevereiro de 2010

Visual Studio 2010 - RC1

Salve, salve,

A versao RC1 do do Visual Studio 2010 acaba de sair. Nesse momento você já tem acesso a uma edição do Visual Studio 2010 mais otimizada bem próxima da versão final.

Download

Microsoft Visual Studio 2010 Ultimate RC – ISO (IDE)

Take care

2010 MVP Global Summit



Clique aqui para visitar o site.

Take care.