Eine eigene Klasse



  • Hallo zusammen,
    ich arbeite mit einem Tutorial im Moment daran, wie man eine eigene Klasse erstellt. Nun wollte ich dies auch mal allein versuchen, aber ich habe noch einige Probleme. Es geht wieder mal um eine Funktion, bei der die errechneten Werte in einer Wertetabelle dargestellt werden sollen. Hier ist der Quelltext:

    Unit1.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <Grids.hpp>
    //---------------------------------------------------------------------------
    
    class TRotation : public TObject
    {
     public:
      float V[15];
      float R;
      void __fastcall Berechne (void);
    
      __fastcall TRotation (void);
    };
    
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TStringGrid *StringGrid;
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
            TRotation *Rotation;
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Unit1.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include <math.h>
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    const float CGM = 587.88;
    const Vmax = 240, Rmax = 6;
    TForm1 *Form1;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    __fastcall TRotation::TRotation ()  : TObject ()
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
     Rotation = new TRotation ();
    }
    //---------------------------------------------------------------------------
    void __fastcall TRotation::Berechne ()
    {
     for (int i = 1; i<15; i++) //R bzw. i wird erstellt
      {
       R = i;
       float R1 = R / Rmax;
    
       if (R1 <= 1) V[i] = Vmax * R1; //Formelauswahl
       else V[i] = CGM / pow(R,0.5);
    
       StringGrid->Cells[0][0] = "--------------------";
       StringGrid->Cells[1][0] = "Wert für V";
       StringGrid->Cells[0][i] = "R = " + FloatToStr (i);
       StringGrid->Cells[1][i] = FloatToStrF (V[i], ffNumber, 8, 0);
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     Rotation->Berechne();
    }
    //---------------------------------------------------------------------------
    

    Bei mir kommt nun folgender Fehler: Undefiniertes Symbol 'StringGrid'! Ich kenne dieses "Problem" von Methoden wie z.B. Canvas. Meines Wissens schreibt man dann Form1->Canvas!! Aber wie funktioniert das bei StringGrid?? Außerdem: Ich erstelle ja eine Wertetabelle, gebe also Werte aus. Kann ich das so machen wie oben steht oder ist das vom Ansatz ganz falsch. Ich habe nämlich in meinem Tutorial stehen, dass man dann return nutzt!

    Vielen Dank für eure Hilfe 😃
    lg, freakC++



  • Mach bei "Berechne" nen Parameter für einen Zeiger auf TStringGrid mit rein.

    Beim Aufruf übergibst Du den Zeiger auf Dein StrinGrid in Form1!

    Gruss Frank



  • mmh...ich krieg das irgendwie net hin! Kannste vielleicht einen Beispielcode posten? Wie ist das mit return!! Ist das in diesem Fall egal?? Kann man mit return jeweils nur einen Wert zurückgeben oder auch Werte eines Variablenfeldes?? Hab dazu nichts gefunden!!!

    Vielen dank!!
    lg, freakC++



  • void __fastcall TRotation::Berechne (TStringGrid *grid)
    {
       ...
       grid->Cells[0][0] = "--------------------";
       ...
    }
    

    und

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       Rotation->Berechne(StringGrid);
    }
    

    und du kannst einen Zeiger auf ein Feld zurückgeben.



  • Hallo,
    vielen dank schonmal für euren Lösungsvorschlag, aber ich mach doch noch was falsch. Ich habe es so gemacht wie jogt vorgeschlagen hat, doch leider kommen nun folgende Fehlermeldungen:

    E2316 '_fastcall TRotation::Berechne(TStringGrid *)' ist kein Element
    von 'TRotation'

    E2206 Ungültiges char-Zeichen 'ü' (0xfc)

    E2227 Zu viele Parameter im Aufruf von _fastcall TRotation::Berechne()

    So sieht der Quelltext dazu jetzt aus:

    void __fastcall TRotation::Berechne (TStringGrid *grid)
    {
     for (int i = 1; i<15; i++) //R bzw. i wird erstellt
      {
    
       R = i;
       float R1 = R / Rmax;
    
       if (R1 <= 1) V[i] = Vmax * R1; //Formelauswahl
       else V[i] = CGM / pow(R,0.5);
    
       grid->Cells[0][0] = "--------------------";
       grid->Cells[1][0] = "Wert fuer V";
       grid->Cells[0][i] = "R = " + FloatToStr (i);
       grid->Cells[1][i] = FloatToStrF (V[i], ffNumber, 8, 0);
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     Rotation->Berechne(StringGrid);
    }
    //---------------------------------------------------------------------------
    

    Wisst ihr was ich falsch gemacht habe??? Warum mekert C++Builder plötzlich wegen dem ü? Das macht sonst keine Probleme. Naja, ich habs durch ue ausgetauscht, aber die beiden anderen Fehler bleiben!

    Vielen Dank für eure Hilfe
    lg, freakC++



  • hast du im header- und im cpp-file die Berechne-Funktion angepasst ? also deinen Parameter TStringGrid ?

    sonst zeig nochmal beide files wie die jeztt aussehen.
    in welcher zeile soll der fehler mit dem 'ü' sein ?

    Meep Meep



  • Hallo alle miteinander,

    E2206 Ungültiges char-Zeichen 'ü' (0xfc)
    Der Compiler kommt mit der fehlerhaften Parameterübergabe nicht zurecht. In der Folge werden (fast) alle Wörter als Variablen des Typs int interpretiert. In Cpp sind Variablennamen mit Umlauten nicht zulässig! Durch Änderung des ü von "für" in ue wird der Fehler behoben.
    Mit Behebung der fehlerhaften Deklaration in der Headerdatei würde aber auch diese Fehlermeldung verschwinden

    lg, Someone



  • klar, ich habs im Header vergessen.....*versink, rot werd*!!!! Soll nicht wieder vorkommen. Ich habe trotzdem noch ein paar Fragen, da ich nämlich auch genau verstehen möchte, warum es so funktioniert:

    //---------------------------------------------------------------------------
    void __fastcall TRotation::Berechne (TStringGrid *grid) /*warum schreibt man das in den Parameter. Was hat das zur Folge. Ich dachte, man schreibt in den Parameter, wenn meinen einen Wert aufnehmen will!!*/ {
     for (int i = 1; i<15; i++) //R bzw. i wird erstellt
      {
    
       R = i;
       float R1 = R / Rmax;
    
       if (R1 <= 1) V[i] = Vmax * R1; //Formelauswahl
       else V[i] = CGM / pow(R,0.5);
    
       grid->Cells[0][0] = "--------------------";
       grid->Cells[1][0] = "Wert für V";
       grid->Cells[0][i] = "R = " + FloatToStr (i);
       grid->Cells[1][i] = FloatToStrF (V[i], ffNumber, 8, 0);
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     Rotation->Berechne(StringGrid); /* Warum steht hier nur noch als Parameter String Grid?? Was bewirkt ein solcher Parameter??*/
    }
    //---------------------------------------------------------------------------
    

    Wie ihr seht komme ich noch mit dem Begriff Parameter nicht so recht klar. In meinem Übungsbuch ist das leider nicht so erklärt, dass ich es verstehe. Daher hoffe ich auf euch!

    Vielen Dank für eure Hilfe.
    lg, freakC++



  • void __fastcall TRotation::Berechne (TStringGrid *grid)
    {
       ...
    }
    

    hier hast du eine funktion derer du einen zeiger auf ein objekt vom typ TStringGrid uebergibst.
    mit dem dem zeiger kannst du nun auf das TStringGrid-objekt zugreifen.

    Rotation->Berechne(StringGrid);
    

    hier rufst du die funktion auf, welche einen zeiger auf ein TStringGrid-objekt
    erwartet, damit sie mit dem TStringGrid-objekt arbeiten bzw. es modifizieren kann.

    Meep Meep


Anmelden zum Antworten