Ir al contenido



Foto

Crear evento que detecte cambio en un TListBox


  • Por favor identifícate para responder
5 respuestas en este tema

#1 samupe

samupe

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 27 octubre 2018 - 02:43

Hola,

 

Estoy intentando crear un evento que detecte un cambio en un ListBox y me actualice una etiqueta. Este es el código que tengo, compila bien pero al ejecutarlo me lanza una excepción diciendo que no encuentra la clase TListBox:


delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Windows;
  9.  
  10. type
  11.  
  12. { TChListBox }
  13. TChListBox = class(TListBox)
  14. private
  15. FOnItemCountChange: TNotifyEvent;
  16. protected
  17. procedure WndProc(var Message: TMessage); override;
  18. published
  19. property OnItemCountChange: TNotifyEvent read FOnItemCountChange write FOnItemCountChange;
  20. end;
  21.  
  22. { TForm1 }
  23. TForm1 = class(TForm)
  24. Button1: TButton;
  25. Label1: TLabel;
  26. ListBox1: TChListBox;
  27. procedure Button1Click(Sender: TObject);
  28. procedure FormCreate(Sender: TObject);
  29. procedure OnChangeListBox(Sender: TObject);
  30. private
  31.  
  32. public
  33.  
  34. end;
  35.  
  36. var
  37. Form1: TForm1;
  38.  
  39. implementation
  40.  
  41. {$R *.lfm}
  42.  
  43. { TForm1 }
  44.  
  45. procedure TForm1.FormCreate(Sender: TObject);
  46. begin
  47. ListBox1 := TChListBox.Create(Self);
  48. ListBox1.Parent := Self;
  49. ListBox1.OnItemCountChange := @OnChangeListBox;
  50. end;
  51.  
  52.  
  53.  
  54. procedure TForm1.Button1Click(Sender: TObject);
  55. begin
  56. ListBox1.Items.Add('Elemento');
  57. end;
  58.  
  59. procedure TForm1.OnChangeListBox(Sender: TObject);
  60. begin
  61. Label1.Caption:= 'Número de elementos: '+ IntToStr(ListBox1.Count);
  62. end;
  63.  
  64.  
  65. procedure TChListBox.WndProc(var Message: TMessage);
  66. var
  67. OldCount: Integer;
  68. begin
  69. case Message.Msg of
  70. LB_ADDSTRING, LB_INSERTSTRING, LB_DELETESTRING:
  71. begin
  72. // for LB_(ADD|INSERT)STRING, Message.Result is the 0-based
  73. // index of the added string, or a LB_ERR... error code.
  74. //
  75. // for LB_DELETESTRING, Message.Result is the number of items
  76. // remaining in the list, or a LB_ERR... error code.
  77. //
  78. inherited;
  79. if (Message.Result >= 0) and Assigned(FOnItemCountChange) then
  80. FOnItemCountChange(Self);
  81. end;
  82. LB_RESETCONTENT:
  83. begin
  84. // the Message.Result is not used in this message.
  85. //
  86. OldCount := Items.Count;
  87. inherited;
  88. if (OldCount <> Items.Count) and Assigned(FOnItemCountChange) then
  89. FOnItemCountChange(Self);
  90. end;
  91. else
  92. inherited;
  93. end;
  94. end;
  95.  
  96. end.


  • 0

#2 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 554 mensajes
  • LocationEspaña

Escrito 29 octubre 2018 - 01:45

Pues a mi me funciona perfectamente tu código, con una excepción: Hay que asignar el evento al listbox sin poner la arroba delante:


php
  1.  ListBox1.OnItemCountChange := OnChangeListBox;

¿Qué versión de Delphi estás usando, por si fuera otro problema?

 

Saludos


Editado por ELKurgan, 29 octubre 2018 - 01:45 .

  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.286 mensajes
  • LocationArgentina

Escrito 29 octubre 2018 - 05:40

Pues a mi me funciona perfectamente tu código, con una excepción: Hay que asignar el evento al listbox sin poner la arroba delante:


php
  1.  ListBox1.OnItemCountChange := OnChangeListBox;

¿Qué versión de Delphi estás usando, por si fuera otro problema?

 

Saludos

 

Creo, por la directiva de compilación, que se trata de Lazarus/CodeTyphon.

No tengo a mano Lazarus en estos momentos como para ver cual es el problema.

 

Saludos,


  • 0

#4 samupe

samupe

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 29 octubre 2018 - 02:57

Pues a mi me funciona perfectamente tu código, con una excepción: Hay que asignar el evento al listbox sin poner la arroba delante:


php
  1.  ListBox1.OnItemCountChange := OnChangeListBox;

¿Qué versión de Delphi estás usando, por si fuera otro problema?

 

Saludos

Hola, estoy usando Lazarus 1.8.4 de 32 bits. En el momento que le quito la @ me indica Error: Wrong number of parameters specified for call to "OnChangeListBox"


  • 0

#5 Gaston

Gaston

    Advanced Member

  • Miembros
  • PipPipPip
  • 103 mensajes

Escrito 29 octubre 2018 - 07:46

Hola Samupe, es que la clase TListBox no existe, TListBox es un tipo de clase TCustomListBox y es ésta la que deberías utilizar.

Respecto del @ debes incluirla para invocar al evento, es una de las diferencias entre Lazarus y Delphi, en Lazarus se utiliza la arroba, en Delphi no.

 

Saludos.


  • 0

#6 ELKurgan

ELKurgan

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 554 mensajes
  • LocationEspaña

Escrito 30 octubre 2018 - 12:09

Cierto, no había caído en que era Lazarus...

 

Bueno, lo dicho, en Delphi si funciona bien

 

Saludos

 


  • 0