tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
1639
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    javad javad ist offline Mitglied
    Registriert seit
    May 2006
    Ort
    München
    Beiträge
    18
    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
     

  2. #2
    GABehnke GABehnke ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Hamburg
    Beiträge
    38
    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
     

  3. #3
    Avatar von Tasm-Devil
    Tasm-Devil Tasm-Devil ist offline Mitglied Gold
    Registriert seit
    Feb 2005
    Ort
    Maxdorf
    Beiträge
    137
    Faszinierend. Das wollte ich schon immer mal können

    Hab den Code n bissl an ein normales StringGrid angepasst

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    //---------------------------------------------------------------------------
    #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 :
    1
    2
    3
    
    class TForm1 : public TForm
    {
    __published: // IDE-managed Components

    diesen Code einzufügen:

    Code :
    1
    
            void __fastcall butDetClick(TObject *Sender);

    Is doch immer schön n paar Codeschnipsel aus diesem Forum auszuprobieren und mal wieder Spielen
     
    C macht es einfach, sich in den Fuß zu schießen; C++ erschwert es, aber wenn man es tut, bläst es einem das ganze Bein weg." —Bjarne Stroustrup .-.-.-.-.-.-.
    „Ich habe mir immer gewünscht, dass mein Computer so einfach zu bedienen sein sollte wie mein Telefon. Mein Wunsch wurde wahr. Ich weiß nun nicht mehr, wie mein Telefon funktioniert.“ —Bjarne Stroustrup

Ähnliche Themen

  1. Mehrere Buttons zur Laufzeit dynamisch Generieren
    Von Lautsprecher im Forum Java
    Antworten: 7
    Letzter Beitrag: 26.06.07, 10:40
  2. object sender....
    Von d-Stench im Forum .NET Windows Forms
    Antworten: 6
    Letzter Beitrag: 23.08.05, 21:40
  3. Buttons zur Laufzeit erstellen
    Von zonki im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 17.02.05, 09:44
  4. Buttons zur Laufzeit erstellen
    Von alixander im Forum Borland CBuilder und VCL
    Antworten: 3
    Letzter Beitrag: 10.01.05, 16:23
  5. sender... wie funktionierts?
    Von Delphi-Gangster im Forum Delphi, Kylix, Pascal
    Antworten: 1
    Letzter Beitrag: 15.06.04, 09:32