GARANTIR DESCONTO

Fórum listbox runtime com varios eventos em unit #269094

17/02/2005

0

Tenho está unit abaixo que tenho fora do projeto( para auxiliar).
Nesta unit crio um listbox e adiciono vários eventos...so que nao estou conseguindo.
Quero adicionar os eventos onDrawItem/onDragOver/onDragDrop/onclick...nao estou falando para me ensinar como fazer dragdrop
quero apenas fazer funcionar ele chamar meu metodo....



MinhaUnit.pas
============================================================
procedure CriaListbox(form1: TForm);
begin
listbox:= TListBox.Create(Form1);
Parent := Form1;

listbox.onDrawItem:= desenhaItem;
listbox.onClick := clicou;
listbox.onDragDrop := dragdrop;


end;

procedure desenhaItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
Pinta item do listbox

end;

procedure dragdrop
..
.
.
.


procedure clicou
.....
.
.
.


Delphi_open

Delphi_open

Responder

Posts

17/02/2005

Massuda

Devido a detalhes de baixo nível relacionados com o modo que objetos são implementados em Pascal/Delphi, tratadores de eventos devem ser obrigatoriamente métodos de uma classe. Assim
procedure desenhaItem(...);
begin
  ...
end;

procedure dragdrop(...);
begin
  ...
end;

procedure  clicou(...);
begin
  ...
end;
não servem como tratadores de evento.

Para contornar esse problema/limitação, você poderia criar uma classe derivada de TListBox que implementa o seu tratamento desses eventos... mas, ao inves de implementar os tratadores desses eventos, você pode dar um override nos métodos que geram esse evento. Por exemplo
type
  TMeuListBox = class(TListBox)
  protected
    procedure Click; override;
    procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override;
  end;
Note que sua procedure CriaListBox poderia criar um TMeuListBox no luga do TListBox que o efeito seria o que você deseja.

Tem um problema apenas: omiti o tratamento de drag&drop porque não tenho certeza se a procedure DragDrop (que gera OnDragDrop) é virtual. Verifico e depois completo isto se for necessário.


Responder

Gostei + 0

17/02/2005

Massuda

... omiti o tratamento de drag&drop porque não tenho certeza se a procedure DragDrop (que gera OnDragDrop) é virtual.
A procedure DragDrop é virtual, então você poderia implementar seu listbox personalizado assim:
type
  TMeuListBox = class(TListBox)
  protected
    procedure Click; override;
    procedure DragDrop(Source: TObject; X, Y: Integer); override;
    procedure DrawItem(Index: Integer; Rect: TRect;
      State: TOwnerDrawState); override;
  end;
...
procedure TMeuListBox.Click;
begin
  inherited;

  // seu código aqui
end;

procedure TMeuListBox.DragDrop(Source: TObject; X, Y: Integer);
begin
  inherited;

  // seu código aqui
end;

procedure TMeuListBox.DrawItem(Index: Integer; Rect: TRect;
  State: TOwnerDrawState);
begin
  inherited;

  // seu código aqui
end;



Responder

Gostei + 0

28/03/2005

Diogoalles

Olá Massuda e Dephi_open,
li este tópico de voces e estou tentando anexar uma ideia no que preciso, se puderem deem uma olhada no topico abaixo e se tiverem qq sugestão agradeço


[url]http://forum.clubedelphi.net/viewtopic.php?t=60550[/url]

abraço
Diogo


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar