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...