Toon posts:

[C++] Sender van Event gebruiken?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb ooit een keer in Borland Delphi gebruik gemaakt van de Sender parameter die in een event wordt meegegeven. Erg handig, want zo kun je één event maken voor meerdere componenten. Bijvoorbeeld één OnClick voor 10 buttons. Aan de Sender parameter wordt dan meegegeven op welke button er is geklikt als het event wordt aangeroepen. In Delphi ging dit vrij simpel (zoiets dacht ik):

Delphi:
1
2
3
4
if (Sender = Button1) then
  doe dit;
else
  doe dat;


In C++ lijkt dit dus helemaal niet te werken. Iemand die toevallig wel weet hoe het moet? BVD

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10-04 16:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gebruik je wel de == om te vergelijken, ipv de = die is bedoeld om toe te kennen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ja, dit was het delphi voorbeeld. :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10-04 16:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Tja als je zo weinig info geeft wordt het giswerk natuurlijk :). Wat lukt er niet? Welke libraries gebruik je? Wat is je code? Welke foutmeldingen krijg je eventueel?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Moet je niet eerst checken of sender wel een button is, en zoja, deze casten naar het type TButton, en dan pas vergelijken ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
De code, zoals ik in de startpost gaf, werkt wel in Borland Builder 4 (op school getest) maar dus niet in Borland Builder 6 thuis. Waarschijnlijk geen probleem wat de code betreft dus. Misschien dat nieuw installeren helpt of een andere compiler. Wazig... 8)7

[ Voor 4% gewijzigd door Verwijderd op 17-02-2006 15:54 ]


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 09-04 18:58

MBV

En ik neem aan dat je C++ Builder bedoelt? Qt bijv werkt heel anders ;). Bij mijn weten moet dat kunnen, aangezien dat is afgeleid van Delphi. Kijk anders eens in de man-pages, zal vast wel vermelden hoe je een sender kan opvragen :)

En pas op voor onwijs lange if/else of switch/case constructies. Vaak is het dan handiger om tig functies te hebben, die allemaal naar 1 functie voor het centrale stuk verwijzen. Is beter onderhoudbaar, omdat je geen vage constructies toepast die tegen het principe van de toolkit ingaan :)

[ Voor 39% gewijzigd door MBV op 17-02-2006 19:06 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
't Is een OO anti-pattern, dus ik kan me goed voorstellen dat het eruit gehaald is.

Hoe wil je de unit test schrijven? Als Sender nooit Button1 is?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
MSalters schreef op vrijdag 17 februari 2006 @ 21:46:
't Is een OO anti-pattern, dus ik kan me goed voorstellen dat het eruit gehaald is.
Op wat heb je het ?

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10-04 16:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik neem aan dat ie doelt op het doorrouten van alle button-click events naar dezelfde functie, en in die functie controleren welke knop nou eigenlijk ingedrukt is.

@MBV hieronder: ik denk dat je het een beetje verkeerd interpreteert, whoami reageert op MSalters, en die bedoel ik dus met "ie". En MSalters zegt precies hetzelfde als jij ;). Ik ben het er ook mee eens overigens.

[ Voor 41% gewijzigd door .oisyn op 18-02-2006 22:21 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 09-04 18:58

MBV

@oisyn: dat vind ik nou eigenlijk het meest zinloze wat je kan doen: het wordt al netjes voor je gefilterd, je gooit het in een bak, en gooit het vervolgens op de meest onoverzichtelijke manier door. Behalve met een rekenmachine ofzo kan ik me daar absoluut niks bij voorstellen...

Verwijderd

Topicstarter
Woow, zo leer ik ook nog wat. Morgen maar eens een flink potje googlen op al die thermen die hier voorbij komen gevliegen. Maar syntactisch ben ik er in ieder geval uit hoor.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 09-04 18:58

MBV

wat bedoel je met syntactisch? Hoe krijg je je sender dan terug? en gebruik je idd de borland builder toolkit?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Meegeven van de Sender. In een goed OO ontwerp weet een event handler niet wie de Sender is, dus waarom zou een OO framework dan moeite moeten doen om een Sender parameter te initialiseren?

Bovendien zit je dan met het probleem dat de Sender dan ook nog eens identificeerbaar moet zijn. Dat is dus niet altijd makkelijk, als sommige events van het OS (buiten het framework) komen, sommige asynchroon, etcetera. De Sender kan soms al niet meer bestaan, en dan is een pointer niet meer geschikt als identifier. Kortom, erg veel werk voro iets wat overbodig zou moeten zijn.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Toch zijn er situaties te verzinnen waarin het weldegelijk nuttig is. Het is misschien niet strikt OO, maar dat wil niet zeggen dat het onzinnig is. Als een manier van programmeren je meer tegen gaat houden dan dat het je helpt, dan is misschien tijd om tegen de regels te zondigen. Daarom is het bijvoorbeeld in Qt (een C++ framework) wel mogelijk. Het wordt spaarzaam gebruikt, maar het kan onnodige omwegen voorkomen. Dat is vervolgens voor de meest voorkomende situaties weer netjes in een class geencapsuleerd (QSignalMapper) zodat je in de praktijk zelf niet zo vaak gebruik zal hoeven maken van de sender, maar QSignalMapper gebruikt hem op de achtergrond wel.

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


Verwijderd

Topicstarter
MBV schreef op zaterdag 18 februari 2006 @ 23:26:
wat bedoel je met syntactisch? Hoe krijg je je sender dan terug? en gebruik je idd de borland builder toolkit?
C++:
1
2
3
4
5
6
7
void __fastcall TForm1::ImageClick(TObject *Sender)
{
  if (Sender == Image1)
      Image1->Picture->Bitmap->LoadFromFile("Pic1.jpg");
  if (Sender == Image2)
      Image2->Picture->Bitmap->LoadFromFile("Pic1.jpg");
}


Op deze manier werkt het in Borland Builder 4. Alleen in Borland Builder 6, die ik thuis gebruik wil dit niet. Hij kan iets van het type TObject niet vergelijken met (weet ik zo snel niet meer).

  • Kayshin
  • Registratie: Juni 2004
  • Laatst online: 09-03-2018

Kayshin

Bl@@T @@P!!!

Daarom moet je hem dus typecasten naar een type dat gelijk is aan het type dat je controleert. Je kan bijvoorbeeld ook officieel (Misschien dat sommige compilers dit wel toestaan mits op de juiste manier gebruikt) geen TButton vergelijken met een TMemo.

Heb hier nog op school veel over gehad. (Dit is in Delphi, voor het idee. Weet zo gauw niet hoe het in c moet)

Delphi:
1
2
If (Sender is TButton) then
  showmessage((Sender AS TButton).name);

[ Voor 6% gewijzigd door Kayshin op 20-02-2006 01:22 ]

My personal videoteek: -Clique-; -NMe- is een snol!


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 06:45
je moet je sender casten naar TImage:

C++:
1
2
3
4
5
6
7
8
void __fastcall TForm1::ImageClick(TObject *Sender)
{
  TImage *Image = dynamic_cast<TImage *> (Sender);

  if (Image)
      Image->Picture->Bitmap->LoadFromFile("Pic1.jpg");

}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 10-04 16:51

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom, een TImage is toch impliciet te casten naar een TObject (TImage is een subclass van TObject)? Dus die cast is niet nodig.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1