Avatar billede milandt Nybegynder
04. september 2004 - 23:14 Der er 9 kommentarer og
1 løsning

BC++B - Medtage vars ved onclick på img genereret under runtime

Hejsa

Borland c++ Builder 6.0

Jeg har lavet en række billeder genereret under runtime. De har alle sammen fået en onClick event - den samme. Deklareret her:

void __fastcall TFrame2::ImgClick(TObject *Sender)

Og kaldt her:

Img[i]->OnClick = ImgClick;

Jeg vil gerne ha at i skal sendes med så den funktion der bliver udført onclick afhænger af i. Jeg har prøvet på forskellige måder, blandt andet (TObject *Sender, int i) og lignende, men jeg kan simpelt hen ikke få den til at tage den med.. Hvordan gør jeg det?

Dennis
Avatar billede bertelbrander Novice
04. september 2004 - 23:22 #1
Jeg er ikke den store ekspert i BCB, men jeg tror ikke umidelbart at man kan.

Du kunne lave en række funktioner:

void __fastcall TFrame2::ImgClick1(TObject *Sender)
{
  ImageClick(Sender, 1);
}

void __fastcall TFrame2::ImgClick2(TObject *Sender)
{
  ImageClick(Sender, 2);
}

Og så initialisere:
Img[1]->OnClick = ImgClick1;
Img[2]->OnClick = ImgClick2;

Alternativt kunne man kikke på positionen på musen (GetCursorpos) og udregne i fra denne information.
Avatar billede milandt Nybegynder
04. september 2004 - 23:48 #2
Ved ikke om det ville virke, men problemet er at mine billeder bliver genereret i en for-løkke, og jeg ved ikke hvor mange der er før i selve runtime.. hvis det jeg arbejder imod skal kunne lade sig gøre, så skal der kun være en funktion til alle billedernes onclick event, men de skal gøre noget forskelligt alt efter hvad i er.
Avatar billede bertelbrander Novice
05. september 2004 - 00:18 #3
Følgende ser ud til at virke:

TForm1 *Form1;

class MyImage : public TImage
{
public:
  MyImage(TForm *Form) : TImage(Form)
  {}
  int idx;
};

MyImage *Image1;
MyImage *Image2;

void __fastcall TForm1::ImgClick(TObject *Sender)
{
  MyImage *Image = (MyImage *)Sender;
  char Text[1234];
  sprintf(Text, "I'm image nr: %d", Image->idx);
  MessageBox(0, Text, "Whatever", 0);
}

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  Image1 = new MyImage(Form1);
  Image1->idx = 1;
  Image1->Picture->LoadFromFile("D:\\Program\\s1.bmp");
  TRect R1(10, 10, 100, 100);
  Image1->Dock(Form1, R1);
  Image1->OnClick = ImgClick;
  Image2 = new MyImage(Form1);
  Image2->idx = 2;
  Image2->Picture->LoadFromFile("D:\\Program\\s2.bmp");
  TRect R2(110, 110, 200, 200);
  Image2->Dock(Form1, R2);
  Image2->OnClick = ImgClick;
}
Avatar billede milandt Nybegynder
05. september 2004 - 01:16 #4
Hvordan skal det virke hvis du ikke ved hvor mange billeder der skal sættes ind? Opgav at lave en klasse fordi det virkede lettere at generer billederne i et array i en for løkke..

Kunne godt tænke mig noget i denne retning:

Img[i]->OnClick = ImgClick(i);

.. hvor i sendes med.. kan det lade sig gøre? OnMouseMove tager både en shift state og et x og y koordinat med.. så må det også kunne lade sig gøre at sende en int med i en onclick event.. ?
Avatar billede bertelbrander Novice
05. september 2004 - 01:31 #5
Jeg forstår ikke ...

Du laver blot en løkke hvor du sætter billede i's idx til at være i.

I eksemplet har jeg kun lavet to men du kan blot lave det om til en loop, hvor du har:

MyImage *Image[ALOT];
for(i = 0; i < ALOT; i++)
{
  Image[i] = new MyImage(Form1);
  Image[i]->idx = i;
}
Avatar billede bertelbrander Novice
05. september 2004 - 01:33 #6
Man kan normalt ikke få lov til at bestemme hvilken værdier der overføres med en event.
Avatar billede milandt Nybegynder
05. september 2004 - 01:37 #7
prøver lige dit eksampel i morgen  - tror jeg er med :) Tak for hjælpen indtil videre.
Avatar billede milandt Nybegynder
05. september 2004 - 14:35 #8
virker :) tak skal du ha.. points?
Avatar billede bertelbrander Novice
05. september 2004 - 14:39 #9
Nej tak.
Avatar billede milandt Nybegynder
05. september 2004 - 22:54 #10
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester