Download für Formulare andocken Script !!
-
So habe es jetzt geschafft einen script zu schreiben um Formulare andocken zu lassen . Habe den Quellcode und die Projekt.exe gepackt. Wen es interessiert oder wer es braucht kann es sich hier runterladen.
Zum Download http://www.server-all.de/ip/Form_aneinander_docken.rar

Geschrieben mit Borland Builder 6
Bitte in FAQ verschieben.
-
schaut sehr nett aus danke..
mfg
|23|
-
Praetorianer_33 schrieb:
Bitte in FAQ verschieben.
Für die FAQ wäre es netter, wenn du den/die entsprechenden Code-Abschnitt(e) (schön kommentiert :)) plus entsprechender Beschreibung hier posten würdest.
Ggf. könnten so eventuelle Verbesserungen diskutiert werden, und wer kann schon garantieren, dass der Link in einem, sechs oder zwölf Monaten noch aktuell ist.Auf jeden Fall Danke für den guten Willen.
-
Jansen du hast recht
für den FAQ stelle ich es noch mal als Code hier rein. Ich denke mal das das reichen müsste. denkt daran auf Form 1 noch ein RadioGroup mit 3 Radiobutton zu erstellen
RadioButton1->Checked = true; Name: "Andocken von unten"
RadioButton2 Name: "Andocken von rechts"
Radiobutton3 Name: "Garnichts"Die Namen wurden von mir gewählt in der Reihenfolge wird auf Form 2 Die Andockung abgefragt behalte die Reiehenfolge bei bennenn könnt ihr die Button auf den Formular wie ihr wollt unten, rechts oder garnicht oder egal wie.

hier erst mal der Code aus der Unit1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Form2->Show(); // Anzeigen des Formular 2 auf Mouseklick } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // Festhalten und Verschieben des Formular per Mausklick ohne Rahmen ReleaseCapture(); SendMessage(Form1->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer2Timer(TObject *Sender) { // Ausgabe der Left Koordinaten beim verschieben Label3->Caption = Form1->Left; } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer3Timer(TObject *Sender) { // Ausgabe der Top Koordinaten beim verschieben Label4->Caption = Form1->Top; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { Application->Terminate(); // Programm beenden } //---------------------------------------------------------------------------Code Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TButton *Button1; TEdit *Edit1; TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TTimer *Timer2; TTimer *Timer3; TButton *Button2; TEdit *Edit2; TRadioGroup *RadioGroup1; TRadioButton *RadioButton1; TRadioButton *RadioButton2; TRadioButton *RadioButton3; void __fastcall Button1Click(TObject *Sender); void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Timer1Timer(TObject *Sender); void __fastcall Timer2Timer(TObject *Sender); void __fastcall Timer3Timer(TObject *Sender); void __fastcall Button2Click(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifder Code aus der Unit2.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit2.h" #include "Unit1.h" bool rechts = 0; // Variable zum Andocken der Auswahl bool unten = 0; // Variable zum Andocken der Auswahl //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm2 *Form2; //--------------------------------------------------------------------------- __fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm2::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // Auswahl von Form 1 des Radiobutton Abfrage"Andocken rechts" if(Form1->RadioButton2->Checked == true) { if( rechts == 0) // Abgleich der Variable ob andocken erlaubt 1 nicht andocken { // Bewgen des Fenster ohne Rahmen beim Mausklick ReleaseCapture(); SendMessage(Form2->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); // Vergleichen wann Angedockt wird if(Form1->Left <= Form2->Left) { // Wenn Koordinaten erreicht starten des Timers 3 Timer3->Enabled=true; if(Timer3->Enabled==true) { Button1->Enabled = false; Form1->Edit1->Text = "Form2 an Form 1 Angedockt"; Form1->Edit2->Text = "Angedockt von rechts"; } // Variable wird auf 1 Gesetzt und Fenster kann bei mausklick wieder abgedockt werden rechts = 1; } } else { Timer3->Enabled=false; ReleaseCapture(); SendMessage(Form2->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); Button1->Enabled = true; Form1->Edit1->Text = "Form2 an Form 1 Abgedockt"; Form1->Edit2->Text = "Abgedockt von rechts"; rechts = 0; } } // wie oben nur nicht von rechts docken sondern von unten Auswahl Form 1 "andocken von unten" if(Form1->RadioButton1->Checked == true) { if( unten == 0) { ReleaseCapture(); SendMessage(Form2->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); if(Form1->Top <= Form2->Top) { Timer4->Enabled=true; if(Timer4->Enabled==true) { Button1->Enabled = false; Form1->Edit1->Text = "Form2 an Form 1 Angedockt"; Form1->Edit2->Text = "Angedockt von unten"; } unten = 1; } } else { Timer4->Enabled=false; ReleaseCapture(); SendMessage(Form2->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); Button1->Enabled = true; Form1->Edit1->Text = "Form2 an Form 1 Abgedockt"; Form1->Edit2->Text = "Abgedockt von unten"; unten = 0; } } // Auswahl des Radiobutton "garnicht" auf Form 1 wenn nicht angedockt wird if(Form1->RadioButton3->Checked == true) { ReleaseCapture(); SendMessage(Form2->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); Form1->Edit1->Text = "Form2 an Form 1 nicht Andockbar"; Form1->Edit2->Text = "Nicht Andockbar"; } } //--------------------------------------------------------------------------- void __fastcall TForm2::Timer1Timer(TObject *Sender) { // Ausgabe der Left Koordinaten beim verschieben Label3->Caption = Form2->Left; } //--------------------------------------------------------------------------- void __fastcall TForm2::Timer2Timer(TObject *Sender) { // Ausgabe der Top Koordinaten beim verschieben Label4->Caption = Form2->Top; } //--------------------------------------------------------------------------- void __fastcall TForm2::Timer3Timer(TObject *Sender) { Form2->Left=Form1->Width + Form1->Left;// Angabe wo angedockt wird // Beibehalten der Seiten ohne das es sich verschiebtr gerades andocken Form2->Top=Form1->Top; } //--------------------------------------------------------------------------- void __fastcall TForm2::Timer4Timer(TObject *Sender) { Form2->Top=Form1->Height + Form1->Top; // Angabe wo angedockt wird // Beibehalten der Seiten ohne das es sich verschiebtr gerades andocken Form2->Left=Form1->Left; } //--------------------------------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { Form1->Edit1->Text = ""; //Leeren der Editfelder 1+2 Form1->Edit2->Text = ""; Form2->Close(); // Schließen des Formular 2 } //---------------------------------------------------------------------------Code Unit2.h
//--------------------------------------------------------------------------- #ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class TForm2 : public TForm { __published: // Von der IDE verwaltete Komponenten TLabel *Label1; TLabel *Label2; TLabel *Label3; TLabel *Label4; TTimer *Timer1; TTimer *Timer2; TTimer *Timer3; TTimer *Timer4; TButton *Button1; void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall Timer1Timer(TObject *Sender); void __fastcall Timer2Timer(TObject *Sender); void __fastcall Timer3Timer(TObject *Sender); void __fastcall Timer4Timer(TObject *Sender); void __fastcall Button1Click(TObject *Sender); void __fastcall FormCreate(TObject *Sender); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm2(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm2 *Form2; //--------------------------------------------------------------------------- #endif
-
Ohne Deine Mühe und Arbeit in Frage stellen zu wollen:
Ich hab' mal gelesen, dass Timer-Ressourcen nur beschränkt zur Verfügung stehen und man versuchen sollte mit so wenig Timern wie möglich auszukommen... Das war allerdings noch zu Win98-Zeiten. Wenn dem aber immer noch so ist, würde ich nur einen Timer pro Form einsetzen und mit Flags arbeiten.
-
1. wozu issn der timer gut. kann man viel eleganter auch ohne machen, z.B mit WM_WINDOWPOSCHANGED
2. weg mit dem globalen variablen gesocks
-
Habe das jetzt mal getestet und bin von dem Timer-Ansatz auch nicht so recht begeistert.
Polling, also das regelmässige Abfragen bestimmter Zustände, sollte immer nur eine Notlösung sein. Besser wäre es, wenn ein Objekt selbst auf eine Zustandsänderung reagiert, und mit den Windows-Messages ist das ja auch im vorliegenden Fall kein grosses Problem. Hier mal ein Ansatz über das Abfangen der WM_MOVE-Nachricht, siehe auch den entsprechenden FAQ-Eintrag im Abschnitt "System".
#ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); // unser eigener Messagehandler protected: void __fastcall wmFormMove(TMessage&); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_MOVE, TMessage, wmFormMove); END_MESSAGE_MAP(inherited) }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { // Form2 anzeigen und rechts "andocken" Form2->Left = Left + Width; Form2->Top = Top; Form2->Show(); } //--------------------------------------------------------------------------- void __fastcall TForm1::wmFormMove(TMessage& Msg) { // auf WM_MOVE für Form1 reagieren und Form2 (so sie existiert) mitbewegen if (Form2) { Form2->Left = Left + Width; Form2->Top = Top; } // Nachricht weiterreichen inherited::Dispatch(&Msg); } //---------------------------------------------------------------------------Bei der zweiten Form gibt es nichts weiter zu beachten; wenn man möchte, dass beim Verschieben dieser auch Form1 bewegt wird dann muss man eben auch in Unit2 einen entsprechenden Messagehandler einrichten.