sexta-feira, 14 de outubro de 2016

WINDOWS - Usuário e Senhas de compartilhamentos - Users and Passwords of Shares

Comando para verificar Usuários e Senhas Armazenados no compartilhamentos do windows.

Você realizar algumas ações nessa janela:
- Adicionar
- Editar
- Remover
- Fazer Backup
- Restaurar Backup

Vá em Iniciar -> Executar (ou Win + R) e digite o texto abaixo:

rundll32.exe keymgr.dll, KRShowKeyMgr

DELPHI - Login AD/LDAP usando ADO - Login AD/LDAP using ADO

A função abaixo retorna TRUE se o usuário estiver válido no AD e False caso contrário.



{
Name               //Nome do Usuário Completo
sAMAccountName        // Nome do Usuario Logado(fulano.santos)
userAccountControl    //512 para usuario habilitado / 514 para usuario desabilitado
userPrincipalName     //Usuário com dominio (fulano.santos@dominio.com)
objectClass = 'User'  //para filtrar somente os objetos usuários no WHERE

EXEMPLO:
SELECT Name, sAMAccountName, userAccountControl FROM LDAP://dominio.com
WHERE objectClass = 'User' and sAMAccountName = 'fulano.santos'
}

//Data.DB, Data.Win.ADODB, System.SysUtils   <-- Declarar nas Uses


function ValidarLoginAD(Dominio, User, Password: String): Boolean;
var
  ADOCon :TADOConnection;
  ADOQuery :TADOQuery;
  SQL, NmUser :String;
  PosArroba :Integer;
const
  campos = 'Name, sAMAccountName, userAccountControl';
begin
  Result := False;

  PosArroba := Pos('@', User);
  NmUser := Copy(User, 1, Pos('@', User)-1); //copia o nome do usuario antes do @
  
  ADOCon := TADOConnection.Create(nil); //Cria os objetos de conexão
  ADOQuery := TADOQuery.Create(nil);
  try
    //Atribui as configurações
    ADOQuery.Connection := ADOCon;
    ADOCon.LoginPrompt := False;

    ADOCon.Provider := 'ADSDSOObject';
    ADOCon.Properties['User Id'].Value := User;
    ADOCon.Properties['Password'].Value := Password;
    ADOCon.Properties['Encrypt Password'].Value := True;
    //Gera o Select
    SQL := Format('SELECT %s FROM ''LDAP://%s'' WHERE objectClass = %s and sAMAccountName = %s',
      [campos, Dominio, QuotedStr('User'), QuotedStr(NmUser)]);
    ADOQuery.SQL.Text := SQL;

    try //Abre a conexão
      ADOQuery.Open;
      if ADOQuery.RecordCount > 0 then
      begin
        if ADOQuery.FieldByName('userAccountControl').AsInteger = 512 then //512 para usuario habilitado
          Result := True
        else
        if ADOQuery.FieldByName('userAccountControl').AsInteger = 514 then //514 para usuario desabilitado
          raise Exception.Create('User disabled');
      end;
    except on E :Exception do
      raise Exception.Create(E.Message);
    end;
  finally
    ADOQuery.Close;
    ADOCon.Connected := False;
    FreeAndNil(ADOCon);
    FreeAndNil(ADOQuery);
  end;
end;

DELPHI - Calcular diferença de data/hora - Calculate date/time difference

Essa função calcula a diferença entre duas data/hora e devolve o retorno em String pois o retorno vai ser sempre em horas.


Formato do retorno: HH:mm:ss


function CalcularDiferencaDtHrToString(DataFinal, DataInicial: TDate; HoraFinal, HoraInicial: TTime): String;
var
  DataHoraFinal, DataHoraInicial :TDateTime;
  Total, Horas :Real;
  H, M, S, SS :Word;
  NumDias :Integer;
begin
  DataHoraFinal := DataFinal + HoraFinal;
  DataHoraInicial := DataInicial + HoraInicial;

  if DataHoraInicial > DataHoraFinal then
    Total := DataHoraInicial - DataHoraFinal
  else
    Total := DataHoraFinal - DataHoraInicial;

  NumDias := Trunc(Total);
  Horas := Total - Trunc(Total);
  Decodetime(Horas, H, M, S, SS);
  H := H + 24 * Trunc(NumDias);

  Result := FormatFloat('#00',H) + ':' + FormatFloat('00',M)+':'+FormatFloat('00',S);
end;

sexta-feira, 30 de setembro de 2016

DELPHI - Como lêr funções/procedures na DLL - How to read function/procedure in the DLL

Segue abaixo uma das formas para ler DLLs no Delphi.
A dll tem que estar na mesma pasta do executavel.
var
  DLLHandle :THandle;
  NomeDaFuncaoOuProcedure :function(Parametro1:String; Parametro2 :Integer):String; stdcall;
  Retorno :String;
begin
  try
    try
      DLLHandle := LoadLibrary('NomeDaDLL.dll');

   if DLLHandle > 0 then
   begin
    NomeDaFuncaoOuProcedure := GetProcAddress(DLLHandle, 'NomeDaFuncaoOuProcedure');

    Retorno := NomeDaFuncaoOuProcedure(Parametro1, Parametro2);
   end
  raise Exception.Create('DLL não encontrada.');
    finally
      FreeLibrary(DLLHandle);
    end;
  except on E: Exception do
    ShowMessage(E.Message);
  end;
end;

segunda-feira, 26 de setembro de 2016

DELPHI - Criptografar e Decriptografar String (AES-256) - Encrypt and Decrypt String (AES-256)

Segue Unit para Encriptar ou Decriptar String.

unit uCriptografia;

interface

uses
  uTPLb_CryptographicLibrary, uTPLb_Codec, //Componentes LockBox
  System.SysUtils //FreeAndNil
  ;

const
  Key = 'ValorChave'; //Valor chave para Encriptar e Decriptar(Use um seu)


  function encriptar(const Valor :String):String;
  function decriptar(const Valor :String):String;

implementation

function encriptar(const Valor :String):String;
var
  CryptoLib: TCryptographicLibrary;
  Codec: TCodec;
begin
  Result := '';
  CryptoLib := TCryptographicLibrary.Create(nil);
  Codec := TCodec.Create(nil);
  try
    Codec.CryptoLibrary := CryptoLib;
    Codec.StreamCipherId := 'native.StreamToBlock';
    Codec.BlockCipherId := 'native.AES-256'; //Encriptação AES 256 bits
    Codec.ChainModeId := 'native.CBC';

    Codec.Reset;
    Codec.Password := Key; //Atribuindo a chave para a Criptografia
    Codec.EncryptString(Valor, Result, TEncoding.UTF8);
  finally
    FreeAndNil(CryptoLib);
    FreeAndNil(Codec);
  end;
end;

function decriptar(const Valor :String):String;
var
  CryptoLib: TCryptographicLibrary;
  Codec: TCodec;
begin
  Result := '';
  CryptoLib := TCryptographicLibrary.Create(nil);
  Codec := TCodec.Create(nil);
  try
    Codec.CryptoLibrary := CryptoLib;
    Codec.StreamCipherId := 'native.StreamToBlock';
    Codec.BlockCipherId := 'native.AES-256'; //Encriptação AES 256 bits
    Codec.ChainModeId := 'native.CBC';

    Codec.Reset;
    Codec.Password := Key; //Atribuindo a chave para Decriptografia
    Codec.DecryptString(Result, Valor, TEncoding.UTF8);
  finally
    FreeAndNil(CryptoLib);
    FreeAndNil(Codec);
  end;
end;

end.

Para usar é só declarar a Unit(uCriptografia) nas Uses do projeto e chamar as funções diretamente.

sábado, 24 de setembro de 2016

DELPHI - Download Delphi and C++Builder 10.1 Berlin ISO (includes Update 1)

Site oficial: http://cc.embarcadero.com/item/30615
ID: 30615, Delphi and C++Builder 10.1 Berlin ISO (includes Update 1)
v24.0.24468.8770
Size=7,332,845,568 bytes
MD5: A85A0FBA4F8BAB121312184CDA85C198
SHA-1=3BBEE42F83054D1D3A4FD4E2E19B30C68DA9E04C

Download Aqui

segunda-feira, 19 de setembro de 2016

DELPHI - Mensagem de dialogo no centro da aplicação - Dialog message center application

Estava procurando alguma caixa de dialogo que exibe no centro da minha aplicação. Não encontrei nenhuma com alguma propriedade nesse sentido.

Ao vasculhar pela Unit dos dialogos "Vcl.Dialogs", encontrei uma função interessante que cria a caixa de dialogo e retorna um TForm, e assim me foi permitido posicionar no centro do form PAI.

Função: CreateMessageDialog

Estou compartilhando aqui com vocês.

unit uCustomMessage;

interface

uses
  Vcl.Dialogs, Vcl.Forms, System.SysUtils;

const
  mbOK = [mbOK];

type
  TCustomMessage = class
  public
    class procedure ShowCustomDlg(const Msg: string; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons);
  end;

implementation

{ TFrmMessage }

class procedure TCustomMessage.ShowCustomDlg(const Msg: string;
  DlgType: TMsgDlgType; Buttons: TMsgDlgButtons);
var
  FCustomMessage :TForm;
begin
  FCustomMessage := CreateMessageDialog(Msg, DlgType, Buttons);
  try
    FCustomMessage.Position := poMainFormCenter;
    FCustomMessage.ShowModal;
  finally
    FreeAndNil(FCustomMessage);
  end;
end;
end.


Exemplo de uso:
 TCustomMessage.ShowCustomDlg('Sua mensagem aqui', mtError, mbOK);

ou
 TCustomMessage.ShowCustomDlg('Sua mensagem aqui', mtInformation, mbOK)

e etc.

quarta-feira, 7 de setembro de 2016

DELPHI - Quebra de linha - Line break

Comando para quebrar linha do Delphi.
sLineBreak;

DELPHI - Função para retornar a versão do aplicativo(Version Info) - Function to return the application version (Version Info)

Essa função retorna a versão do aplicativo configurado no projeto do Delphi.

class function VersaoExe: String;
type
  PFFI = ^vs_FixedFileInfo;
var
  F : PFFI;
  Handle : Dword;
  Len : Longint;
  Data : Pchar;
  Buffer : Pointer;
  Tamanho : Dword;
  Parquivo: Pchar;
  Arquivo : String;
begin
  Arquivo := Application.ExeName;
  Parquivo := StrAlloc(Length(Arquivo) + 1);
  StrPcopy(Parquivo, Arquivo);
  Len := GetFileVersionInfoSize(Parquivo, Handle);
  Result := '';

  if Len > 0 then
  begin
    Data:=StrAlloc(Len+1);
    if GetFileVersionInfo(Parquivo,Handle,Len,Data) then
    begin
      VerQueryValue(Data, '\',Buffer,Tamanho);
      F := PFFI(Buffer);
      Result := Format('%d.%d.%d.%d',
        [HiWord(F^.dwFileVersionMs),
        LoWord(F^.dwFileVersionMs),
        HiWord(F^.dwFileVersionLs),
        Loword(F^.dwFileVersionLs)]
      );
    end;
    StrDispose(Data);
  end;
  StrDispose(Parquivo);
end;

DELPHI - Erro ao conectar no banco sqlite - Failed: "Sqlite3.dll not found"

Este erro estava acontecendo no delphi XE5 e 6 após tentar conectar num banco SQLITE.

Baixei a DLL em questão de vários lugares da internet e coloquei na pasta C:\Windows\System32\ para tentar resolver o problema, mas não consegui, o erro persiste.

Pesquisei no meu computador se alguma das aplicações instalada tinha essa DLL e encontrei. Realizei a cópia para System32 e SysWOW64 e obtive sucesso.

DLL utilizada: SQLite3.rar

DELPHI - FireMonkey: Clear Search Listview - Apagar Seach Listview (Mobile) - XE6

Essa Unit limpa o Search do ListView, não achei nenhuma propriedade que faça isso.

unit uClearSearch;
 
interface
 
uses
   //Declarar na Uses
   FMX.Edit, FMX.ListView;
 
type
  TClearSearch = Class helper for TListView
    procedure ClearSearchListView();
  end;
 
implementation
 
{ TClearSearch }
 
procedure TClearSearch.ClearSearchListView;
var
  SearchListView: TSearchBox;
  i: Integer;
begin
  SearchListView := nil;
  //Procura o componente Search da ListView e atribui SearchListView
  for i := 0 to Self.ComponentCount -1 do
  begin
    if (Self.Components[i] is TSearchBox) then
    begin
      SearchListView := Self.Components[i] as TSearchBox;
      break;
    end;
  end;
 
  //E aqui ele apaga o Search que ele encontrou
  if (SearchListView <> nil) then
    SearchListView.Text := '';
end;
 
end.



Modo de usar:
//Não esqueça de declarar a Unit na uses
ListView.ClearSearchListView;

SQL SERVER - Mostrar as sequences relacionado com determinada tabela - Show related sequences with given table

SQL para exibir as Sequences relacionado com uma determinada tabela e seu respectivos campos.


select 
 t.name NOME_TABELA,
 t.object_id ID_TABELA,
 c.name NOME_CAMPO,
 c.default_object_id ID_REFERENCIA,
 d.referenced_major_id ID_SEQUENCIA,
 s.name NOME_SEQUENCIA
from 
 sys.tables t
inner join sys.columns c
 on t.object_id = c.object_id and c.default_object_id <> 0
inner join sys.sql_dependencies d
 on d.object_id = c.default_object_id
inner join sys.sequences s
 on s.object_id = d.referenced_major_id
where t.name = 'TABLE_NAME' -- <--Troque 'TABLE_NAME' pelo nome da sua tabela

SQL SERVER - Select para retornar todas as tabelas e a quantidade de registros - Select to return all the tables and the number of records

Essa Select retorna todas as tabelas e a quantidade de registros de cada tabela do SQL Server.
SELECT T.NAME TABELA, P.ROWS QTDE
FROM SYS.TABLES T
INNER JOIN SYS.INDEXES I
ON I.OBJECT_ID = T.OBJECT_ID AND I.TYPE IN (0,1)
INNER JOIN SYS.PARTITIONS P
ON P.OBJECT_ID = T.OBJECT_ID AND P.INDEX_ID = I.INDEX_ID
ORDER BY T.NAME ';

FIREBIRD - Procedure para retornar todas as tabelas e a quantidade de registros - Procedure to return all the tables and the number of records

Essa procedure retorna todas as tabelas e a quantidade de registros de cada tabela do Firebird.
CREATE OR ALTER PROCEDURE SP_TABLES_RECORD_COUNT
RETURNS (TABELA VARCHAR(255), QTDE INTEGER)
AS
BEGIN
  FOR SELECT RDB$RELATION_NAME FROM RDB$RELATIONS
  WHERE RDB$SYSTEM_FLAG = 0 AND RDB$VIEW_SOURCE IS NULL
  ORDER BY RDB$RELATION_NAME
  INTO :TABELA DO
  BEGIN
    EXECUTE STATEMENT ''SELECT COUNT(*) FROM '' || :TABELA INTO :QTDE;
    SUSPEND;
  END
END;
Uso:
SELECT * FROM SP_TABLES_RECORD_COUNT

DELPHI - Atribuir parâmetros em tempo de execução ao TFDConnection - Assign parameters at runtime to TFDConnection

Formas de atribuir parâmetros em tempo de execução para o componente TFDConnection(FireDAC).
FDConnection1.Connected := False;
FDConnection1.Params.Clear;

FDConnection1.DriverName := 'MSSQL';
FDConnection1.Params.Values['DriverID'] := 'MSSQL';
FDConnection1.Params.Values['Server'] := 'SERVIDOR\SQLEXPRESS';
FDConnection1.Params.Values['Database'] := 'NOMEBD';
FDConnection1.Params.Values['User_Name'] := 'sa';
FDConnection1.Params.Values['Password'] := '123';
Outra forma:
FDConnection1.Params.Add('DriverID=MSSQL');
FDConnection1.Params.Add('Server=SERVIDOR\SQLEXPRESS');
FDConnection1.Params.Add('Database=NOMEBD');
FDConnection1.Params.Add('User_Name=sa');
FDConnection1.Params.Add('Password=123');
Mais uma forma:
FDConnection1.ConnectionString := 'Database=NOMEDB;User_Name=sa;Password=123;Server=SERVIDOR\SQLEXPRESS;DriverID=MSSQL';

segunda-feira, 29 de agosto de 2016

SQL SERVER - Mostrar as sequences relacionado com determinada tabela - Show related sequences with given table

SQL para exibir as Sequences relacionado com uma determinada tabela e seu respectivos campos.


select 
 t.name NOME_TABELA,
 t.object_id ID_TABELA,
 c.name NOME_CAMPO,
 c.default_object_id ID_REFERENCIA,
 d.referenced_major_id ID_SEQUENCIA,
 s.name NOME_SEQUENCIA
from 
 sys.tables t
inner join sys.columns c
 on t.object_id = c.object_id and c.default_object_id <> 0
inner join sys.sql_dependencies d
 on d.object_id = c.default_object_id
inner join sys.sequences s
 on s.object_id = d.referenced_major_id
where t.name = 'TABLE_NAME' -- <--Troque 'TABLE_NAME' pelo nome da sua tabela

quinta-feira, 25 de agosto de 2016

DELPHI - Comando para redução de memória - Command to memory reduction

Quando você cria uma aplicação Delphi, tudo é um objeto, o Formulário é um objeto, cada objeto ocupa um espaço da memória gerenciado pelo programa após ser instanciado. E todo objeto após ser utilizado deve ser destruído para que esta memória seja liberada…

O que a maioria dos programadores não sabem é que, especificamente em Delphi que não existe “Coletor de Lixo de memória” como na plataforma .NET. Existe uma memória residual que nunca é liberada mesmo que você destrua todos os objetos que instanciar, porque é uma parta da memória que é administrada pelo próprio Sistema operacional. Se você deixar o seu aplicativo aberto, e efetuar diversas ações que interajam com as APIs do Windows ou DLL externas, trabalhar multi-camadas através de sockets…. Ou mesmo fazer movimentos simples como minimizar ou maximizar sua aplicação… Você perceberá que memória reservada no gerenciador de tarefas para o processo do seu executável crescerá. E muitos destes movimentos como maximiza e minimizar, é a parte não gerenciável da memória de sua aplicação pois ela ocorre na própria interação do Sistema Operacional com sua aplicação.

Este procedimento localiza o processo da aplicação, e limpa toda memória residual…

procedure TrimAppMemorySize;
var
  MainHandle : THandle;
begin
  try
    MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
    SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF);
    CloseHandle(MainHandle);
  except
  end;
  Application.ProcessMessages;
end;
Retirado de: http://www.agnaldocarmo.com.br/home/comando-milagroso-para-reducao-de-memoria-delphi/