[Delphi] TListView OnSelectItem-procedure overriden

Pagina: 1
Acties:

  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Hallo!

Ik probeer in een TListView-descendant een OnSelectItem-event te maken, maar ik kan niet zo duidelijk zien hoe ik dan de goede procedure moet overriden.

Ik zie dat FOnSelectItem wordt bekeken in
procedure TCustomListView.CNNotify(var Message: TWMNotify);
in unit ComCtrls, maar moet ik dan die hele CNNotify overriden? Die ziet er namelijk nogal eng uit, en het lijkt me dat die wel vaker wordt aangeroepen.

Ik doe vast iets fout.

-Pelle

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

OnSelectItem is een property waarin je de method aangeeft die aangeroepen moet worden op het moment dat je een item wilt selecteren. Als het goed is heeft de TListview een SelectItem method welke je kan overriden.


Edit: ok, bovenstaande klopt dus niet. Die method heeft de TListview niet. Je doet dus niks fout wat dat betreft ;) Je zult echt met die functie aan de slag moeten. Waarom wil je eigenlijk de OnSelectItem overriden?

Overigens: ik heb je er volgens mij al eens op gewezen dat het niet nodig is je nick of naam onder je post te zetten. Aangezien je nick al naast je post staat en je je echte naam in je profiel staat is dat nogal overbodig.

[ Voor 21% gewijzigd door Creepy op 06-04-2005 16:54 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Ik wil hem overriden omdat ik een afgeleide van een TListView wil maken met een ingebouwde ClientDataSet erin. Nu wil ik dat de CDS verspringt zodra er een ander item wordt geselecteerd. (kan met de muis, met het toetsenbord of whatever.)

Ik wil dus bij wijze van spreken in mijn component zelf een implementatie schrijven voor het OnSelectItem-event.

Verwijderd

Is niet eng, je hoeft alleen maar het deel wat je wilt vervangen te overriden, de rest kun je gewoon inheriten.
Iets als:
Delphi:
1
2
3
4
5
6
7
procedure TMyListView.CNNotify(var Message: TWMNotify);
begin
  if Message.NMHdr^.code = LVN_ITEMCHANGED then begin
    // je eigen OnSelectItem vervanging
  end else
    inherited;
end;

O ja, na je eigen SelectItem routine ook nog wel even het OnSelectItem event aanroepen als die er is, en ik zag dat er ook nog een eventuele Action wordt afgehandeld...

[ Voor 20% gewijzigd door Verwijderd op 06-04-2005 17:14 ]


  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Verwijderd schreef op woensdag 06 april 2005 @ 17:07:
O ja, na je eigen SelectItem routine ook nog wel even het OnSelectItem event aanroepen als die er is, en ik zag dat er ook nog een eventuele Action wordt afgehandeld...
Oei! Gaat dat niet automatisch bij de inheritence? En zo niet, hoe doe je dat dan? (Dit heb ik bij andere overrides ook niet gedaan....)

Verwijderd

Jawel, maar niet als je 't op mijn (in dit geval niet zo handige) manier hebt gedaan: bij LVN_ITEMCHANGED komt 'ie dan nl. nooit in z'n inherited routine. :)
Op deze manier werkt 't handiger:
Delphi:
1
2
3
4
5
6
7
procedure TMyListView.CNNotify(var Message: TWMNotify);
begin
  if Message.NMHdr^.code = LVN_ITEMCHANGED then begin
    // je eigen SelectItem toevoeging
  end;
  inherited;
end;

[ Voor 4% gewijzigd door Verwijderd op 06-04-2005 17:28 ]


  • pelleke
  • Registratie: Maart 2003
  • Laatst online: 08-11-2024

pelleke

Aut viam inveniam aut faciam

Topicstarter
Nu heb ik nog een klein probleempje:

Ik krijg een error bij het overriden: Method CNNotify notfound in base class

Nu komt dat denk ik doordat ik als base class een TRzListView gebruik. Dat is een object van het type TRzCustomListView, en die verwijst naar TCustomListView. Die class heeft de procedure wel. Hoe kan ik nu overriden?

[ Voor 80% gewijzigd door pelleke op 06-04-2005 17:49 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08-05 18:37

Tomatoman

Fulltime prutser

Het is een message handler die je hiervoor gebruikt.
Delphi:
1
2
3
4
5
type
  TMyListView = class(TRzListView)
  private
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
  end;
Met inherited in de implementatie zorg je ervoor dat eventuele message handlers in de base classes niet worden overgeslagen.

[ Voor 7% gewijzigd door Tomatoman op 06-04-2005 19:14 ]

Een goede grap mag vrienden kosten.


Verwijderd

Je hebt gelijk. In TCustomListView is CNNotify gedefinieerd als private (dat is gebruikelijk), maar z'n visibility wordt in de afgeleide classes niet geraised naar bv. protected of public.
Een private method kan alleen maar gezien worden binnen dezelfde unit als waar deze gedefinieerd is, en dat zou in jouw geval inhouden dat je ComCtrls.pas zou moeten aanpassen. Niet handig...

Wat je zou kunnen doen is of de CNNotify method van TCustomListView copieren (knip/plak, makkelijk maar niet netjes), of een eigen MyCNNotify event toevoegen die naar de CN_NOTIFY message kijkt. Als je Message.Result intact laat, zou 'ie daarna door moeten gaan met de CNNotify method van TCustomListView. (niet getest, maar zou moeten werken)
Pagina: 1