Komponenten in eigener Funktion benutzen???
-
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 *)' gefundenForm4 = new TForm4(static_cast<void *> (NULL));
-
Wieso schreibst du in einen 7 Jahre alten Thread und
wo hast DuForm4 = new TForm4(static_cast<void *> (NULL));
her. Der Compiler sagt dir es gibt keinen Konstruktor der einen void-Zeiger als Parameter hat.