WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Objekt in GUI verschieben

 

Laura2go
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.02.2012, 17:19     Titel: Objekt in GUI verschieben
  Antworten mit Zitat      
Hallo Leute,
erstmal großen Dank für eure hilfreichen Beiträge! Dank dieser Community habe ich als blutiger Matlab Anfänger schon vieles hier lernen und für meine GUI umsetzen können!

Aber zu folgenden Problem habe ich leider keine Lösung finden können und hoffe jetzt auf eure Unterstützung:

Ich möchte ein Objekt (uipanel) durch drag'n'drop bewegen bzw. versetzen können. Bisher habe ich leider kein Erfolg gehabt. Meine beste Lösung war bislang, dass ich das Objekt durch anklicken bewegen konnte. Also über die ButtonDownFcn und get(gcf,'Position) die Position des Objekts zu verändern.

Wie kann ich das Objekt über drag'n'drop versetzen? Die Forensuche hat mir leider nicht weiterhelfen können.
Private Nachricht senden Benutzer-Profile anzeigen


Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 27.02.2012, 17:13     Titel:
  Antworten mit Zitat      
Hey,

eine Suche bei google liefert dir eine ausreichende Antwort:

http://www.mathworks.de/support/sol.....=ML&solution=1-4DNMFD

Code:

function drag_drop

dragging = [];
orPos = [];
f = figure('WindowButtonUpFcn',@dropObject,'units','normalized','WindowButtonMotionFcn',@moveObject);
a = uipanel('position',[0.2 0.2 0.2 0.2],'Title','Hello','ButtonDownFcn',@dragObject);
    function dragObject(hObject,eventdata)
        dragging = hObject;
        orPos = get(gcf,'CurrentPoint');
    end
    function dropObject(hObject,eventdata)
        if ~isempty(dragging)
            newPos = get(gcf,'CurrentPoint');
            posDiff = newPos - orPos;
            set(dragging,'Position',get(dragging,'Position') + [posDiff(1:2) 0 0]);
            dragging = [];
        end
    end
    function moveObject(hObject,eventdata)
        if ~isempty(dragging)
            newPos = get(gcf,'CurrentPoint');
            posDiff = newPos - orPos;
            orPos = newPos;
            set(dragging,'Position',get(dragging,'Position') + [posDiff(1:2) 0 0]);
        end
    end
end
 


Habe einfach das annotation Objekt gegen ein uipanel ausgetauscht.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.02.2012, 22:12     Titel:
  Antworten mit Zitat      
Erst einmal vielen Dank Marco! Ich hatte das Beispiel mit einer Textbox auch bereits mit google finden können. Mein Problem ist leider nach wie vor, dass ich dies nicht auf meine gui anwenden kann. Ich schaffe es nicht daraus eine function zu definieren, um schließlich alle meine uipanels beweglich zu machen. Ist das überhaupt möglich?
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 28.02.2012, 10:01     Titel:
  Antworten mit Zitat      
Hey,
Zitat:

Ich schaffe es nicht daraus eine function zu definieren

verstehe ich nicht. Was meinst du damit? Hast du mit GUIDE eine GUI erstellt und weißt nicht wie du die oben beschriebene Prozedur implementieren sollst?

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2012, 12:09     Titel:
  Antworten mit Zitat      
Ja das ist mein Problem. Ich verstehe die beiden Zeilen a=... f=... nicht so ganz bzw. kann ich diese nicht für mich umsetzen. In meinem Fall muss ich das doch anders realisieren. Mein uipanel in der gui hat zwar eine Buttondownfct aber keine Buttonmotionfct oder verstehe ich das falsch?
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 28.02.2012, 13:35     Titel:
  Antworten mit Zitat      
Hey,
im Beispiel oben wird mit nested functions gearbeitet. Bei GUIDE generierten code nicht. Dementsprechend müsstest du es natürlich anpassen. Entweder machst du das im GUIDE, also die passenden Callbacks definieren oder in der opening fcn. Die beiden Variablen dragging und orPos könntest du in das handles Struct mit integrieren und kannst diese dann auch in allen Callbacks aufrufen und verändern.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.02.2012, 22:22     Titel:
  Antworten mit Zitat      
Hallo Marco,
entschuldige, aber ich habe es leider nach langem rumprobieren immer noch nicht hinbekommen Sad

Zitat:
Die beiden Variablen dragging und orPos könntest du in das handles Struct mit integrieren

Ist das hier an der richtigen Stelle?
Code:
% Update handles structure
guidata(hObject, handles);
dragging = [];
orPos = [];

Die dragObject Funktion habe ich einfach durch die ButtonDownFunc des uuipanels ersetzt:
Code:
function TEST_ButtonDownFcn(hObject, eventdata, handles)
        dragging = hObject;
        orPos = get(gcf,'CurrentPoint');

In die OpeningFct hätte ich jetzt sowas geschrieben:
Code:
set(handles.TEST,'WindowsButtonUpFcn', ...
{@dropObject,handles});
set(handles.TEST,'WindowButtonMotionFcn',...
{@moveObject,handles});

Aber leider existiert für ein uipanel weder das Attribut WindowsButtonUpFcn noch WindowButtonMotionFcn. Wie kann ich das substituieren?
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 28.02.2012, 23:01     Titel:
  Antworten mit Zitat      
Hey,

Code:

% in deiner Opening fcn
handles.dragging = [];
handles.orPos = [];
% figure callbacks setzen
set(hObject,'WindowButtonUpFcn',@dropObject,'WindowButtonMotionFcn',@moveObject);
% uipanel callback setzen
set(handles.uipanel1,'ButtonDownFcn',@dragObject);

guidata(hObject,handles)

% callbacks hinzufügen
function dragObject(hObject,eventdata)
handles = guidata(gcf);
handles.dragging = hObject;
handles.orPos = get(gcf,'CurrentPoint');
guidata(gcf,handles);

function dropObject(hObject,eventdata)
handles = guidata(gcf);
        if ~isempty(handles.dragging)
            newPos = get(gcf,'CurrentPoint');
            posDiff = newPos - handles.orPos;
            set(handles.dragging,'Position',get(handles.dragging,'Position') + [posDiff(1:2) 0 0]);
            handles.dragging = [];
            guidata(gcf,handles)
        end

function moveObject(hObject,eventdata)
handles = guidata(gcf);
        if ~isempty(handles.dragging)
            newPos = get(gcf,'CurrentPoint');
            posDiff = newPos - handles.orPos;
            handles.orPos = newPos;
            set(handles.dragging,'Position',get(handles.dragging,'Position') + [posDiff(1:2) 0 0]);
            guidata(gcf,handles)
        end

 

Soetwas in dieser Art sollte es sein. Dem Panel weist du nur die ButtonDownFcn zu, denn das hat wie du schon gemerkt hast die anderen nicht. Die anderen Callbacks weist du der figure zu...

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.02.2012, 19:24     Titel:
  Antworten mit Zitat      
Vielen Dank Marco! Es funktioniert! Super!

Leider habe ich das Problem, dass die Größe meiner Panels auf 'normalize' eingestellt sind und wenn ich ein solches Panel versuche zu bewegen, dann verschwindet das Panel. Ändere ich diese Einstellung, dann kann ich problemlos die Panels verschieben. Confused
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2012, 00:12     Titel:
  Antworten mit Zitat      
Meine Idee ist vor dem Ausführen der dragObject Funktion die Größe des uipanels von 'normalized' beispielsweise in 'pixels' umzuwandeln. Dazu habe ich folgendes versucht:
Code:
set(hObject,'Units','pixels');

Leider ohne Erfolg Sad Vielleicht hat noch jemand eine bessere Idee.
Private Nachricht senden Benutzer-Profile anzeigen
 
Marco H.
Forum-Guru

Forum-Guru


Beiträge: 404
Anmeldedatum: 12.11.10
Wohnort: Dortmund
Version: 2010a/2012b
     Beitrag Verfasst am: 01.03.2012, 09:38     Titel:
  Antworten mit Zitat      
Hey,

du musst natürlich zusehen, dass sowohl Figure wie auch das zu bewegende Objekt die gleichen Units aufweisen z.B. normalized.

Greetings
Private Nachricht senden Benutzer-Profile anzeigen
 
Laura2go
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 25.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.03.2012, 12:23     Titel:
  Antworten mit Zitat      
Ich kann mich nur wiederholen. Vielen Dank Marco! Ich wäre niemals darauf gekommen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.