verständnisproblem - Zeiger für Form übergeben
-
ich möchte eine Funktion aufrufen, die nicht in der selben Form definiert sein muss, welche durch ein Zeiger auf eine Form(oder GroupBox oder ähnliches) als Parameter zugreift, und dort dynamisch Komponenten erstellt...
jetzt habe ich da ne simple testfunktion geschrieben
Button1 und GroupBox1 sind auf der Form1void __fastcall TForm1::Button1Click(TObject *Sender) { Test (Form1); } //--------------------------------------------------------------------------- void __fastcall TForm1::Test(TForm *Form) { Form->GroupBox1->Caption ="Hallo Welt"; } //---------------------------------------------------------------------------kann mir jemand sagen, wo der Fehler liegt und/oder was icih falsch mache?
-
Fehler???
Du hast gar keinen beschrieben/ genannt!

Ich nehm mal an, der Zugriff auf Groupbox wird verweigert.

TForm * ist ein Zeiger auf eine LEERE Form!!!
Du musst schon nen Zeiger auf DIE Form nehmen, in DER die GroupBox drin ist.

-
DerAltenburger schrieb:
Fehler???
Du hast gar keinen beschrieben/ genannt!

jep, stimmt.. in der einfach heit des besipiels habe ich komplet vergessen das problem genau zu beschreiben
DerAltenburger schrieb:
Ich nehm mal an, der Zugriff auf Groupbox wird verweigert.

genau dort liegt das Problem 
DerAltenburger schrieb:
TForm * ist ein Zeiger auf eine LEERE Form!!!
Du musst schon nen Zeiger auf DIE Form nehmen, in DER die GroupBox drin ist.

aber ich übergebe doch mit
Test (Form1);einen Zeiger auf die "Form1".. oder nicht?
Wie gesagt es ist mehr ein Verständnis ProblemThx
BigNeal
-
void __fastcall TForm1::Test(TForm *Form)
erwartet einen Zeiger vom Typ Form*, nicht Form1*!!!

mach mal:
void __fastcall TForm1::Test(TForm1 *Form)
PS: Du must einen Zeiger der richtigen Komponente UND vom richtigen Typ uebergeben,
Woher soll der Zeiger Form* von 'Innereien' aus Form1* wissen?
-
[cpp]void __fastcall TForm1::Test(TForm *Form)
{
Form->GroupBox1->Caption ="Hallo Welt";
}
//---------------------------------------------------------------------------[/cpp]Aber hier castest Du zu der Basisklasse TForm. Dort befinden sich keine Elemente auf die zugreifen kannst! Das ist die LEERE Form, die DerAltenburger meint. Du kannst nur noch auf die Eigenschaften und Methoden zugreifen, die sich direkt in TForm befinden. Ändere das TForm in TForm1 und schau was passiert.
-

danke euch zwei.. ich glaube, da wirds mir langsam etwas klarer..
Jetzt stellt sich mir aber wieder ein Problem..
ich möchte die funktion aus verschiedenen "Forms" aufrufen können..
ich wollte den Parameter als Parent wert benutzen.
im Stil von:
[cpp]void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->Test(Form1) ;
}
void __fastcall TForm3::Button1Click(TObject *Sender)
{
Form2->Test(Form3->GroupBox1) ;
}void __fastcall TForm2::Test(xxx *Parent)
{
TLabel *Titel = new TLabel;
Titel->Parent = Parent
}[/cpp]
-
Da muss die Form in allen Modulen BEKANNT sein!
D.h.: Du musst die Headerdatei der Form in allen anderen includieren! Sonst ist der Typ (Form1) nicht bekannt.
-
jep, das habe ich vorher auch herausgefunden

es geht mir aber mehr um ein anderes Problem..
[cpp]void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form2->Test(Form1) ;
}
void __fastcall TForm2::Test(TForm1 *Form)
{
Form->GroupBox1->Caption = "Hallo Welt";
}[/cpp]
das klapt ja..
[cpp]void __fastcall TForm3::Button1Click(TObject *Sender)
{
Form2->Test(Form3) ;
}
void __fastcall TForm2::Test(TForm3 *Form)
{
Form->GroupBox1->Caption = "Hallo Welt";
}[/cpp]das ja auch... aber wie kann ich die Funktion Test(); so modifizieren, dass die Übergabeform egal ist.. d.h., dass bei der selben funktion Form1, oder Form 3 etc.. als parameter gebraucht werden kann?
-
Hallo,
Da hast du mehrere Möglichkeiten. Du könntest den Parameter in Test den Typ TForm (oder vielleicht auch TWinControl )geben und dann in Test auf den jeweils richtigen Typ casten (dynamic_cast). Eine andere Variante wäre die Funktion als Template zu schreiben, so dass der jeweils korrekte Typ zur Compilezeit bestimmt werden kann.
Wenn du allerdings nur ein Parent festlegen willst reicht auch TWinControl ohne internen Cast.ciao
-
hört sich gut an, und ich werde es auch gleich mal versuchen..aber mir schwirrt ne frage im kopf rum, die mir ärger ersparren könnte! darum stelle ich sie gleich mal..

müssen die Formen (bei den beiden Varienten von Braunstein) die, auf die Funktion test() zugreifen schon in der Funktion bekannt sein?
oder kann ich dan einfach mal mit der FormXY
Form2->test(FormXY);aufrufen?
-
Der Typ der Form muss bei der Definition bekannt sein. Bei der Deklaration nicht unbedingt. Hier reicht auch eine Vorwärtsdeklaration.
-
ok, wie gesagt ich werde es noch testen..
und das mit dem TWinControl für das Parent klappt auch superthx für die kleine Weiterbildung

BigNeal