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

Innenfläche von einer Figure wird falsch interpretiert

 

stealth_mx
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 17.03.2015, 14:14     Titel: Innenfläche von einer Figure wird falsch interpretiert
  Antworten mit Zitat      
Hallo zusammen mir ist schon vor ein paar Tagen der folgende Effekt aufgefallen. Ich finde dazu leider keine Lösung.

Ich habe ein Fenster:

Code:
figObj = figure(...
                'Visible',                 'off',...
                'Position',               [100,100,333,390],...
                'Menubar',              'none',...
                'Resize',                 'on',...
                'CloseRequestFcn',  @closefunction);


Also beim Erstellen ist Resize ON, ich positioniere die Elemente und richte mich nach den inneren 333px. Jetzt setzte ich Resize OFF, weil das Fenster nicht skaliert werden soll. Plötzlich habe ich rechts 10px mehr. Die Arbeitsfläche hat sich in x und y vergrößert. Sieht natürlich blöd aus.

Ich denke mir gut, dann passe ich es einfach an und subtrahiere von den 333 genau die 10px ab. (also 323px Innenmaß). Nun sieht es gut aus und alles passt (aktiv zeigt er mir 333px an). Arbeite damit 2 Tage und alles passt weiterhin. Nun starte ich Matlab und plötzlich schneidet er mir was von der Fläche ab. D.h. manchmal gibt er mir bei Resize OFF die tatsächlichen 333px und manchmal 343px. Das ist tritt leider von Tag zu Tag anders auf. Jedes mal passe ich es und am nächsten Tag interpretiert er Resize OFF wieder anders.

Bis jetzt habe ich es nicht geschafft das Problem richtig zu reproduzieren.

Jetzt z.B. gebe ich 333px Innenmaß an und erhalte bei ResizeOff aber 343px. (Ziehe natürlich die 10px ab damit es rechts sauber abschneidet) In zwei Tagen oder auf der 2014 oder auf einem anderen Computer mit der gleichen Version interpretiert er die 333px richtig und da ich 10px abgeschnitten habe fehlen diese plötzlich. Question Shocked

Der Effekt zieht sich durch alle Fenster.

Weiß einer was hier falsch läuft?

resizeOff.png
 Beschreibung:

Download
 Dateiname:  resizeOff.png
 Dateigröße:  5.52 KB
 Heruntergeladen:  314 mal
resizeOn.png
 Beschreibung:

Download
 Dateiname:  resizeOn.png
 Dateigröße:  6.26 KB
 Heruntergeladen:  282 mal
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 17.03.2015, 15:29     Titel: Re: Innenfläche von einer Figure wird falsch interpretiert
  Antworten mit Zitat      
Hallo stealth_mx,

Wozu erzeugst Du das Fenster überhaupt mit 'Resize' 'on'? Setze es doch gleich auf 'off'.

Zitat:
Jetzt setzte ich Resize OFF

Dann zeige bitte, wie Du das machst. Denn genau hier könnte der Fehler liegen.

Zitat:
Plötzlich habe ich rechts 10px mehr.

Dies wäre der erste Fall, der mir begegnet ist, bei dem Matlab etwas "plötzlich" macht. In allen anderen Fällen hat Matlab immer nur das gemacht, was explizit in einem Befehl steht.
Darum behaupte ich auch hier: Wenn sich die Figure 'Position' ändert, wird dies explizit im Code so getan. Suche also nach der Zeile, die dies macht, und entferne sie.

Es gibt einen Grund für die beiden unterschiedlichen Verhalten. Üblicherweise findet man solche Gründe z.B. mit dem Debugger: Gehe zeilenweise durch den Code, bis die Zeile auffällt, die das Verhalten ändert.
Es gibt keine Möglichkeit, dass ein Leser im Forum den Grund erraten kann.

Zitat:
D.h. manchmal gibt er mir bei Resize OFF die tatsächlichen 333px und manchmal 343px.

Solche Text-Beschreibungen verbergen oft die Gründe für die Beobachtungen. "Er gibt mir bei Resize OFF" kann eine Menge unterschiedlicher Dinge bedeuten. Besser:
Code:
get(FigureHandle, 'Position', 'Resize');


Zitat:
Jedes mal passe ich es und am nächsten Tag interpretiert er Resize OFF wieder anders.

Ganz bestimmt nicht. Matlab handelt nicht nach Tagesform oder Laune. Es ist nicht klar, was "Resize OFF interpretieren" bedeutet.

Viel Erfolg beim Suchen, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 17.03.2015, 15:43     Titel:
  Antworten mit Zitat      
Hi,
ich präzisiere nochmal:

also beim erstmaligen erstellen (beim Programmieren des GUIs) habe ich natürlich am figure nur das nötigste eingegeben. Resize habe ich ausgelassen. Standard ist jedoch, dass Resize auf ON ist. Ich kann ja die Figure skalieren. Folglich habe ich alles an die tatsächlichen 333px angepasst.

Also ich dann das Fenster fertig gebaut habe (Also alle Funktionen und Buttons etc), habe ich die Feinheiten eingestellt unter anderem auch Resize OFF gesetzt. Während des Ausführens verändere ich nichts an der Größe, oder der Einstellungen. Das einzige was ich in der Richtung mache ist das zentrieren des Fensters.

D.h. beim öffnen des Fensters ist es natürlich direkt auf OFF. Habe mich etwas falsch ausgedrückt.

Nochmal zum eigentlichen Kern, der vielleicht auch die Lösung bringt:

Wenn ich Resize OFF setze habe ich 10px mehr an Breite bzw Höhe. Bei Resize ON hingegen erhalte wirklich genau die Anzahl an Pixel die ich der Figure beim erstellen übergebe. Siehe Bilder. Ist das normal?
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 17.03.2015, 15:47     Titel:
  Antworten mit Zitat      
Hier nochmal alle Veränderungen die ich vornehme. Bzw aufrufe.

Code:
figObj = figure('Visible',          'off',...
                'Position',         [100,100,360,390],...
                'Menubar',          'none',...
                'Name',             'Name',...
                'DockControls',     'off',...
                'WindowStyle',     'normal',...
                'Color',            [.94 .94 .94],...
                'Tag',              'test',...
                'Resize',           'off',...
                'NumberTitle',      'off',...
                'CloseRequestFcn',  @closefunction);

% a wird für die Positionierung von Elementen benötigt            
a = get(gcf,'Position');

% Später nach dem Erstellen der Buttons etc

movegui(figObj,'center');
set(figObj,'Visible','on');


Unten nochmal der direkte Vergleich einmal ON (das kleinere) und einmal OFF

Ausgabe der Position:

Code:
>> test

ans =

   780   384   360   390

>> test

ans =

   780   384   360   390


vergleich.png
 Beschreibung:

Download
 Dateiname:  vergleich.png
 Dateigröße:  66.27 KB
 Heruntergeladen:  343 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 17.03.2015, 16:16     Titel:
  Antworten mit Zitat      
OK ich habe gerade etwas festgestellt.

Wenn ich bereits am Anfang Visible auf ON setze bekomme ich stets die richtige Größe

Also die echten inneren 360px (habe von 333 auf 360 vergrößert).

Jetzt ist es egal ob Resize OFF oder ON.


Wenn ich am Anfang auf Visible Off setze und erst nach dem erstellen der Buttons das ganze auf Visible ON setzte, bekomme ich die verschiedenen Größen.

Vielleicht hilft die Info
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.03.2015, 12:10     Titel:
  Antworten mit Zitat      
Hallo stealth_mx,

Zitat:
Wenn ich am Anfang auf Visible Off setze


Mir bleibt das Problem immer noch unklar. Sprichst Du davon, wie Du das FIG-File in GUIDE erstellst oder geht es um einen FIGURE-Befehl im Code?
An welchem "Anfang" setzt Du die Visible-Eigenschaft?

Zitat:
Hier nochmal alle Veränderungen die ich vornehme. Bzw aufrufe.

Hier bin ich vollkommen verloren: Wo nimmst Du diese Änderungen vor, wann, warum und was beobachtest Du genau?

Zitat:
Unten nochmal der direkte Vergleich einmal ON (das kleinere) und einmal OFF

Ausgabe der Position:
Code:
>> test
ans =
   780   384   360   390

>> test
ans =
   780   384   360   390

Hier fehlt nun noch der Befehl, mit dem Du diese Werte erhältst. Zumindest scheinen beide "test"-Werte gleich zu sein. Aber was erklärt das? Ich dachte, Du siehst einen Unterschied.

Ich kann Deiner bisherigen Problem-Beschreibung nicht folgen. Für eine hilfreiche Antwort wäre es wichtig nachvollziehen zu können, welche Befehle Du genau ausführst. Am besten wäre ein lauffähiger Code, der das Problem reproduziert. Mal ein einzelnes Detail von den Inputs, mal eines von den Beoabchtungen reicht nicht, um ein vollständiges Bild zu bekommen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 18.03.2015, 12:49     Titel:
  Antworten mit Zitat      
Hi, es ist vollkommen ohne GUIDE aufgebaut worden.

ich habe mal das Beispiel nachgebaut, erklärt vielleicht besser das Problem:

Code:
function nutzlos()

figObj = figure('Visible',          'off',...
    'Position',         [100,100,360,390],...
    'Menubar',          'none',...
    'Name',             'asd',...
    'DockControls',     'off',...
    'WindowStyle',     'normal',...
    'Color',            [.94 .94 .94],...
    'Tag',              'testTag',...
    'Resize',           'off',...
    'NumberTitle',      'off');
a = get(gcf,'Position');

% Objects
figMenu = uimenu(figObj,'label','File');
figMenuNew = uimenu(figMenu,'label','New');

uimenu(figMenuNew,...
    'label',        'New Project',...
    'Callback',     @MenuProject_Callback);

uicontrol(...
    'Style',            'text',...
    'Position',         [5 a(4)-30 220 20],...
    'Foregroundcolor',  [.3 .3 .3],...
    'HorizontalAlignment','left',...
    'FontWeight',       'bold',...
    'String',           'Test');

% Hier kommen noch viele Objekte hinzu...

movegui(figObj,'center');
set(figObj,'Visible','on');


Einfachmal ausführen und einmal mit OFF und ON die größe anschauen.

Hier ist das so, dass wenn ich am Anfang Visible OFF setze ich nicht die 360px bekomme sondern 370px. Sowohl Resize als auch Visible haben einen Einfluss auf die tatsächliche Größe. Und das Probem dabei ist wenn ich es auf einem anderen Rechner starte interpretiert er das anders, sodass dort bei Visible OFF und Resize OFF ich die Größe von 360px bekomme.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.03.2015, 22:35     Titel:
  Antworten mit Zitat      
Hallo stealth_mx,

Ja, das sieht wie ein Bug aus. Unter Matlab 2011b hilft es, MOVEGUI erst aufzurufen, wenn die 'Visible'-Eigenschaft der Figure auf 'on' gesetzt worden ist.
Code:
set(figObj,'Visible','on');
movegui(figObj,'center');

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
stealth_mx
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 94
Anmeldedatum: 15.06.13
Wohnort: ---
Version: 2013b
     Beitrag Verfasst am: 26.03.2015, 11:03     Titel:
  Antworten mit Zitat      
Hallo Jan,

ja das kann daran liegen. In 2014 scheint dieser Bug nicht mehr vorzukommen.

Ja mit dem erst Visible scheint es zu funkionieren, hat leider nur einen kleinen Schönheitsfehler. Ich baue das GUI einfach bei P(100/100) auf und zentriere es anschießend, was dazu führt das es in dem Punkt(100/100) kurz aufblinkt und dann erst zentriert aufblinkt. Werde das aber mit ein paar Tricks lösen.

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