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;
    //---------------------------------------------------------------------------
    #endif
    

    der 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.


Anmelden zum Antworten