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