Toon posts:

[BCB5] Object als parameter van functie *

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb 35 aan/uit knoppen op 1 formulier; Voor elke knop moet ie de zelfde functie uitvoeren. even eenvoudig gezegd: als hij aan is moet de caption van de HUIDIGE knop hetzij "Aan" resp "Uit" worden..

Om nou 35 van die funties onder elkaar te zetten (voor elke knop 1), lijkt mij niet zo'n nette oplossing..

Heeft iemand daar een betere methode voor..??

  • whoami
  • Registratie: December 2000
  • Laatst online: 01:57
De eventhandler van een OnClick event heeft een parameter 'Sender'. Die moet je eens bekijken.
Sender is nl. de control die verantwoordelijk is voor het triggeren van het event.

code:
1
2
3
4
void __fastcall TForm1::OnButtonClick(Object* Sender)
{
   (TButton)Sender->Caption = "Blaat";
}


Die method kan je dan aan de OnClick event hangen van al je buttons.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

En als je het vervolgens slim doet sla je een uniek ID in de Tag v/d buttons op via de property inspector, en pak je het typesafe aan:
C++:
1
2
3
4
5
6
7
8
if(Sender->InheritsFrom(__classid(TButton)))
  {
  TButton*   l_Button = (TButton*)Sender;
  switch(l_Button->Tag)
    {
    // Cases per button
    }
  }

Professionele website nodig?


Verwijderd

Topicstarter
Hmm.. ik heb het volgende geprobeerd:
Maar hij zegt 'Tag is not a member of TObject'

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall TfrmMain::imgClick(TObject *Sender)
{
  switch ((TImage)Sender->Tag)
  {
    case LIGHT_ON:
              (TImage)Sender->Canvas->Brush->Color = clSilver;
              (TImage)Sender->Canvas->Pen->Color = clGray;
              (TImage)Sender->Canvas->Pen->Width = 2;
              (TImage)Sender->Canvas->Ellipse (18-(LIGHT_SIZE/2), 18-(LIGHT_SIZE/2), LIGHT_SIZE, LIGHT_SIZE);
              (TImage)Sender->Tag = LIGHT_OFF;
    break;

    case LIGHT_OFF:
              (TImage)Sender->Canvas->Brush->Color = clLime;
              (TImage)Sender->Canvas->Pen->Color = clGreen;
              (TImage)Sender->Canvas->Pen->Width = 2;
              (TImage)Sender->Canvas->Ellipse (18-(LIGHT_SIZE/2), 18-(LIGHT_SIZE/2), LIGHT_SIZE, LIGHT_SIZE);
              (TImage)Sender->Tag = LIGHT_ON;
    break;
  }
}

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

C++:
1
switch ((TImage)Sender->Tag)

Allereerst wil je de Sender naar TImage POINTER casten dus je vergeet een sterretje. Helaas heeft de -> echter hogere precedence dan een cast, en dus komt die fout al niet boven daar je probeert de Tag van het TObject* uit te lezen. Haakjes dus:
C++:
1
switch (((TImage*)Sender)->Tag)

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Uberhaupt, als je het 300 keer gaat doen, waarom kopieer je mijn eerste code niet :z Scheelt je een hoop RSI en is extra typesafe omdat je zeker weet welk type object je hebt voordat je cast.

Professionele website nodig?


Verwijderd

Topicstarter
Het werkt..! Dank u vriendelijk..!
Pagina: 1