Komponenten in eigener Funktion benutzen???



  • 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



  • Ja ich hatte mir das ja auch so gedacht gehabt, aber leider bekam ich dann die Fehlermeldung:

    [BCC32 Fehler] start.cpp(165): E2285 Keine Übereinstimmung für 'newedit(Tfrm_startPacker * const,TScrollBox *,int,int,const int,UnicodeString)' gefunden

    Ich habs dann mit Char* to String und ähnlichem probiert, aber hatte alles nichts gebracht ...

    Edit:
    Fehler selber schon gefunden, es war das vergessen der Übergabe des Komponentennames. Mal wieder n doofer Anfängerfehler von mir 😛



  • Hallo

    Du hättest schon sagen können das du mit dem neusten Builder arbeitest... der verwendet anstelle von AnsiString eben UnicodeString 😉 . Also must du nur deine Funktion noch korrigieren:

    void newedit(TComponent*, TWinControl*, TEdit* edit[], int, int, UnicodeString text);
    

    Besser ist natürlich einfach String anstatt UnicodeString zu schreiben, dann sucht der Builder automatisch den richtigen Typ aus.

    bis bald
    akari



  • Hallo, kann mir jemand helfen????
    Bekomme diese Fehlermeldung:
    [bcc32 Fehler] Main_Unit.cpp(232): E2285 Keine Übereinstimmung für 'TForm4::TForm4(void *)' gefunden

    Form4 = new TForm4(static_cast<void *> (NULL));



  • Wieso schreibst du in einen 7 Jahre alten Thread und
    wo hast Du

    Form4 = new TForm4(static_cast<void *> (NULL));
    

    her. Der Compiler sagt dir es gibt keinen Konstruktor der einen void-Zeiger als Parameter hat.


Anmelden zum Antworten