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';