Toon posts:

[B.Builder] event voor runtime gecreeerd array

Pagina: 1
Acties:
  • 42 views sinds 30-01-2008

Verwijderd

Topicstarter
Goedeavond allemaal,

Laat ik beginnen met de vertellen dat dit een huiswerk opdracht is, maar ik heb een specifiek probleem en ik zit echt vast.

Ik ben bezig met het maken van vier op een rij. Het is uiteindelijk de bedoeling dat het een versie wordt met een AI tegenspeler, maar dat is voor dit probleem niet zo belangrijk.

Ik heb op het moment een twee dimensionaal array gecreeerd van TShape objecten. Dit stelt het speelbord voor. Deze objecten creeer ik runtime met de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for( int i = 0; i <= 6; i++)   //6
      {
            for( int j = 0; j <= 5; j++) //5
            {
                Speelbord[i][j] = new TShape(Form1);
                Speelbord[i][j]->Parent = Form1;
                Speelbord[i][j]->Shape = stCircle;
                Speelbord[i][j]->Pen->Style = psClear;
                Speelbord[i][j]->Height = height;
                Speelbord[i][j]->Left = xPosForm;
                Speelbord[i][j]->Top = yPosForm;
                Speelbord[i][j]->Brush->Color = clGray;
                Speelbord[i][j]->Tag = i * 10 + j;
                yPosForm = yPosForm + yForm;
            }
            xPosForm = xPosForm + xForm;
            yPosForm = 6;
      }

De Tag property gebruik ik om de indexen i en j van het object achter elkaar op te slaan en die wil ik later weer gebruiken voor het MouseDown event. Het event ziet er nu zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 void __fastcall TForm1::SpeelbordMouseDown(TObject *Sender,
    TMouseButton Button, TShiftState Shift, int X, int Y)
{
      int shape;
      int x;
      int y;

      ShowMessage("mousedown event");  //debug code

      shape = ((TShape*)Sender)->Tag;
      x = shape / 10;
      y = shape % 10;
      Speelbord[x][y]->Brush->Color = clRed;
}

Het idee is dat ik van het object waarop geklikt is de Tag property uitlees. Dit splits in x en y en dan van de juiste TShape de kleur verander. Het probleem is dat dit event nooit wordt uitgevoerd. Van design time objecten weet ik hoe je een event maakt, maar bij runtime gecreeerde objecten krijg ik het niet voor elkaar. Zelfs niet als ik een enkele TShape runtime creeer ipv. een array.

Wie weet hoe ik alle array objecten met een event af kan handelen?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:13

mulder

ik spuug op het trottoir

Weet niet hoe het met BCB zit, maar maak designtime een event bv Dynamic_OnClick, en dan runtime object.OnClick = Dynamic_OnClick.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Ik snap denk ik niet precies wat je bedoelt. Je koppelt een design time event aan een runtime event, maar moet dat design time event dan ook niet bij een object horen? Zo ja, welk object dan?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:13

mulder

ik spuug op het trottoir

Je weet hoe je designtime een event aan een object moet hangen? Volgens mij is het mogenlijk dit event zowel design als runtime (zoals ongeveer beschreven) dit event aan meerdere andere objecten te hangen. Je hebt immers TObject *Sender om te zien welk object het event heeft afgevuurd.

Edit: dat event hoeft nog niet perse designtime bij dat object horen.

Maar misschien dat een C++-er hier een duidelijker antwoord op heeft?

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Een soort dummy object dus waar je design time event aan koppelt. Vraag is dan alleen nog steeds hoe ik dat event ook aan de runtime opjecten koppel, want dat lukt mij niet tot nu toe.

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:13

mulder

ik spuug op het trottoir

Neeej, geen dummy object nodig. Je heeft alleen de eventhandler te schrijven, en deze runtime te koppelen aaan het (runtime)object.

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Ik heb gisteravond nog even geprobeerd het voor elkaar te krijgen, maar het lukt niet echt. Iemand die mij wat verder kan helpen?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 21:13

mulder

ik spuug op het trottoir

Nu had ik je toch al aardig opweg geholpen dacht ik zo. Je zou Google ook eens moeten bekijken.

http://rareearth.3322.net/cbuilder/faqs/faq1.htm

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Bedankt voor de link. Dat was precies de info die ik nodig had. Achteraf is het inderdaad allemaal niet zo moeilijk en was ik zelf al een eind op weg. Je moet het alleen eerst een keer gezien of gedaan hebben. Het werkt nu en ik kan weer verder met mijn vier op een rij. Bedankt voor de hulp.

  • ntsx
  • Registratie: November 2001
  • Laatst online: 07-02-2024
Tis alweer een tijdje geleden dat dit topic gepost is maar het antwoord was te vinden op een gebroken linkje...

En ik zou toch ook graag willen weten hoe je at runtime in CBuilder een functie aan een event kunt hangen...

ik heb een vector van TShapes shapeMatrix genaamd, als ik nu hetvolgende doe

shapeMatrix[i]->OnMouseDown=sOnMouseDown;

waarbij sOnMouseDown een eigen gedefinieerde functie is, krijg ik de compiler error:

[C++ Error] mainform.cpp(40): E2034 Cannot convert 'void (* (_closure )(TObject *))(TObject *)' to 'void (_fastcall * (_closure )(TObject *,TMouseButton,TShiftState,int,int))(TObject *,TMouseButton,TShiftState,int,int)'

Hieruit maak ik min of meer op dat het functievoorschrift van mijn sOnMouseDown functie niet gelijk is aan wat het TShape object als functie accepteerd...

Heeft iemand hier ervaring mee?

[ Voor 6% gewijzigd door ntsx op 19-07-2004 22:38 ]

too fly for a white guy


  • ntsx
  • Registratie: November 2001
  • Laatst online: 07-02-2024
Sorry jongens, toen ik mijn vraag nog eens heel aandachtig doorlas, kreeg ik een ideetje...

Voor diegenen die er nog geinteresseerd in zijn:
de functie voor het onmousedown event van een TShape moet een __fastcall hebben en de volgende parameters:

(TObject *, TMouseButton, TShiftState,int c,int);

too fly for a white guy


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Spendeer de volgende keer die 12 minuten aub even voordat je kickt, en kick dan gewoon niet maar maak een nieuw topic :z

Professionele website nodig?

Pagina: 1

Dit topic is gesloten.