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