quarta-feira, 16 de abril de 2014

Automatizando um novo branch git

...Como prometido estou voltando a postar dicas e começarei com automatização do git.

Hoje existem varias ferramentas que fazem ou prometem fazer esta tarefa de automatizar o git, o próprio git fornece uma interface visual que pode ser acessada utilizando o comando "gitk", porem se você é como eu e gosta de suas próprias soluções então poderás automatizar os teus processos utilizando o Shell Script.

A extensão para esses arquivos ao contrario do que muitos pensam quando estão trabalhando no windows não é (*.bat) e sim (*.sh) ou seja "viva o linux", então comecemos;

Um novo branch;

 - Na criação de um novo branch, teoricamente você faria os seguintes passos;

  1. Atualizaria o seu branch local develop
  2. Apartir do seu branch local develop atualizado você criaria o seu novo branch

- Repassando esse processo para o arquivo de automatização teríamos;


- Crie um arquivo e salve o mesmo com a extensão .sh;
- Abra esse aquivo para edição;- Sete o path dos seus fontes, ex;
  • cd C:
  • cd Sistemas
  • cd MeuSistema
  • cd src
- Atualize o seu branch develop 
  • git pull (branch remoto)
- Lance uma pergunta ao usuário
  • Informe o nome do branch a ser criado
- Crie o novo branch
  • git checkout -b (novo branch)
- Segue um modelo;

# Novo branch
# Jucelio Moura

function EnquantoEnter {
echo ""
read -p "Click enter para continuar..." nothing
}
function mensagem(){
    msg=$@
    echo -e " ############# "$msg" ############# "
}

mensagem INICIANDO O PROCESSO...

# Localiza pasta dos fontes

echo
echo QUAL A DIRETORIO DE TRABALHO?
read part

mensagem SETANDO DIRETORIO $part...

cd $part:
log=$?
logMsgErro="DIRETORIO $part NAO ENCONTRADO"
if [ $log -eq 0 ];
then
mensagem SETANDO PASTA SISTEMAS...
cd Sistemas
log=$?
logMsgErro="PASTA SISTEMA NAO ENCONTRADA"
fi

if [ $log -eq 0 ];
then
mensagem SETANDO PASTA MEUSISTEMA...
cd MEUSISTEMA
log=$?
logMsgErro="PASTA MEUSISTEMA NAO ENCONTRADA"
fi

if [ $log -eq 0 ];
then
mensagem SETANDO PASTA SRC...
cd src
log=$?
logMsgErro="PASTA SRC NAO ENCONTRADA"
fi

#Seta no branch develop
if [ $log -eq 0 ];
then
mensagem SETANDO BRANCH DEVELOP...
git checkout develop
log=$?
logMsgErro="ERRO AO SETAR O BRANCH DEVELOP"
fi

#Atualiza branch develop
if [ $log -eq 0 ];
then
mensagem ATUALIZANDO BRANCH DEVELOP...
git pull (origin ou ipservidor) develop
log=$?
logMsgErro="ERRO AO ATUALIZAR O BRANCH DEVELOP"
fi

if [ $log -eq 0 ];
then
echo
echo Digite o nome do novo branch
read nome_branch
fi

#Seta o novo branch
if [ $log -eq 0 ];
then
mensagem SETANDO BRANCH $nome_branch...
git checkout -b $nome_branch
log=$?
logMsgErro="ERRO AO SETAR O NOVO BRANCH"
fi
if [ $log -eq 1 ];
then
   echo -e "\n"
echo $logMsgErro
fi

EnquantoEnter

terça-feira, 15 de abril de 2014

Mais um retorno

... Bom dia Developers, a muito tempo não posto nada no blogger, vou tentar inicia mais uma vez nas minhas madrugadas, iniciarei com Git;

- Automatização com arquivos batch
- Criar um exemplo (aplicativo em Delphi), para auxiliar a automatização 

Atenciosamente: Jucélio Moura

quinta-feira, 30 de janeiro de 2014

Trocar a classe de uma instância em runtime...

- Método

procedure TrocaInstanciaClass(Instancia: TObject; NovaClasse: TClass; Parent: twincontrol);
type
  PClass = ^TClass;
begin
  if Assigned(Instancia) and Assigned(NovaClasse)
    and NovaClasse.InheritsFrom(Instancia.ClassType)
    and (NovaClasse.InstanceSize = Instancia.InstanceSize) then
  begin
    PClass(Instancia)^ := NovaClasse;
    if NovaClasse.InheritsFrom(tcontrol) then
      begin
        tcontrol(Instancia).Parent:= nil;
        tcontrol(Instancia).Parent:= parent;
      end;
  end;

end;

- Exemplo

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMeuBotao = class(TButton) //Nova classe herdando de TButton 
  public
    procedure ShowHandle; 
  end;

  TForm1 = class(TForm)
    btn_1: TButton;
    procedure btn_1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TrocaInstanciaClass(Instancia: TObject; NovaClasse: TClass; Parent: twincontrol);
type
  PClass = ^TClass;
begin
  if Assigned(Instancia) and Assigned(NovaClasse)
    and NovaClasse.InheritsFrom(Instancia.ClassType)
    and (NovaClasse.InstanceSize = Instancia.InstanceSize) then
  begin
    PClass(Instancia)^ := NovaClasse;
    if NovaClasse.InheritsFrom(tcontrol) then
      begin
        tcontrol(Instancia).Parent:= nil;
        tcontrol(Instancia).Parent:= parent;
      end;
  end;
end;

procedure TForm1.btn_1Click(Sender: TObject);
begin
  TrocaInstanciaClass(btn_1, TMeuBotao, Self); //Troca a instância
  ShowMessage(btn_1.ClassName); //Mostra a classe
  (btn_1 as TMeuBotao).ShowHandle; //Ultiliza o metodo da nova classe
end;

{ TMeuBotao }

procedure TMeuBotao.ShowHandle;
begin
  ShowMessage(IntToStr(Self.Handle));
end;


end.

sexta-feira, 12 de julho de 2013

Colocar número da linha em um TreeView


- Em Uses adicione; UxTheme
- Em um Form coloque um componente TreeView
- No evento OnCreate do Form, coloque o código para popular o TreeView;

  function CriaValor: string;
  begin
    Randomize;
    Result:= IntToStr(Random(MaxInt))+' - '+IntToStr(Random(MaxInt))+' - '+IntToStr(Random(MaxInt))+' - '+IntToStr(Random(MaxInt));
  end;
var
  node: array[0..2] of TTreeNode;
  nodeFilho: array[0..2] of TTreeNode;
  i, j: integer;
begin
  for I := Low(node) to High(node) do
    begin
      node[i]:= tv1.Items.Add(nil, CriaValor);
      for j := 0 to 10 do
        begin
          tv1.Items.AddChild(node[i], CriaValor);
        end;
    end;
  tv1.FullExpand;

- No evento OnAdvancedCustomDrawItem adicione:

  function Tab(p_value: Integer): string;
  var
    i: Integer;
  begin
    for I := 0 to p_value do
      Result:= Result + ' ';
  end;
var
  wl_NodeRect: TRect;
  wl_NodeTextRect: TRect;
  wl_Text: string;
  wl_ThemeData: HTHEME;
  wl_TreeItemState: Integer;
begin
  if Stage = cdPrePaint then
  begin
    wl_NodeRect := Node.DisplayRect(False);
    wl_NodeTextRect := Node.DisplayRect(True);

    if (cdsSelected in State) and Sender.Focused then
      wl_TreeItemState := TREIS_SELECTED
    else
      if (cdsSelected in State) and (cdsHot in State) then
        wl_TreeItemState := TREIS_HOTSELECTED
      else
        if cdsSelected in State then
          wl_TreeItemState := TREIS_SELECTEDNOTFOCUS
        else
          if cdsHot in State then
            wl_TreeItemState := TREIS_HOT
          else
            wl_TreeItemState := TREEITEMStateFiller0;

    if wl_TreeItemState <> TREEITEMStateFiller0 then
    begin
      wl_ThemeData := OpenThemeData(Sender.Handle, VSCLASS_TREEVIEW);
      DrawThemeBackground(wl_ThemeData, Sender.Canvas.Handle, TVP_TREEITEM, wl_TreeItemState,
        wl_NodeRect, nil);
      CloseThemeData(wl_ThemeData);
    end;

    SetBkMode(Sender.Canvas.Handle, TRANSPARENT);
    SetTextColor(Sender.Canvas.Handle, clBlack);

    wl_Text := Tab(10)+Node.Text;
    wl_NodeTextRect.Right:= tv1.Width;
    Sender.Canvas.TextRect(wl_NodeTextRect, wl_Text,
      [tfVerticalCenter, tfSingleLine, tfEndEllipsis, tfLeft]);

    wl_Text:= 'Linha '+IntToStr(Node.AbsoluteIndex + 1);
    SetBkMode(Sender.Canvas.Handle, OPAQUE);
    SetTextColor(Sender.Canvas.Handle, $008AC5FF);
    Sender.Canvas.TextRect(wl_NodeRect, wl_Text,
      [tfVerticalCenter, tfSingleLine, tfEndEllipsis, tfLeft]);
  end;

  PaintImages := False;
  DefaultDraw := False;


end;

Atenciosamente: Jucélio Moura.

quinta-feira, 21 de fevereiro de 2013

Busca de endereço por CEP

...Tive pesquisando relacionado a consulta de endereços por CEP, e com o resultado de minha pesquisa desenvolvi um pequeno componente que faz isso:


- Fonte do exemplo acima:


segue o link do componente e do exemplo: Download.

At+, amigos.

sábado, 16 de fevereiro de 2013

CRFB Revisado 16/02/2013

...Olá Delphianos, estava vendo uns arquivos antigos e deparei-me com o projeto CRFB, resolvi testa-lo e observei que algumas funções não mais funcionavam, então resolvi revisar o seu código, agora ficou melhor, quem se interessar pelo fonte e o componente segue o link: CRFB Revisado 16/02/2013

quarta-feira, 23 de janeiro de 2013

Instância como parâmetro


... Caros colegas, nessa semana estive com uma questão que gostaria de compartilhar;

Tenho um formulário, dentro do mesmo tenho um botão e no onClick do botão tenho o seguinte código;

var
  MeuBotao: TButton;
begin
  MeuBotao:= TButton.create(Self)
  try
    MeuBotao.parent:=  Self;
    MeuBotao.Caption:= 'Jucelio Moura';
    MostraCaptionBotao(MeuBotao); 
  finally
    MeuBotao.free;
  end;
end;

Tenho uma procedure chamada MostraCaptionBotao

procedure MostraCaptionBotao(ABotao: TButton);
begin
  ShowMessage(ABotao.Caption);
end;

Até ai tudo bem, porém sei que posso instanciar TButton dessa forma;

with TButton.Create(Self) do
  begin
    try
      Parent:= Self;
      Caption:= 'Jucelio Moura';
      MostraCaptionBotao(?); 
    finally
      free;
    end;
  end;

- O que passo como parâmetro para MostraCaptionBotao ?, Self nesse caso é o formulário.

- A solução é a seguinte;

with TButton.Create(Self) do
  begin
    try
      Parent:= Self;
      Caption:= 'Jucelio Moura';
      MostraCaptionBotao(TButton(Self.Components[ComponentIndex]));
    finally
      Free;
    end;
  end;


terça-feira, 15 de janeiro de 2013

Manipulação de mensagens do windows...

... Olá galerinha, que ama programação, estou voltando, consegui organizar meu tempo, será um compromisso atualizar o blog...

- Começarei com um pequeno exemplo de utilização de mensagens do windows;

(O segundo form é chamado em modal, utilizarei mensagens para ativar métodos da tela anterior).

- Crie dois forms e uma unit.











 

- Fonte do exemplo:


unit u_principal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, u_ativa, u_constantes;

type
  Tf_principal = class(TForm)
    btn_abrirForm: TButton;
    lbl_tempo: TLabel;
    tmr_tempo: TTimer;
    lbl_Mensagem: TLabel;
    edt_mensagem: TEdit;
    procedure tmr_tempoTimer(Sender: TObject);
    procedure btn_abrirFormClick(Sender: TObject);
  private
    { Private declarations }
    procedure AtivaDesativaCronometro(var Msg: TMessage); message WM_ATIVACRONOMETRO;
    procedure DesativaDesativaCronometro(var Msg: TMessage); message WM_DESATIVACRONOMETRO;
    procedure MensagemRecebida(var Msg: TMessage); message WM_ENVIAMENSAGEM;
  public
    { Public declarations }
  end;

var
  f_principal: Tf_principal;

implementation

{$R *.dfm}

procedure Tf_principal.AtivaDesativaCronometro(var Msg: TMessage);
begin
  tmr_tempo.Enabled:= True;
end;

procedure Tf_principal.btn_abrirFormClick(Sender: TObject);
begin
  Tf_ativa.CriaForm(Self.Handle);
end;

procedure Tf_principal.DesativaDesativaCronometro(var Msg: TMessage);
begin
  tmr_tempo.Enabled:= False;
end;

procedure Tf_principal.MensagemRecebida(var Msg: TMessage);
begin
  msg.Result := 1;
  edt_mensagem.Text:= PChar(msg.lParam);
end;

procedure Tf_principal.tmr_tempoTimer(Sender: TObject);
begin
  lbl_tempo.Caption:= IntToStr(StrToIntDef(lbl_tempo.Caption, 0) + 1);
end;

end.


unit u_ativa;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, u_constantes;

type
  Tf_ativa = class(TForm)
    btn_AtivaCronometro: TButton;
    btn_mandaMensagem: TButton;
    edt_mensagem: TEdit;
    procedure btn_AtivaCronometroClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn_mandaMensagemClick(Sender: TObject);
  private
    FHandleAnterior: THandle;
    FStatusCronometro: Boolean;
    procedure SetHandleAnterior(const Value: THandle);
    procedure SetStatusCronometro(const Value: Boolean);
    { Private declarations }
  public
    { Public declarations }
    class procedure CriaForm(const AHandle: THandle);
    property HandleAnterior: THandle read FHandleAnterior write SetHandleAnterior;
    property StatusCronometro: Boolean read FStatusCronometro write SetStatusCronometro default False;
  end;

var
  f_ativa: Tf_ativa;

implementation

{$R *.dfm}

{ TForm2 }

procedure Tf_ativa.btn_AtivaCronometroClick(Sender: TObject);
begin
  StatusCronometro:= not StatusCronometro;
  if StatusCronometro then  
    SendMessage(HandleAnterior, WM_ATIVACRONOMETRO, 0, 0)
  else
    SendMessage(HandleAnterior, WM_DESATIVACRONOMETRO, 0, 0)
end;

procedure Tf_ativa.btn_mandaMensagemClick(Sender: TObject);
begin
  SendMessage(HandleAnterior, WM_ENVIAMENSAGEM, 0, DWORD(PChar(Trim(edt_mensagem.Text))));
end;

class procedure Tf_ativa.CriaForm(const AHandle: THandle);
begin
  with Self.Create(Application) do
    begin
      try
        HandleAnterior:= AHandle;
        ShowModal;
      finally
        Free;
      end;
    end;
end;

procedure Tf_ativa.FormCreate(Sender: TObject);
begin
  FStatusCronometro:= False;
end;

procedure Tf_ativa.SetHandleAnterior(const Value: THandle);
begin
  FHandleAnterior := Value;
end;

procedure Tf_ativa.SetStatusCronometro(const Value: Boolean);
begin
  FStatusCronometro := Value;
end;

end.


unit u_constantes;

interface

uses
  Messages;

const
  WM_ATIVACRONOMETRO = WM_APP + 500;
  WM_DESATIVACRONOMETRO = WM_APP + 501;
  WM_ENVIAMENSAGEM = WM_APP + 502;

implementation

end.

>> Qualquer duvida é só postar..., fiz esse post com um pouco de pressa, tentarei melhorar nos próximos, obrigado, até a próxima...







quarta-feira, 26 de setembro de 2012

Class Helpers Delphi

Em palavras simples, Class Helper é uma construção que estende uma classe através da introdução de novos métodos na classe helper. Class Helper permite que você estender a classe existente sem modificar-lo ou herdar da mesma.


unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls;

type
  TMinhaData = class helper for TMonthCalendar
  public
    function DataH(data: TDateTime): string;
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    MonthCalendar1: TMonthCalendar;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


{ TMinhaData }

function TMinhaData.DataH(data: TDateTime): string;
begin
  Result:= FormatDateTime('dd/mm/yyyy', data);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(MonthCalendar1.DataH(now));
end;

end.

sexta-feira, 21 de setembro de 2012

quinta-feira, 20 de setembro de 2012

versão 2.0 CRFB

... Galera já criei a versão 2.0 do componente CRFB, vejam;


na versão 3 vou incluir eventos, e novas propriedades, até a próxima...

quarta-feira, 19 de setembro de 2012

Consultar cadastro Receita Federal

...Galera estava brincando com Delphi e comecei a desenvolver um componente para consulta de cadastros de contribuintes na Receita Federal do Brasil, vejam:

https://www.box.com/s/7v4c7frdmvq6kay2s25p

terça-feira, 11 de setembro de 2012

Apresentação componentes delphi

Made in delphi, galera segue link de uma apresentação sobre componentes que criei:

https://docs.google.com/presentation/pub?id=1T9XVeDCZ5I6CHuXucGxvbhF2bTJe4VMl7GkQA4QLtDU&start=true&loop=true&delayms=3000

quarta-feira, 11 de julho de 2012

Nova versão (CongelaW)

... Olá galera nesse post irei disponibilizar uma nova versão do componente CongelaW, onde inclui uma propriedade chamada [Intensidade], onde o usuário poderá indicar a intensidade da tela, essa versão faz chamada somente Show Modal.





... e uma nova chamada para o formulário...






... qualquer duvida postem.


Link para download: https://www.box.com/s/6a7d6a319fcf3d6e86a9

terça-feira, 10 de julho de 2012

ShowModal efeito web (Delphi)


... Oi galera quem nunca viu um modal estilo web?






...criei um componente que faz esse efeito, até agora testei com Show Modal, ainda não tive tempo para aperfeiçoa-lo para chamada show, mas sei que funciona, qualquer duvida comentem.




Link para download: https://www.box.com/s/f2a30d13478e784db2e6


Atenciosamente: Jucelio Moura. 

segunda-feira, 2 de julho de 2012

Verificar status de um cadastro...

...Ola galera vou disponibilizar um pequeno componente que criei para verificação do status de um cadastro...











link para download: https://www.box.com/s/a43ec7d570fa7bba303b



quinta-feira, 21 de junho de 2012

Identificar componente ao passar o mouse por cima do mesmo


> Crie um tipo [Record]


  TRectControles = record
    uRect: TRect;
    uControle: TControl;
  end;


> Em [private], crie um array dinâmico do tipo [TRectControles], um método, para pegar a posição inicial dos controles [AtualizaPosicaoControles], e um método para retornar informações sobre o controle [ConsultaControle]  


  private
    { Private declarations }
    vp_Rect: array of TRectControles;
    procedure AtualizaPosicaoControles;
    function  ConsultaControle: string;

 [implementation]


// AtualizaPosicaoControles
procedure TForm1.AtualizaPosicaoControles;
var
  vl_i, vl_TamVetor: Integer;
begin
  for vl_i := 0 to Self.ComponentCount - 1 do
    begin
      if Components[vl_i].InheritsFrom(TControl) and (Components[vl_i].ClassType <> TForm) then
        begin
          vl_TamVetor:= Length(vp_Rect);
          SetLength(vp_Rect, vl_TamVetor + 1);
          with vp_Rect[High(vp_Rect)] do
            begin
              uRect:= TControl(Components[vl_i]).BoundsRect;
              uControle:= TControl(Components[vl_i]);
            end;
        end;
    end;
end;


// ConsultaControle
function TForm1.ConsultaControle: string;
  function PosMouseForm: TPoint;
  var
   vl_ponto: Tpoint;
  begin
    vl_ponto:= Self.ClientOrigin;
    with vl_ponto do
      begin
        x:= Mouse.CursorPos.x - x;
        y:= Mouse.CursorPos.y - y;
        if (x < 0) or (x > Self.Width) or (y < 0) or (y > Self.Height) then
         begin
           y:= -1;
           x:= -1;
         end;
      end;
    Result:= vl_ponto;
  end;
Var
 vl_mp : TPoint;
 vl_i: Integer;
 vl_ClassRef: TClass;
begin
  vl_mp:= PosMouseForm;
  for vl_i := 0 to Length(vp_Rect) - 1 do
    begin
     If PtInRect(vp_Rect[vl_i].uRect, vl_mp) Then
      Begin
        if vp_Rect[vl_i].uControle <> nil then
          begin
            vl_ClassRef := vp_Rect[vl_i].uControle.ClassType;
            with vp_Rect[vl_i].uControle do
              begin
                while vl_ClassRef <> nil do
                  begin
                    Result:= Result + vl_ClassRef.ClassName + #13;
                    vl_ClassRef := vl_ClassRef.ClassParent;
                  end;
                ShowHint:= True;
                Hint:= Result;
              end;
            Exit;
          end;
      End;
    end;
end;


> No evento [onCreate] do Form;
procedure TForm1.FormCreate(Sender: TObject);
begin
  AtualizaPosicaoControles;
end;


> Coloque um componente TTime no Form com intervalo = 1 e Enable = True, no evento [onTimer];
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  ConsultaControle;
  AtualizaPosicaoControles;
end;