Form - Parent - Problem
-
Forms haben gar keinen Parent...
-
Forms haben gar keinen Parent...
Haben sie jawohl !

-
Dann prüf es doch einfach mal mit dem Debugger...
-
Hallo,
TForm kann sehr wohl einen Parent haben. Lediglich bei Forms die direkt auf dem Windows-Desktop liegen (wohl die Meisten) ist Parent gleich NULL (siehe Borland Hilfe):
Ciao
-
So, wenn ich statt:
Form2->Parent = this;folgendes probiere:
Form2->SetParent(this);kommt
[C++ Fehler] Unit1.cpp(24): E2247 Zugriff auf '_fastcall TCustomForm::SetParent(TWinControl *)' nicht möglich
Steht auch so in der Hilfe, das das so sein muss.

-
SetParent ist in TForm privat. Du kannst also so nicht darauf zugreifen. Allerdings wird sie bei der Zuweisung Parent = this intern ohnehin aufgerufen. Parent ist ja eine Property.
__property TWinControl* Parent = {read=FParent, write=SetParent};
-
Wenn man die Hilfe aufmerksam liest, steht da bei Parent was von eingebetteten Forms. Das ist hier wohl nicht der Fall, ergo muss Parent = NULL bleiben.
-
Yo, hab ich schon gelesen.
Trotzdem ist mir nicht klar was das damit zu tun hat, ob ich den Parent setze oder nicht, ob das Fenster focusiert werden kann, oder nicht.

-
@Joe_M.
Wenn der Parent !=NULL ist, dann ist die Form eingebettet.
@F98
Da es bei Parent = NULL geht und anders nicht, muss es ja irgendwas damit zu tun haben. Ich weis allerdings auch nicht was.
Musst du die andere Form unbedingt in der Elternform bewegen ?
Wenn nicht, sollte ja auch ein TFrame reichen.
Wenn doch, müsstest du wohl Parent auf NULL setzen und WM_MOVE oder WM_MOVING abfangen und die Positionen überprüfen und ggf. setzen.
-
Hm. Das mit dem WM_MOVE hat mich auf die Idee gebracht, einfach ein TPanel zu nehmen und dort mit OnMouseMove zu reagieren. Diese Elemente kann man dann auch innerhalb des Fensters schön rumschieben.
Der Hintergrund der ganzen Geschichte ist, dass ich die GDI-Objekte in einer Simulationsanwendung von ca. 4600 auf ein Minimum reduzieren muss, da ich, sobald die Magische Grenze überschritten wird, GDI-Failures ohne Ende bekomme. Anscheinend kann Windows nicht mehr als ca. 4600 Fenster verarbeiten.
-
F98 schrieb:
So, wenn ich statt:
Form2->Parent = this;folgendes probiere:
Form2->SetParent(this);kommt
[C++ Fehler] Unit1.cpp(24): E2247 Zugriff auf '_fastcall TCustomForm::SetParent(TWinControl *)' nicht möglich
Steht auch so in der Hilfe, das das so sein muss.

**************************************************************
Du solltest ja auch::SetParent(ChildHandle,NewParentWinHandle);
probieren.

-
Eine Triumph-Fanfare für den Altenburger!!!!
[cpp]
Form2 = new TForm(Application);
Form2->Parent=NULL;
::SetParent(Form2->Handle,this->Handle);
Form2->BorderStyle = bsSizeable;
Form2->Left=random(100);
Form2->Top=random(100);
Form2->Height=300;
Form2->Width=300;TEdit *Edit = new TEdit(Form2);
Edit->Top = 0;
Edit->Left = 0;
Edit->Parent = Form2;Form2->Show();
[/cpp]Da muss man erst mal drauf kommen!
Mir ist aber immer noch unklar, warum der selbe Effekt nicht mit einem simplen Form2->Parent=this; funktioniert.
-
Ich denke mal:
Form->Parent ... ist ne Borland Anpassung der WinApi- Funktion SetParent
::SetParent ruft die WinApi- Funktion von Windows!
-
... und wieder mal schlecht umgesetzt, wie bei "Scaled=true"!
