Ereignisse zur Laufzeit zuweisen



  • Ich hab eben den Beitrag in der FAQ "Komponenten benutzen - zur Laufzeit erstellen, anzeigen und Events zuweisen" gelesen und hab das mal bei mir getestet, aber irgendwas mach ich falsch:

    Ich erstelle mit

    TButton *TheButton = new TButton(Application);
    TheButton->Parent = Form1;
    

    einen neuen Button zur Laufzeit und will ihm dann mit

    TheButton->OnClick = OnTheButtonClick;
    

    das Ereignis

    void __fastcall TForm1::OnTheButtonClick(TObject *Sender) 
    { 
      Application->MessageBox("OK","Test",MB_OK);
    }
    

    zu. Aber ich erhalte immer nur eine Fehlermeldung, dass __fastcall TForm1::OnTheButtonClick(System::TObject*) kein Member von TForm1 ist.
    Verdammt, was mach ich falsch???



  • steht diese zeile in der header-datei von TForm1?

    void __fastcall OnTheButtonClick(System::TObject*);
    


  • Ist denn in der Unit1.h

    void __fastcall OnTheButtonClick(TObject *Sender);
    

    eingetragen?



  • Hmm... natürlich nich! 😃 Jetzt isse drin: Funzt jetzt prima! thx!



  • Ich schreibe gerade an einer eigenen Button Klasse. Diese Buttons enthalten zum Beispiel immer zwei TImages, die den Button gedrückt und nicht gedrückt darstellen. Nun muss ich aber immer, wenn ein solcher Button erstellt wird, den Images OnClick Ereignisse verpassen. Dies soll logischer Weise im Konstruktor gemacht werden. Wenn ich jetzt im Konstruktor mit

    ButtonUpImage->OnClick = OnTheButtonClick;
    

    sagt BCB,dass er OnTheButtonClick nicht kennt, weil das ja eine Methode von TForm1 ist. Wie soll ich das BCB klar machen?



  • dann schreib halt die Methode in der Button- Klasse



  • 😮 Ich glaubs nich... das kommt davon, wenn man den ganzen Tag codet... thx



  • Ich hab mal wieder ne Frage wegen meiner (wahrscheinlich schrecklich gecodeten) Button-Klasse. Ich poste mal einfach die ganze Klasse:

    class MyButton:TObject{
      private:
        TImage *ButtonUpImage;
        TImage *ButtonDownImage;
        TPicture *TheButtonDownPicture;
        TPicture *TheButtonUpPicture;
        TLabel *TheLabel;
        TFont *TheFont;
    
        //OnMouseDown Event:
        void __fastcall ButtonDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
        {
          ButtonDownImage->Visible = 1;
          ButtonUpImage->Visible = 0;
          TheLabel->Top += 1;
          TheLabel->Left += 1;
        }
    
        //OnMouseUp Event:
        void __fastcall ButtonUp(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
        {
          ButtonUpImage->Visible = 1;
          ButtonDownImage->Visible = 0;
          TheLabel->Top -= 1;
          TheLabel->Left -= 1;
          UserEvent();
        }
    
      public:
        //Konstruktor:
        MyButton(int x,int y,char *text,TForm1 *TheForm)
        {
          //Bitmaps laden:
          TheButtonDownPicture = new TPicture();
          TheButtonUpPicture = new TPicture();
          TheButtonUpPicture->LoadFromFile("ButtonUp.bmp");
          TheButtonDownPicture->LoadFromFile("ButtonDown.bmp");
    
          //Images einrichten:
          ButtonDownImage = new TImage(Application);
          ButtonUpImage = new TImage(Application);
          ButtonDownImage->Parent = TheForm;
          ButtonUpImage->Parent = TheForm;
          ButtonDownImage->Picture = TheButtonDownPicture;
          ButtonUpImage->Picture = TheButtonUpPicture;
          ButtonUpImage->Left = x;
          ButtonUpImage->Top = y;
          ButtonDownImage->Left = x;
          ButtonDownImage->Top = y;
          ButtonUpImage->Height = TheButtonUpPicture->Height;
          ButtonUpImage->Width = TheButtonUpPicture->Width;
          ButtonDownImage->Height = TheButtonDownPicture->Height;
          ButtonDownImage->Width = TheButtonDownPicture->Width;
    
          //Font fuer Labelfarbe:
          TheFont = new TFont();
          TheFont->Color = clRed;
    
          //Label Einrichten:
          TheLabel = new TLabel(Application);
          TheLabel->Parent = TheForm;
          TheLabel->Caption = text;
          TheLabel->Transparent = 1;
          TheLabel->Font = TheFont;
    
          //Label in die Mitte setzen
          while(TheLabel->Width > ButtonUpImage->Width)
            ButtonUpImage->Width++;
          while(TheLabel->Height > ButtonUpImage->Height)
            ButtonUpImage->Height++;
          TheLabel->Left = ((ButtonUpImage->Width - TheLabel->Width) / 2) + ButtonUpImage->Left;
          TheLabel->Top = ((ButtonUpImage->Height - TheLabel->Height) / 2) + ButtonUpImage->Top;
    
          //Standart Events:
          ButtonUpImage->OnMouseDown = ButtonDown;
          ButtonUpImage->OnMouseUp = ButtonUp;
          ButtonDownImage->OnMouseDown = ButtonDown;
          ButtonDownImage->OnMouseUp = ButtonUp;
          TheLabel->OnMouseDown = ButtonDown;
          TheLabel->OnMouseUp = ButtonUp;
    
        }
    
        //Benutzerspezifisches Event:
        virtual void __fastcall UserEvent(void);
    };
    

    Eigentlich sollte man jetzt mit

    void __fastcall MyButton::UserEvent(void)
    {
      //Aktion...
    }
    

    der ganzen Sache ein Ereignis zuweisen können. Das gilt dann aber logischer Weise für alle MyButton-Objekte, was nicht Sinn ganz der Sache(Klasse) ist. Wie kann ich denn jetzt einem ganz bestimmten Objekt der Klasse ein Ereignis zuweisen? Kann es sein, dass eine virtuelle Funktion der falsche Ansatz war? 😕




Anmelden zum Antworten