Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 07, 2025 19:14

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Mär 26, 2008 05:05 
Offline
DGL Member

Registriert: Sa Jan 13, 2007 18:39
Beiträge: 15
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^^

Code:
  1. procedure CreateParams(var Params: TCreateParams); override;
  2. procedure WMEraseBkgnd(var Msg: TMessage); Message WM_EraseBkgnd;
  3.  
  4. implemention
  5.  
  6. procedure TForm1.CreateParams;
  7. begin
  8.   inherited;
  9.   Params.ExStyle:=Params.ExStyle or Ws_Ex_AppWindow;
  10. end;
  11.  
  12. procedure TForm1.WMEraseBkgnd;
  13. var rec: TRect; newBr: THandle;
  14. begin
  15.   rec.Left:=0;
  16.   rec.Top:=0;
  17.   rec.Right:=ClientWidth;
  18.   rec.Bottom:=ClientHeight;
  19.   newBr:=CreatePatternBrush(Image1.Picture.Bitmap.Handle);
  20.   FillRect(Image2.Canvas.Handle, Rec, newBr);
  21.   DeleteObject(newBr);
  22.   Msg.Result:=0;
  23. end;
  24.  
  25. procedure TForm1.Button1Click(Sender: TObject);
  26. begin
  27.   if Forschung=nil then Forschung:=TForschung.Create(Application);
  28.   Forschung.Windowstate:=wsMaximized;
  29.   Forschung.Show;
  30. end;
  31.  
  32. procedure TForschung.CreateParams(var Params: TCreateParams);
  33. begin
  34.   inherited CreateParams(Params);
  35.   with Params do begin
  36.   Style:=Style or Ws_Child;
  37.   wndparent:=Form1.Panel1.Handle;
  38.   end;
  39. end;


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:
  1. procedure InitialisateForm(Form: TForm); //in der unit ausgelagert
  2.  
  3. procedure Form1.Button1Click(Sender: TObject);
  4. var Form: TForm;
  5. begin
  6.   InitialisateForm(Forschung); //im hauptformular, dynamische initialisierung für beliebige formulare..
  7. 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^^

vielen dank schonmal im vorraus :roll: :D


// Edit Lossy: Code durch Pascaltags ersetzt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 26, 2008 09:26 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 26, 2008 10:46 
Offline
DGL Member
Benutzeravatar

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 networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 26, 2008 11:04 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 26, 2008 16:38 
Offline
DGL Member

Registriert: Sa Jan 13, 2007 18:39
Beiträge: 15
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:
  1. 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 :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]