Buttons zur Laufzeit - Sender und Handler

javad

Grünschnabel
Hallo

ich fülle in einer Schleife ein stringGrid. Darin sollen in einer Spalte Buttons erzeugt werden. Wie geht man mit dem Click Event um? Sind ja mehrere Buttons.

Code:

int i = 0;

while (!ADOQueryGrid->Eof) {
i = i + 1;

// Def. Rechteck
TRect R;
R = stringGrid->CellRect(11,i);

// Def. Button
TButton *butDet = new TButton(this);
butDet->Name = "butDet" + IntToStr(i);
butDet->Caption = "Details";
butDet->Left = stringGrid->Left + R.Left + 2;
butDet->Top = stringGrid->Top + R.Top + 2;
butDet->Width = R.Width();
butDet->Height = R.Height();

butDet->OnClick = butDetClick; // Button Event
butDet->Parent = MainForm;
ADOQueryGrid->Next();
}

Das funkt auch wunderbar und soll beim Click das hier aufrufen. Je nach Sender
dann eine andere Aktion.

void __fastcall TMainForm::butDetClick(TObject *Sender)
{
ShowMessage(Sender); // soll Namen des Buttons ausgeben, geht so nicht
// Fehler: Konvertierung von 'TObject *' nach 'AnsiString' nicht möglich
// hier die Aktion. z.B Id aus Grid Spalte an andere Funktion weitergeben.​
}


Wie komme ich an den Sender ran? Muß ich den schon im Funktionsaufruf übergeben?

Gruß und Danke
 
TObject ist die Basisklasse der VCL. D.h., alle Objecte der VCL sind von TObject abgeleitet.
D.h., Du musst auf die entsprechende Klasse casten. D.h., in diesem Fall auf die Klasse TButton

ShowMessage(dynamic_cast<TButton*>(Sender)->Name.c_str())


Gruß
Gerhard
 
Faszinierend. Das wollte ich schon immer mal können :)

Hab den Code n bissl an ein normales StringGrid angepasst

Code:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int i = 0;
    while (StringGrid1->RowCount > i)
    {
        i++;
        // Def. Rechteck
        TRect R;
        R = StringGrid1->CellRect(0,i-1);
        // Def. Button
        TButton *butDet = new TButton(this);
        butDet->Name = "butDet" + IntToStr(i);
        butDet->Caption = "Details";
        butDet->Left = StringGrid1->Left + R.Left + 2;
        butDet->Top = StringGrid1->Top + R.Top + 2;
        butDet->Width = R.Width();
        butDet->Height = R.Height();
        butDet->OnClick = butDetClick; // Button Event
        butDet->Parent = Form1;
    }
}
void __fastcall TForm1::butDetClick(TObject *Sender)
{
ShowMessage(dynamic_cast<TButton*>(Sender)->Name.c_str());
}
//---------------------------------------------------------------------------

An alle die hier auf dieses Thema stoßen:
Nicht vergessen in der Header unter
Code:
class TForm1 : public TForm
{
__published: // IDE-managed Components

diesen Code einzufügen:

Code:
        void __fastcall butDetClick(TObject *Sender);

Is doch immer schön n paar Codeschnipsel aus diesem Forum auszuprobieren und mal wieder Spielen :)
 
Zurück