"snappende" Panels erstellen



  • Hallo allerseits!

    Mit untenstehendem Code erzeuge ich auf einem Panel (Panel1) beliebige neue Panels, die ich auch mit der Maus anklicken und frei herumschieben kann. So.

    Mein Problem ist nun folgendes: Ich möchte das die Panels untereinander so magnetisch "ransnappen", sobald man mit einem in die Nähe eines anderen Panels kommt. Wie kann ich das machen?

    void __fastcall TForm1::New1Click(TObject *Sender)
    {
         TPanel *pHelpPanel = new TPanel(this);
         pHelpPanel->Parent = Panel1;
         pHelpPanel->Top = 0;
         pHelpPanel->Left = 0;
         pHelpPanel->Width = 32;
         pHelpPanel->Height = 32;
         pHelpPanel->OnMouseDown = PanelMouseDown;
    //     pHelpPanel->DockSite = true;
    //     pHelpPanel->DragKind = dkDock;
    //     pHelpPanel->DragMode = dmAutomatic;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::PanelMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
    {
         ReleaseCapture();
         SendMessage((dynamic_cast<TPanel*>(Sender))->Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);
    }
    

    PS: Ja, ich weis, das die erstellten Panels noch deleted werden müssen ... 😃



  • Du hast doch in MouseDown die Koordinaten des Panels; wenn Du die Position aller anderen Panels kennst, kannst Du bei Erreichen eines bestimmten Grenzwertes Top und Left des verschobenen Panels ändern...



  • Ja, aber so müßte ich alle Panels durchsuchen und die Koordinaten vergleichen. Kann man das nicht schon mit den DragMode ... usw. Eigenschaften (Drag & Drop) irgendwie hinbekommen?



  • Vielleicht, ich habe so etwas noch nicht gemacht... 😕



  • Also, Ich habe das mal auf einem anderen Weg probiert:
    Auf einer Form habe ich ein Großes Panel1 = alClient, ein kleines Panel2 (zum Verschieben) und ein Image1. Die können jetzt mit einer beliebigen Rastergröße verschoben werden:

    *.h

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <Graphics.hpp>
    
    double Round(double dWert, int iGen);
    
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:    // Von der IDE verwaltete Komponenten
            TPanel *Panel1;
            TPanel *Panel2;
            TImage *Image1;
            void __fastcall Panel2MouseMove(TObject *Sender, TShiftState Shift,
              int X, int Y);
    private:    // Anwender-Deklarationen
    public:     // Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    *.cpp

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include <math.h> // für Power()
    #include <math.hpp> // für floor()
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Panel2MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
    {
         int Raster = 50;
         if (Shift.Contains(ssLeft))
         {
            TPoint P = Mouse->CursorPos;   // Globale Cursorpos rausfinden
            P = Panel1->ScreenToClient(P); // in Pos auf dem Panel1 umrechnen
    
            AnsiString TempStr = Sender->ClassName();
            if (TempStr == "TPanel")
            {
               Panel2->Top = Round(P.y/Raster, 1)*Raster;
               Panel2->Left = Round(P.x/Raster, 1)*Raster;
            }
            else if (TempStr == "TImage")
                 {
                    Image1->Top = Round(P.y/Raster, 1)*Raster;
                    Image1->Left = Round(P.x/Raster, 1)*Raster;
                 }
         }
    }
    //---------------------------------------------------------------------------
    double Round(double dWert, int iGen);
    {
           int dlPower10 = Power(10.0, iGen);
           return dWert >= 0 ? floor(dWert * dlPower10 + 0.5) / dlPower10 : ceil(dWert * dlPower10 - 0.5) / dlPower10;
    }
    

    [ Dieser Beitrag wurde am 31.01.2003 um 08:25 Uhr von F98 editiert. ]


Anmelden zum Antworten