Komponenten in eigener Funktion benutzen???



  • Sagt mal, kann ich auch in einer selbst geschrieben Funktion die Komponenten benutzen? Ich habe das nämlich probiert, und dann ein haufen Fehler bekommen, dass meine Komponenten alle undefinierte Symbole seien, dabei habe ich diese schon lange mit dem Designer erstellt und in OnClick-Ereignissen etc. ohne Probleme benutzt gehabt.
    oben in der unit.cpp:

    void eingabe(int);
    

    am ende der unit.cpp:

    void eingabe(int i) {
        edit_text->Caption = "hallo";
    }
    

    Was mache ich falsch, bzw. habe ich vergessen?



  • wenn ich mal schnell rate: dann Versuch mal

    statt

    edit_text->Caption = "hallo";
    

    zb.

    Formularname->edit_text->Caption = "hallo";
    

    Die frage wäre jetzt noch ob die unit.cpp dein Formular ist oder das Formular ne andere cpp datei ist. Wenns ne andere ist muss noch ein #include "beispiel.h" rein. Natürlich der name der Unit vom Formular.



  • jo danke, daran lags, einfach form davor 😉 aber jetzt muss ick vor alle komponenten ja die form davorschreiben ... dat is ja umständlich ... 😞 wollte nämlich nen teil in ne extra funktion packen, ums etwas übersichtlicher zu gestalten ...



  • Umständlich ???

    Wenn du zb 2 Formulare hast dann könnteste ja zb 2 mal Label1 haben.
    Also muss er ja wissen welches Label1 du meinst -- also

    Form1->Label1
    Form2->Label1

    OK

    Also ich muss ja auch schon mal wenn ich was Falsch gemacht habe oder hinterher doch nen anderen Weg nehme vieles auf einmal ändern.

    Sehr Hilfreich kann da die Suchen und Ersetzen Funktion sein.

    je nach Menge.

    bzw. wenn dort überal nur zb das Formname-> davormuss kopiere ich mir das und bewege ich mich mit den Pfeiltasten nach unten und drücke dann einfach Strg&v zum Einfügen. Geht dann recht schnell.



  • also ehrlich gesagt, habe ich erstmal nur eine Form 😉 und will die Komponenten einfach nur in einer eigenen Funktion, keine Komponentenmethoden, benutzen. Habe das jetzt so gemacht, dass ich den Code aus der Kompo.methode in meine eigene Funktion verschoben habe.

    Hier erstelle ich z.b. eine checkbox zur laufzeit. Die Fehlermeldungen wegen undefinierten Symbolen sind jetzt durch deine Hilfe schon weg 😉 aber etzt meckert er wegen "this" rum ...

    void funktion(int i){
                    // CheckBox für Aktivierung zur Simulation des Packvorgangs
    		check_simulator[i] = new TCheckBox(this);
    		check_simulator[i]->Parent = from->scrollbox;
    		check_simulator[i]->Left = 20;
    		check_simulator[i]->Top = 52 + i*30 - form->scrollbox->VertScrollBar->Position;
    		check_simulator[i]->Checked = true;
    }
    

    Fehlermeldung:

    'this' kann nur für Elementfunktionen verwendet werden



  • ok, Problem selber herausgefunden!

    einfach 'this' durch 'Form2' bzw. den jeweiligen Formnamen ersetzen 😉

    Frohes Fest wünsch ich dir noch, und danke für die noch sehr späte/frühe Hilfe 🙂



  • Hallo

    Den automatischen Formnamen zu benutzen ist keine gute Idee. Auch das mutmaßlich globale Array check_simulator ist keine gute Idee. Denn beides macht aus deiner scheinbar freien eine an ein genau festgelegtes Umfeld ausgelegte Funktion. Das Array sollte auf jedenfall ein Member der Formklasse werden.

    Es gibt zwei bessere Möglichkeiten :
    - Du machst aus deiner freien Funktion eine an die Formklasse gebundene Membermethode. Damit ersparst du dir alle weitere Spezifikation
    - Du übergibst die notwendigen Komponenten als Parameter

    void funktion(TComponent* owner, TWinControl* parent, TCheckBox check[], int i, int pos){
                    // CheckBox für Aktivierung zur Simulation des Packvorgangs
            check[i] = new TCheckBox(owner);
            check[i]->Parent = parent;
            check[i]->Left = 20;
            check[i]->Top = 52 + i*30 - pos;
            check[i]->Checked = true;
    } 
    
    // Aufruf aus einer Methode von Form aus :
    funktion(this, scrollbox, check_simulator, i, form->scrollbox->VertScrollBar->Position);
    

    bis bald
    akari

    bis bald
    akari



  • Also ich muss ja mal sagen, dass das richtig gut aussieht und auch bestimmt "guter" Programmierstil ist 🙂
    Da muss ich mich erstmal recht herzlich für diesen netten Hinweis bedanken! Meine Lösung funktionierte ja erstmal und ich war auch zufrieden damit. Aber bei dem Tipp sage ich natürlich nicht nein, zu mal ich auch nicht weiß, was sonst noch für Fehler auftauchen können ... Ich probier das gleich mal aus und schau, ob ich das alles ohne Probleme eingebaut kriege. Verstanden hab ich es schonmal 😉
    Was macht eigentlich das TWinControl* ?



  • Hallo

    TWinControl ist eine Basisklasse in der VCL-Komponentenhierarchy. Alle fensterorientierten Komponenten wie TForm oder TEdit sind davon abgeleitet. Und da die Eigenschaft Parent als Wert nur einen Zeiger auf TWinComponent braucht, habe ich eben den Parameter der Funktion auf diese Basisklasse beschränkt. Damit kannst du als Parent alle sinnvollen Komponenten übergeben, nicht nur TScrollBox.

    bis bald
    akari



  • Ok, wenn ich das richtig verstanden habe, kann ich also auch alle anderen Eigenschaften einer Komponente, nicht nur Parent, benutzen/übergeben (z.B. auch Left oder Caption etc.).

    Für verschiedene Komponenten werde ich dann also auch die Funktion, die du mir geschrieben hast, abändern müssen, oder? So dass ich Funktion1 für CheckBoxen, Funktion2 für Edits und Funktion3 für Labels habe, richtig?



  • Hallo

    Ja dafür bräuchtest du eigene Funktionen. Die verschiedenen Typen würde man noch durch Templates zusammenfassen können, aber spätestens bei verschiedenen zusätzlichen Eigenschaften hört das schon auf.

    bis bald
    akari



  • Ja genau, hatte auch erst überlegt, ob man die irgendwie zusammenlegen könnte, das wollte ich auch schon fragen ^^ aber dann hab ich mir gedacht, dass das bestimmt dann nicht so funktionieren kann, da ich ja bei checkboxen ganz andere eigenschaften habe als bei einem edit oder label 😉

    So jetzt habe ich deine Funktion implementiert, aber jetzt bekomm ich den Fehler:

    [BCC32 Fehler] start.cpp(116): E2459 Klassen im VCL-Stil müssen mit dem Operator new erstellt werden



  • Hallo

    Ich vermute du hast bei einem der Parameter von funktion eine VCL-Komponentenklasse By Value anstatt wie es richtig wäre By Reference übergeben. Sprich : Es fehlt irgendwo ein Zeiger-*

    void function(TWinControl parent,...) // Falsch
    
    void function(TWinControl* parent,...) // Richtig : muß Zeiger sein
    

    bis bald
    akari



  • Also eigentlich hatte ich das richtig abgeschrieben, dacht ich:

    //Deklaration der Funktion
    void newcheck(TComponent*, TWinControl*, TCheckBox, int, int);
    
    //Funktion selber
    void newcheck(TComponent* owner, TWinControl* parent, TCheckBox check[], int i, int pos){
            // CheckBox für Aktivierung zur Simulation des Packvorgangs
    	check[i] = new TCheckBox(owner);
    	check[i]->Parent = parent;
    	check[i]->Left = 20;
    	check[i]->Top = 2 + i*30 - pos;
    	check[i]->Checked = true;
    
    }
    
    //Funktionsaufruf
    void __fastcall Tfrm_Packer::btn_addClick(TObject *Sender)
    {
        newcheck(this, scr_paletten, check_simulator, i,
            scr_paletten->VertScrollBar->Position);
    }
    

    Der Fehler kommt in der Zeile

    check[i] = new TCheckBox(owner);
    


  • Hallo

    Meine Vermutung ist fast richtig, und der Fehler basiert auf meinem Code. Auch im Array check müßen natürlich Pointer rein

    void newcheck(..., TCheckBox* check[], ...)
    

    bis bald
    akari



  • Achso 🙂 naja die Pointer und ich mögen uns noch nich so richtig xD da bin ich noch nicht ganz hintergestiegen.



  • Da hab ich mal noch ne kleine Frage 🙂 Wenn ich jetzt noch eine Caption-/Text-eigenschaft eines Labels oder Edits mit übergeben will, wie mache ich das am Besten? Kann man da auch so eine Klasse übergeben/ benutzen?



  • Hallo

    😕 Wenn du in deiner Generierungsfunktion gleich noch die Eigenschaft Label/Text auf einen bestimmten Wert setzen willst, dann übergib einfach noch ein AnsiString.

    //Deklaration der Funktion
    void newedit(TComponent*, TWinControl*, TEdit* edit[], int, int, AnsiString text);
    
    //Funktion selber
    void newedit(TComponent* owner, TWinControl* parent, TEdit* edit[], int i, int pos, AnsiString text){
            // CheckBox für Aktivierung zur Simulation des Packvorgangs
        edit[i] = new TEdit(owner);
        edit[i]->Parent = parent;
        edit[i]->Left = 20;
        edit[i]->Top = 2 + i*30 - pos;
        edit[i]->Text = text;
    
    }
    
    //Funktionsaufruf
    void __fastcall Tfrm_Packer::btn_addClick(TObject *Sender)
    {
        newedit(this, scr_paletten, edit_simulator, i,
            scr_paletten->VertScrollBar->Position, "Hallo");
    }
    

    bis bald
    akari



  • Aber sowas wie die Eigenschaft selber übergeben geht nicht?

    //Funktionsaufruf
    void __fastcall Tfrm_Packer::btn_addClick(TObject *Sender)
    {
        newedit(this, scr_paletten, check_simulator, i,
            scr_paletten->VertScrollBar->Position, edit2->Text);
    }
    


  • Hallo

    Selbstverständlich kannst du das so machen. Der AnsiString-Wert aus edit2->Text wird kopiert und an das neu erstellte Edit übergeben.

    bis bald
    akari


Anmelden zum Antworten