Announcement

Collapse
No announcement yet.

Panel/Image/Label verschieben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Panel/Image/Label verschieben

    Ich will ein Panel (oder auch Image oder Label) mit der Maus "ziehen" oder es auf eine andere (bestimmte) Position verschieben (während der Laufzeit).
    Ich wollte es mit drag&drop versuchen.
    Kann mir vielleicht jemand sagen, wie das funktioniert oder wie eine allgemeine drag&drop-Anweisung im Quelltext aussieht? Habe schon in der Delphi-Hilfe nachgesehen aber das hat mir auch nicht geholfen.

    Alternativen wären auch okay.
    Es geht jedenfalls darum, ein Objekt an eine andere Position zu bringen.

    Ich hoffe mir kann jemand helfen

  • #2
    Drag und Drop ist m.E. unnötig. Arbeiten mit MouseDown/MouseUp und MouseMove sowie merken ob gedrück und bei MouseMove die letzte Postions zur Diff-bestimmung sollte genügen.

    Comment


    • #3
      danke für die antwort aber das hilft mir nicht viel weiter
      ich kenne das mit mousemove und so nicht... hast du vielleicht mal ein beispiel? oder eben die allgemeine vorschrift, wie man das im quelltext schreibt wäre super

      Comment


      • #4
        MouseDown setzt ein Flag auf true

        MouseMove prüft das Flag und wenn das Verschieben erfolgen soll, werden die neuen X/Y Positionen des gewünschten Objektes anhand der Mausposition gesetzt

        MouseUp löscht das Flag
        Christian

        Comment


        • #5
          aha und wie sieht das dann konkret aus? also ich weiß immer noch nicht, wie ich das im quelltext schreibe =(

          Comment


          • #6
            oder eben die allgemeine vorschrift, wie man das im quelltext schreibt wäre super
            Das war die "allgemeine Vorschrift"

            Was hast du bisher dazu programmiert?

            Was verstehst du nicht?

            OnMouseDown?
            Flag?
            Christian

            Comment


            • #7
              Bis jetzt habe ich nur die Objekte (Panels) die ich an eine andere Stelle verschieben will erstellt und programmiert, wann sie sichtbar sind, bzw. wieviele angezeigt werden sollen.

              Was OnMouseDown macht, habe ich verstanden (denke ich mal) - ich weiß nur nicht, wie ich das konkret in Quelltext umsetze...

              Comment


              • #8
                Nun, dann

                - definiere ein globales boolesches Flag
                - setze diese im Down auf true
                - setze diese im Up auf false
                - prüfe im Move aud true und setze das Object auf die Mousekoordinaten
                - dann fehlt noch die Visialisierung des Moves
                Christian

                Comment


                • #9
                  okay aber das kann ich ja nicht so in den quelltext schreiben xD

                  was ist denn ein globales boolesches flag?

                  kann es sein, dass ich bei mousedown und so klassen verwenden muss?
                  Zuletzt editiert von Kullerkeks; 08.03.2009, 15:13.

                  Comment


                  • #10
                    kann es sein, dass ich bei mousedown und so klassen verwenden muss?
                    Nein

                    was ist denn ein globales boolesches flag?
                    Grundlagen der Programmierung
                    Eine Variable die global verfügabr ist und vom Typ bool ist
                    Christian

                    Comment


                    • #11
                      Hier ein gutes Beispiel (Swiss DelphiCenter):

                      Für Komponenten die verschoben werden sollen werden einfach die Ereignisse
                      OnMouseDown, OnMouseMove, OnMouseUp auf die entsprechenden Handlerroutinen
                      ControlMouseDown(..), ControlMouseMove(..), ControlMouseUp(..) gesetzt.

                      http://www.swissdelphicenter.ch/de/showcode.php?id=429

                      Viele Grüße
                      Gary

                      Comment


                      • #12
                        Hi,

                        Hier eine ganz kurze Form der Lösung. Irgendwann mal gefunden...

                        Panel1 auf Form1

                        procedure TForm1.Panel1MouseMove(Sender: TObject; Shift:
                        TShiftState; X, Y: Integer);
                        const
                        SC_DragMove = $F012; //magische Zahl !!!
                        begin
                        if (ssShift in Shift) and (ssLeft in Shift) then
                        begin
                        ReleaseCapture;
                        TControl(Sender).perform(WM_SysCommand, SC_DragMove, 0);
                        end;
                        end;

                        Lotomax

                        Comment

                        Working...
                        X