Formularelemente zur Laufzeit verschieben



  • Hey @all,
    und zwar wollte ich mal fragen, ob es möglich ist, wenn ich auf einem Formular einen Button platziere, diesen dann zur Laufzeit beliebig herumziehen kann?

    Und wenn JA, wie?

    MfG Roman1311



  • Auf die Mausdown move und up-events reagieren und Left und Top der Kompo ändern?

    -junix



  • Sieh dir in der FAQ unter "Forms" mal das Thema "Controls per Drag'n Dop verschieben" an.



  • OK, also es funktioniert solange ich nur 1 Element habe, jedoch bei mehreren funktionierts nichtmehr. Die bleiben einfach stehen.

    Nun kurz zu meinem Vorhaben, ich probiere gerade eine Art Form-Designer, bei dem ich beliebige Elemente hinzufügen kann, und diese danach per Drag&Drop positionieren kann. Jedoch scheitert es wie gesagt am positionieren. Ein weiteres Problem was ich habe ist, das wenn ich auf ein Element klicke, ich dessen Name, usw. abfragen möchte. Das ganze liegt in einem Vector.

    In den beiden Unterformularen(fPreview und fObject) werden danach die Objekte, und die Eigenschaften angezeigt.

    Hier mal der bisherige Quellcode (fMain.cpp):

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "fMain.h"
    #include "fObject.h"
    #include "fPreview.h"
    #include <sstream>
    
    using namespace std;
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TfrmMain *frmMain;
    int scX=0, scY=0, scDyn=0;
    //---------------------------------------------------------------------------
    __fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) {
      frmMain->AutoSize = true;
      frmMain->AutoSize = false;
      frmMain->Left = 0;
      frmMain->Top = 0;
      frmMain->Width = Screen->Width;
    
      frmPreview = new TForm(Owner);
      frmPreview->Show();
    
      frmObject = new TForm(Owner);
      frmObject->Show();
    
      // Form Object
      frmObject->Left = 1;
      frmObject->Top = 130;
      frmObject->Height = 480;
      frmObject->Width = 135;
      frmObject->BorderStyle = bsToolWindow;
    
      // Form Preview
      frmPreview->Width = 400;
      frmPreview->Height = 400;
      frmPreview->Left =(Screen->Width-frmPreview->Width)/2;
      frmPreview->Top = (Screen->Height-frmPreview->Height)/2;
      frmPreview->BorderStyle = bsSizeToolWin;
    
      lType = new TLabel(Owner);
      lType->Parent = frmObject;
      lType->Left = 0;
      lType->Top = 0;
      lType->Caption = "Type: ";
    
      lIndex = new TLabel(Owner);
      lIndex->Parent = frmObject;
      lIndex->Left = 0;
      lIndex->Top = 20;
      lIndex->Caption = "Index: ";
    
      lName = new TLabel(Owner);
      lName->Parent = frmObject;
      lName->Left = 0;
      lName->Top = 40;
      lName->Caption = "Name: ";
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::updateForm() {
      for(unsigned int i=0; i<Elements.size(); i++) {
        Elements[i].Component->Show();
      }
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::ActionEventDown(TObject* Sender) {
      AnsiString t = Sender->ClassName();
    //  if(Sender->ClassName() == b->ClassName())
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::ActionEventUp(TObject* Sender) {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::ActionEventMove(TObject* Sender) {
    }
    
    void __fastcall TfrmMain::ActionEvent(TObject* Sender) {
      lType->Caption = "Type: " + Sender->ClassName();
      for(int i=0; i<Elements.size(); i++) {
        AnsiString tmpC = Sender->ClassName();
        string tmpClass = tmpC.c_str();
        if(tmpClass == Elements[i].ClassName) {
          string tmpName = dynamic_cast<TLabel*>(Sender)->Name.c_str();
          if(tmpName == Elements[i].Name) {
            string tmpStr = "Name: " + tmpName;
    /*        AnsiString Index;
            Index.cat_sprintf("Index: %d", Elements[i].Index);
    
            lIndex->Caption = Index;*/
            lName->Caption = tmpStr.c_str();
          }
        }
      }
    /*  if(Sender->Class
      lName->Caption = "Name: " + dynamic_cast<tmp*>(Sender)->Name*/
      /*
    *********************
    Sender->Classname
    *********************
    dynamic_cast<TButton*>(Sender)->Name
    *********************
    */
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TfrmMain::imgEditClick(TObject *Sender) {
      TEdit* tmp = new TEdit(frmPreview);
      tmp->Parent = frmPreview;
      tmp->Left = 0;
      tmp->Top = 0;
      tmp->Text = "";
      tmp->Enabled = false;
      tmp->Hide();
      tmp->OnDblClick = ActionEvent;
      tmp->OnMouseDown = bnDown;
      tmp->OnMouseUp = bnUp;
      tmp->OnMouseMove = bnMove;
      Elements.push_back(structElement(tmp, tmp->Name.c_str(), "TEdit"));
    
      updateForm();
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::imgLabelClick(TObject *Sender) {
      TLabel* tmp = new TLabel(frmPreview);
      tmp->Parent = frmPreview;
      tmp->Left = 0;
      tmp->Top = 0;
      tmp->Caption = "Label";
      tmp->Hide();
      tmp->OnDblClick = ActionEvent;
      tmp->OnMouseDown = bnDown;
      tmp->OnMouseUp = bnUp;
      tmp->OnMouseMove = bnMove;
      Elements.push_back(structElement(tmp, tmp->Name.c_str(), "TLabel"));
    //  Elements.push_back(tmp);
    
      updateForm();
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::bnDown(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    scX = X;
    scY = Y;
    scDyn = 1;
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::bnMove(TObject *Sender, TShiftState Shift, int X,
          int Y) {
      for(int i=0; i<Elements.size(); i++) {
        AnsiString tmpC = Sender->ClassName();
        string tmpClassName = tmpC.c_str();
        if(tmpClassName == Elements[i].ClassName) {
          string tmpName;
    
          if(tmpClassName == "TLabel*") {
            tmpName = dynamic_cast<TLabel*>(Sender)->Name.c_str();
          }
          else if(tmpClassName == "TButton") {
            tmpName = dynamic_cast<TButton*>(Sender)->Name.c_str();
          }
          else if(tmpClassName == "TEdit") {
            tmpName = dynamic_cast<TEdit*>(Sender)->Name.c_str();
          }
    
          if(tmpName == Elements[i].Name) {
            if(scDyn==1 && scX!=X)
              Elements[i].Component->Left = Elements[i].Component->Left + X - scX;
            if(scDyn==1 && scY!=Y)
              Elements[i].Component->Top = Elements[i].Component->Top + Y - scY;
          }
        }
      }
    }
    //---------------------------------------------------------------------------
    void __fastcall TfrmMain::bnUp(TObject *Sender, TMouseButton Button,
          TShiftState Shift, int X, int Y)
    {
    scDyn = 0;
    }
    
    void __fastcall TfrmMain::Image2Click(TObject *Sender) {
      TButton* tmp = new TButton(frmPreview);
      tmp->Parent = frmPreview;
      tmp->Left = 0;
      tmp->Top = 0;
      tmp->Caption = "Button";
      tmp->Hide();
      tmp->OnClick = ActionEvent;
    /*  tmp->OnMouseDown = bnDown;
      tmp->OnMouseUp = bnUp;
      tmp->OnMouseMove = bnMove;*/
      Elements.push_back(structElement(tmp, tmp->Name.c_str(), "TLabel"));
    //  Elements.push_back(tmp);
    
      updateForm();
    }
    //---------------------------------------------------------------------------
    

    und hier die Header:

    //---------------------------------------------------------------------------
    
    #ifndef fMainH
    #define fMainH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    #include <jpeg.hpp>
    #include <Menus.hpp>
    #include <Graphics.hpp>
    #include <ComCtrls.hpp>
    #include <ToolWin.hpp>
    #include <vector>
    #include <string>
    
    static int cIndex = 0;
    
    //---------------------------------------------------------------------------
    class TfrmMain : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TMainMenu *MainMenu1;
            TMenuItem *File1;
            TPanel *Panel1;
            TImage *Image1;
            TImage *imgEdit;
            TImage *imgLabel;
            TImage *Image2;
            void __fastcall imgEditClick(TObject *Sender);
            void __fastcall imgLabelClick(TObject *Sender);
            void __fastcall Image2Click(TObject *Sender);
    private:	// Anwender-Deklarationen
            struct structElement {
              TControl* Component;
              std::string ClassName;
              std::string Name;
    //          int Index;
    
              structElement(TControl* _Comp, std::string _Name, std::string _Class) :
                            Component(_Comp), Name(_Name), ClassName(_Class) {
    /*            cIndex++;
                Index = cIndex;*/
              }
            };
    
            TForm* frmObject;
            TForm* frmPreview;
            TLabel* lType;
            TLabel* lName;
            TLabel* lIndex;
            std::vector<structElement> Elements;
    public:		// Anwender-Deklarationen
            __fastcall TfrmMain(TComponent* Owner);
            void __fastcall ActionEventDown(TObject* Sender);
            void __fastcall ActionEventUp(TObject* Sender);
            void __fastcall ActionEventMove(TObject* Sender);
            void __fastcall ActionEvent(TObject* Sender);
            void __fastcall bnDown(TObject *Sender, TMouseButton Button,
                                   TShiftState Shift, int X, int Y);
            void __fastcall bnMove(TObject *Sender, TShiftState Shift, int X,
                                   int Y);
            void __fastcall bnUp(TObject *Sender, TMouseButton Button,
                                 TShiftState Shift, int X, int Y);
            void __fastcall updateForm();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TfrmMain *frmMain;
    //---------------------------------------------------------------------------
    #endif
    

    Vielen Dank im Voraus
    MfG Roman1311



  • Wie wärs wenn du selbst mal den Debugger bemühst statt hier das Forum ziellos mit dem ganzen Projektcode zuzuspammen?

    😉

    -junix


Anmelden zum Antworten