Komponent na bazie TListbox ze zdarzeniem OnChange

0

Siemka. Pisze pierwszy swój komponent. A mianowicie na bazie TListBox chcę do niego dodać OnChange a dokładniej chcę automatycznie podliczać ilość elementów w Labelu czyli:

Label1.Caption := IntToStr(ListBox1.Items.Count) ;

Podpiąłem tą linijkę już pod zainstalowany poniższy komponent dokładnie pod jego zdarzenie OnChange, (oczywiście zamiast Listbox1 u mnie TChListbox1)ale bez efektów, nic się nie dzieje zero błędów ale i zero efektów. Jak to powinno wyglądać poprawnie? a to mój kod komponentu:

 TChListBox = class(StdCtrls.TListBox)
  private
    FItemIndex: Integer;
    FOnChange: TNotifyEvent;
    procedure CNCommand(var AMessage: TWMCommand); message CN_COMMAND;
  protected
    procedure Change; virtual;
    procedure SetItemIndex(const Value: Integer); override;
  published
    property OnChange: TNotifyEvent read FOnChange write FOnChange;
  end;

  procedure Register;

 IMPLEMENTATION

procedure TChListBox.Change;
begin
  if Assigned(FOnChange) then
    FOnChange(Self);
end;

procedure TChListBox.CNCommand(var AMessage: TWMCommand);
begin
  inherited;
  if (AMessage.NotifyCode = LBN_SELCHANGE) and (FItemIndex <> ItemIndex) then
  begin
    FItemIndex := ItemIndex;
    Change;
  end;
end;

procedure TChListBox.SetItemIndex(const Value: Integer);
begin
  inherited;
  if FItemIndex <> ItemIndex then
  begin
    FItemIndex := ItemIndex;
    Change;
  end;
end;

 procedure Register;
begin
  RegisterComponents('MyComponents',[TChListBox]);
0
procedure TChListBox.CNCommand(var AMessage: TWMCommand);
begin
  inherited;
  if (AMessage.NotifyCode = LBN_SELCHANGE) and (FItemIndex <> ItemIndex) then
  begin
    FItemIndex := ItemIndex;
    Change;
  end;
end;

Sprawdzałeś pod debuggerem czy ten kod w ogóle się wykonuje?

procedure TChListBox.SetItemIndex(const Value: Integer);
begin
  inherited;
  if FItemIndex <> ItemIndex then
  begin
    FItemIndex := ItemIndex;
    Change;
  end;
end;

Nowy indeks pozycji dostajesz w parametrze Value, więc możesz z niego skorzystać, zamiast wpisywać ItemIndex.

  protected
    procedure Change; virtual;

Ta metoda powinna się nazywać DoChange.


Zresztą, ItemIndex nie ma nic wspólnego z liczbą pozycji w kontrolce, więc Twój kod i tak nie będzie działał tak jak chcesz. Ty musisz reagować na:

  • dodanie pozycji (Items.Add),
  • wstawienie pozycji (Items.Insert),
  • usunięcie pozycji (Items.Delete),
  • wyczyszczenie całej zawartości (Items.Clear).

Jeśli chodzi o manipulację zawartością kontrolki to musisz sprawdzić w źródłach tego komponentu, w jaki sposób reaguje on na zmianę zawartości i podłączyć się pod ten mechanizm, rozbudowując jego funkcjonalność o nowe zdarzenie.

0

Dzięki za podpowiedzi :) lecz nie wszystko jest proste za pierwszym razem

0

@abrakadaber: jemu nie chodzi o zdarzenie reagowania na zmianę zaznaczenia, a na zmianę liczby pozycji w kontrolce (po dodaniu czy usunięciu jednej lub wielu pozycji). Zresztą zobacz do tego wątku - Listbox Onchange Event, component - tam ktoś rzucił mu gotowca (no, prawie gotowca).

1 użytkowników online, w tym zalogowanych: 0, gości: 1