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 -- alsoForm1->Label1
Form2->Label1OK
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 Parametervoid 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
akaribis 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