!!!Eigene Funktionen gehen nicht!!!



  • hi,

    Ich habe ein Problem...Wie die Überschrift schon sagt will ich eine Eigene Funktion für meine Anwendung benutzen...Das problem ist nur das diese gal wie ich es versuche nicht gehen...Hier mal der Quellcode:

    //---------------------------------------------------------------------------
    
    #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)
    {
         if(Label1->Caption=="Muhu")
             Label1->Caption="Muha";
         else if(Label1->Caption=="Muha")
             Label1->Caption="Muhu";
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
         if(Label1->Caption=="Muhu")
             Label1->Caption="Muha";
         else if(Label1->Caption=="Muha")
             Label1->Caption="Muhu";
    }
    //---------------------------------------------------------------------------
    
    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
        TLabel *Label1;
        TButton *Button1;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
        __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Nun will ich jeweils aus den ButtonClick Funktionen diesen Teil in eine extra Funktion packen:

    if(Label1->Caption=="Muhu")
             Label1->Caption="Muha";
         else if(Label1->Caption=="Muha")
             Label1->Caption="Muhu";
    

    erst hab ich mir gedacht ich kann einfach wie immer eine Funktion machen und diese einbinden...nur dies ging nicht weil dann Label1 nicht erkannt wurde...Nun meine Frage: wie bekomme ich das hin das meine Funktionen funktionieren????

    So wollt ichs machen:

    //---------------------------------------------------------------------------
    
    #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 wachsel (void) {
         if(Label1->Caption=="Muhu")
             Label1->Caption="Muha";
         else if(Label1->Caption=="Muha")
             Label1->Caption="Muhu";
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         wachsel();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
         wachsel();
    }
    //---------------------------------------------------------------------------
    

    So geht es aber nicht...Es kommt diese Fehlermeldung: [C++ Fehler] Unit1.cpp(19): E2451 Undefiniertes Symbol 'Label1'...Könnt ihr mir bitte helfen...Brauche das unbedingt...Natürlich nicht für das sondern für ein TicTacToe Spiel wo sonst der Quellcode ca. 9-mal so groß ist wie mit Funktionen...Ich benutze den C++ Builder 6.0

    mfg Dimo

    PS.:Hab in der Suche/FAQ nichts gefunden...hoffe auch das ich nichts übersehen habe



  • Hallo

    1. Was willst du mit "void wachsel (void) {" bezwecken?
    2. Der Fehler tritt auf, weil die Funktion wachsel keine Memberfunktion des Formulars ist. Somit ist es auch unbekannt.
    3. else if gibt es in C++ nicht. Nur in VBA <-- Vergiss diese aussage. 🙄
    4. Das ganze müsste nun so aussehen.

    Header-Datei:

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // Von der IDE verwaltete Komponenten
        TLabel *Label1;
        TButton *Button1;
        TButton *Button2;
        void __fastcall Button1Click(TObject *Sender);
        void __fastcall Button2Click(TObject *Sender);
    private:    // Anwender-Deklarationen
    public:        // Anwender-Deklarationen
        __fastcall TForm1(TComponent* Owner);
    
        //Deklaration des Prototypen Wachsel als methode der Klasse TForm1
        void __fastcall wachsel(); 
    
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Cpp-Datei:

    //---------------------------------------------------------------------------
    
    #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::wachsel() 
    {
         if(Label1->Caption=="Muhu")
             Label1->Caption="Muha";
         else
             Label1->Caption="Muhu";
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         wachsel();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
         wachsel();
    }
    //---------------------------------------------------------------------------
    

    Hoffe, ich konnte dir weiterhelfen. 😃



  • Deforation schrieb:

    3. else if gibt es in C++ nicht. Nur in VBA

    else if gibt es sehr wohl bei C++, auch wenn es kein einzelnes Schlüsselwort ist:

    if(a==1)
      foo1();
    else if(a==2)
      foo2();
    else
      foo3();
    

    Dies ist legal, und macht auch das was man erwartet. Es ist nichts anderes wie die folgende Verschachtelung:

    if(a==1)
      foo1();
    else
    {
      if(a==2)
        foo2();
      else
        foo3();
    }
    

    cu André



  • Jop stimmt ja. 👍

    Wass hab ich mir dabei bloss gedacht. 😃



  • Jo danke hast mir echt geholfen...und zu dem else if...hab natürlich den Code davor getestet...

    mfg Dimo



  • Noch ein kleiner Tipp.

    Du kannst das Ganze noch ein bisschen verkleinern.

    Quellcode ca. 9-mal so groß ist wie mit Funktionen

    Anstelle, dass du für jeden Butten die Funktion Like this machst.

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         wachsel();
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
         wachsel();
    }
    //---------------------------------------------------------------------------
    

    Kannst du auch auf dem Formular auf den Button klicken, dann auf Ereignisse und dann kannst im OnClick Ereigniss das Ereigniss des ersten Buttons wählen.

    Und schon hast du wieder 18 Zeilen gesparrt 😃

    Dann steht beim OnClick Ereigniss des Buttons2 quasi (Button1Click) und beim dritten und vierten auch. 💡



  • Jo klar die idee ist gut nur will ich damit ja ein TicTacToe Programmieren und dann muss ich die Captions von den Button ändern...und so würde egal auf welchen Button ich klicke immer das von Button 1 geändert werden...ich könnt mir vorstellen das man des irgendwie vielciht mit Arrays machen könnte aber das zu testen hab ich keinen Bock und find ichs so au ok...aber trozdem danke

    mfg Dimo



  • Hallo,

    im OnClick des Button existiert der Parameter "Sender" (TObject *Sender) ... mittels dynamic_cast könntest du dann ermitteln welchen der vielen Buttons gedrückt wurde.

    Somit kannst du es dann doch, wie Deforation vorgschlagen hat, verkürzen.

    dynamic_cast(Sender *)<TButton>->Caption = "X";
    

    mfg, Micha



  • eher so:

    dynamic_cast<TButton*>(Sender)->Caption = "X";
    


  • Hallo,

    sry, Linnea hat natürlich recht 🙂

    mfg, Micha



  • Es wäre noch gut den Rückgabewert von dynamic_cast zu testen wenn man es denn schon verwendet.
    Wenn man sich völlig sicher ist, das Sender ein TButton ist, kann man sonst ja auch static_cast verwenden.



  • Linnea schrieb:

    eher so:

    dynamic_cast<TButton*>(Sender)->Caption = "X";
    

    Noch eher so:

    dynamic_cast <TButton&> (*Sender).Caption = "X";
    

    dynamic_cast mit Referenzen wirft std::bad_cast, wenn der Cast fehlschlägt, sorgt also für die von Braunstein angeregte Überprüfung.


Anmelden zum Antworten