guten tag..
ich hab mal wieder ein problem^^
dieses mal gehts um folgendes:
ich möchte folgende eigenschaften in eine unit tun, um sie (z.b. durch aufrufen einer prozedur mit parameter vom typ TForm (also dem sender)) an verschiedene formulare übergeben zu können^^
Ich muss ehrlich zugeben, die beispiele hab ich aus einem Buch kopiert, ein bisschen damit rumgespielt, aber nich wirklich verstanden^^
ich kann nur soviel sagen, dass ich die absicht habe, mehrere formulare als clients von form1 zu benutzen.. diese sollen erzeugt werden, wenn sie aufgerufen werden und beim schließen wieder vernichtet werden.. diese formulare (also form1 und alle anderen) sollen während dessen ein hintergrundbild erhalten, aber das is nebensächlich^^
ich stelle mir jetzt eine procedure vor, die etwa so aussieht:
Code:
procedure InitialisateForm(Form: TForm);//in der unit ausgelagert
procedure Form1.Button1Click(Sender:TObject);
var Form: TForm;
begin
InitialisateForm(Forschung);//im hauptformular, dynamische initialisierung für beliebige formulare..
end;
ich hoffe, es wird deutlich was ich gerne machen würde^^ und es wäre super, wenn jemand direkt code posten könnte, den ich verwenden kann als prozedur, da ich, wie gesagt, leider nicht ganz verstanden habe, was die von mir verwendeten prozeduren bezwecken^^
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Zitat:
und es wäre super, wenn jemand direkt code posten könnte, den ich verwenden kann als prozedur, da ich, wie gesagt, leider nicht ganz verstanden habe, was die von mir verwendeten prozeduren bezwecken^^
Das halte ich im übrigen für den ganz falschen Weg...
Ich muss aber gestehen, dass es mir nicht ganz leicht gewesen ist dein Problem zu verstehen. Deswegen weiß ich nicht ob ich mit meiner Antwort voll daneben liege. Das Wichtigste ist doch TForschung.CreateParams, oder? Denn zu anfangs bin ich auch davon ausgegangen, dass das WM_ERASEBKGND von TForm1 auch wichtig ist. Das würde die Sache dann etwas komplizierter machen.
Hier ein paar Hintergrundinfos.
CreateParams ist eine virtuelle Methode die vor dem Erstellen des Windows Fensters aufgerufen wird. An diese Methode werden die TCreateParams übergeben. Dort enthalten sind die Styles, die Erweiterten Styles und eine andere Eigenschaften des Fensters. Diese Styles kann man aber auch noch nachträglich setzen.
WM_ERASEBKGND ist eine Windowsbotschaft, die angibt, dass der Inhalt des Fensters gelöscht werden soll. Die Botschaften (ähnlich wie WM_PAINT oder WM_SIZE) müssen vom Fenster abgeholt werden. Das macht für uns aber bereits die VCL und es reicht diese Events an virtuelle Methoden weiter. Die die du benutzt hast. Da es sich nicht um eine Eigenschaft eines Fensters handelt muss diese immer im Code stecken und kann nicht nachträglich gesetzt werden.
Was kannst du jetzt tun um die Eigenschaften aus CreateParams zu setzen. Dazu gibt es zwei Methoden. GetWindowLong zum Erfragen eines Zustandes und SetWindowLong zum Setzen. Diese bekommen als ersten Parameter das Handle des Fensters (Form.Handle) und als zweites den Wert den man abfragen möchte. In deinem Fall wäre das GWL_STYLE. Also du musst den Wert erfragen. Bei dem erfragten Wert das Bit für WS_CHILD setzen und anschließend den Wert mit SetWindowLong wieder ans Fenster senden.
Das Parent des Fensters kannst du auch mit SetWindowLong setzen. Dann aber GWL_HWNDPARENT als zweiten Parameter und das Handle des Panels / Zielformulares als dritten Parameter. Oder aber du benutzt die Eigenschaft ParentWindow der Klasse TForm. Das sollte genau so gut funktionieren.
PS: Solltest du was nicht verstanden haben tu dir keinen Zwang und frag. Dann können wir das noch näher klären.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Moment. Sehe ich das gerade richtig, dass es darum geht, mittels VCL eine MDI (Multi Dialog Interface) Anwendung zu erstellen? Dafür gibt es doch schon vorgefertigte Eigenschaften, die das ganze Massiv erleichtern:
FormStyle := fsMDIForm für das Fenster, dass die anderen Fenster beeinhalten soll.
FormStyle := fsMDIChild für diejenigen Fenster, die innerhalb des fsMDIForm-Fensters sein sollen.
Es wird empfohlen, nur eine Form mit fsMDIForm in der Anwendung zu haben.
Die Sache mit den Styles ist die Methode, wie man es Non-VCL machen würde.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Auch wahr. Das gabs ja auch noch. Wobei MDI eher dazu dient, dass man ganze Formulare (Dokumente) innerhalb des gesammten Clientbereiches des Formulars hat. Je nachdem was man aber machen will macht es durchaus Sinn die Unterforms auf eine Komponente zu platzieren. Siehe MS Access bei der Erstellung von Abfragen über mehere Tabellen. Dort wären MDIs nicht praktikabel.
Aber sonst ja. Wenn es ein klassisches Gebiet für MDIs ist sollte man die eher auch verwenden.
PS: MDI und Parents/Childs sind 2 unterschiedliche Dinge. In Non-vcl gibt es MDI auch.
hallo,
vielen dank schonmal für die tipps ich muss ehrlich sagen, das hört sich sehr abstrakt an, da ich mit den ausgangsbefehlen schon nichts anfangen konnte^^
aber zumindest das mit dem formstyle habe ich hingekriegt, bei dem anderen kamen immer wieder neue fehler^^
aber theoretisch, wenn ich jedes formular einzeln als child einrichten, dadurch bräuchte ich gar keine unit mehr, das mit dem background kriege ich sowieso nich hin, in die unit auszulagern^^
blos einen nachteil hatte die methode, so wie ich sie probiert habe, dennoch..
wenn ich mehrere formulare als child verwende, und davon welche schließe, werden sie einfach minimiert und danach wieder maximiert..
ich würde sie gerne komplett schließen, damit ich beim nächsten aufruf die create procedure wieder nutzen kann^^ (diese initiiert die formulare durch das dynamische erstellen von images usw..)
und es sollte nach möglichkeit immer nur 1 child aktiv sein können, damit ich eine prozedur
Code:
procedure RegisterActiveForm(Sender: TForm);
nutzen kann, um immer das aktive formular zu setzen, aber das is auhc nich schlimm, wenn mehrere gleichzeitig aktiv sind.. nur, man sollte sie nach möglichkeit auch schließen können, damit die create procedure mehrfach genutzt werden kann..
ich hoffe, es wird klar, was ich machen will^^
und vielen dank nochmal für die bisherigen tipps
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.