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

Textboxen einer Gui über Button durch Klassen hinzufügen

 

MatlabErlerner
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.10.2015, 20:09     Titel: Textboxen einer Gui über Button durch Klassen hinzufügen
  Antworten mit Zitat      
Hallo zusammen,

ich habe eine Frage zur OOP. Ich bin auf dem Gebiet ziemlich neu. Daher verzeiht mir meine vermeintlich blöde Frage. Ich möchte auf meinem HauptFigure meiner GUI über einen Button 'Hinzufügen' neue Textboxen mit jedem Klick hinzufügen, die untereinander angeordnet werden. Ich habe mir eine Klasse geschrieben, die das Hauptfenster anlegt und den Button auf das Hauptfenster setzt. Das ganze sieht bisher so aus:

Code:
classdef Hauptfenster < handle
    properties
        HauptFigure    % Hauptfenster
        button_hinzu         %Button zum Hinzufügen neuer Textboxen
        textbox % neue Textbox anlegen
    end
    methods (Static, Access = public)  % Methoden des Hauptfensters
       
        function obj = Hauptfenster()
            obj.HauptFigure=figure();  % HauptFigure wird erstellt
            scrsz = get(0,'ScreenSize');  % Bildschirmgröße auslesen
            set(obj.HauptFigure, ...
                'Position',[0.3*scrsz(3),0.3*scrsz(4),0.6*scrsz(3),0.6*scrsz(4)],...
                'Units','normalized',...
                'Resize','on',...
                'MenuBar','none',...
                'Name','Gearboxtool 2015',...
                'NumberTitle','off');
           
            obj.button_hinzu = uicontrol();    %Button erstellen
            set(obj.button_hinzu, ...
                'style', 'pushbutton', ...
                'FontName', 'Arial', ...
                'FontSize', 10, ...
                'string', 'Hinzufügen', ...
                'Units','normalized', ...
                'Position', [.89,.15,.1,.07], ...
                'Callback', {@obj.button_hinzu_Callback, obj});
        end
    end
    methods (Static, Access = private)      
        function button_hinzu_Callback(~,~, obj)
            obj.textbox = uicontrol();
            set(obj.textbox, ...
                'style', 'text', ...
                'FontName', 'Arial', ...
                'FontSize', 10, ...
                'string', 'Nummer x', ...
                'HorizontalAlignment', 'left', ...
                'Units','normalized', ...
                'Position',[0.02 0.85 0.1 0.1], ...
                'BackgroundColor', 'green');
            %Hauptfenster.erstelleTextbox;
        end        
    end
end


Jetzt wird aktuell lediglich eine Textbox bei jedem Klick angelegt, die die vorherige 1 zu 1 überlagert/überschreibt. Ich weiß leider nicht, wie ich es hinbekomme, dass ausgelesen wird, wie viele Textboxen vorhanden sind und die neue Textbox dann dadrunter angelegt wird. So das quasi alle Textboxen untereinander gelistet werden. Dazu würde mich sehr interessieren, wie ich es schaffe, dass die Textbox als Objekt nicht in dem Objekt der Klasse angelegt wird, sondern gesondert in einer seperaten Struktur Namens test.textbox(1) = (handle zur ersten textbox), test.textbox(2) = (handle zur zweiten textbox) usw.
Hat jemand auf dem Gebiet der OOP gute Kenntnisse und kann mir bei meinen Problemen weiterhelfen? Ich finde leider auch keinen wirklich nützlichen Tipps im Internet. Daher hoffe ich auf das Forum und euch Smile
Anbei würde mich auch noch interessieren, ob es sinnvoll ist, dass das Hauptfenster als Klasse definiert wird? Oder sollte ich das seperat in einer Funktion anlegen?

Grüße und vorab besten Dank für eure Hilfe
Max

Hauptfenster.m
 Beschreibung:

Download
 Dateiname:  Hauptfenster.m
 Dateigröße:  2.35 KB
 Heruntergeladen:  602 mal
Private Nachricht senden Benutzer-Profile anzeigen


MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2015, 08:35     Titel:
  Antworten mit Zitat      
Hat denn niemand eine Idee oder einen Lösungsvorschlag?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.10.2015, 09:57     Titel:
  Antworten mit Zitat      
Hallo,

bitte gedulde dich min. 24 Stunden, bevor du nachfragst.
http://www.gomatlab.de/knigge-t27147.html

Angehängt eine überarbeitete Version; meine Kommentare mit '<--'

Objektorientierte Programmierung (OOP) hat sicher seine Vorteile, aber auch einen gewissen Overhead. Das ist es nicht immer wert.

Zitat:
Dazu würde mich sehr interessieren, wie ich es schaffe, dass die Textbox als Objekt nicht in dem Objekt der Klasse angelegt wird, sondern gesondert in einer seperaten Struktur Namens test.textbox(1) = (handle zur ersten textbox), test.textbox(2) = (handle zur zweiten textbox)

Das widerspricht dem OOP-Gedanken. Herausholen kannst du die Textbox-Objekte mit
Code:
h = Hauptfenster;
textbox = h.textbox


Grüße,
Harald

Hauptfenster.m
 Beschreibung:

Download
 Dateiname:  Hauptfenster.m
 Dateigröße:  2.11 KB
 Heruntergeladen:  623 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
MatlabErlerner
Themenstarter

Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 26.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.10.2015, 12:07     Titel:
  Antworten mit Zitat      
Hallo Harald,
vielen Dank für deine Antwort, sie war wieder super hilfreich und hat mich um einiges weitergebracht. Ich bin nämlich schon beinahe verzweifelt an dem Problem, weil ich einfach nicht weiter gekommen bin. Daher wollt ich mich auch entschuldigen, dass ich so penetrant nach Hilfe geschrien habe.
Nun habe ich weiter programmiert. Denn es gibt noch ein paar Dinge, die ich unbedingt implementieren möchte. Aber, wie soll es auch anders sein, wenn ich Hand an die Tastatur lege, klappt es nicht so, wie ich es mir wünsche.
Ich möchte nun folgende Dinge tun:

1. Ich möchte, dass ich per Mausklick eine der hinzugefügten Textboxen als ausgewählt setzen kann. Diese soll dann Grün sein. Die andere, eventuell zuvor ausgewählte Textbox soll wieder auf die Farbe Blau gesetzt werden, wie alle anderen nicht ausgewählten Textboxen auch. Bisher klappt das beim Hinzufügen neuer Textboxen wunderbar. Allerdings, wenn ich dann versuche die Funktionalität um das Auswählen per Mausklick zu erweitern, kriege ich Fehlermeldungen:
Code:
No appropriate method, property, or field 'geklickte_textbox_Callback' for class
'Hauptfenster'.

Error in Hauptfenster>@(varargin)obj.geklickte_textbox_Callback(varargin{:}) (line 71)
                'ButtonDownFcn', @obj.geklickte_textbox_Callback);
 
Error while evaluating UIControl ButtonDownFcn
 


Der Code der Funktion des 'ButtonDonwFcn' der Textbox sieht aktuell wie folgt aus:
Code:
function obj.geklickte_textbox_Callback(obj, ~, ~)
            set(obj.button_geklickt, 'BackgroundColor', 'blue');
            obj.button_geklickt = gco;
            set(obj.button_geklickt, 'BackgroundColor', 'green');
        end  


Der Textbox habe ich beim Erstellen folgende ButtonDownFcn übergeben:
Code:
obj.textbox(end+1) = uicontrol(...  % <-- neue Textbox wird drangehängt
                'style', 'text', ...
                'FontName', 'Arial', ...
                'FontSize', 10, ...
                'string', sprintf('Nummer %g', num_existing+1), ...
                'HorizontalAlignment', 'left', ...
                'Units','normalized', ...
                'Position',[0.02 0.85-offset 0.1 0.1], ...
                'BackgroundColor', 'green', ...
                'Enable', 'Inactive', ...
                'ButtonDownFcn', @obj.geklickte_textbox_Callback);


Wo liegt mein Fehler und wie kann man diese beseitigen?

2. Ich möchte die aktuell ausgewählte Textbox durch klicken auf den Button Löschen löschen. Wenn ich nun bspw. 3 Textboxen hinzufüge, dann kann ich die letzte(aktuell ausgewählte, da ich bisher ja keine anderen mit Hilfe der Maus auswählen kann) auch problemlos löschen. Allerdings, wenn ich dann eine neue Textbox hinzufügen will, erscheint folgende Fehlermeldung:
Code:
Error using matlab.ui.control.UIControl/set
Invalid or deleted object.

Error in Hauptfenster/button_hinzu_Callback (line 76)
                set(obj.button_geklickt, 'BackgroundColor', 'blue');

Error in Hauptfenster>@(varargin)obj.button_hinzu_Callback(varargin{:}) (line 34)
                'Callback', @obj.button_hinzu_Callback);  % <-- angepasst
 
Error while evaluating UIControl Callback


Ich habe über den Debugger bereits herausgefunden, dass es so ist, dass lediglich das Objekt gelöscht wird, allerdings in der Struktur obj.textbox an der dritten Stelle (wo zuvor das gelöschte Objekt lag), nun ein 'leeres Objekt' liegt, da in der Struktur das Feld mit der delete-Funktion nicht gelöscht wird. Wie bekomme ich es hin, dass dies funktioniert? Bzw. wie kann ich die Löschen-Funktion implementieren?

3. Über einen dritten Button würde ich gerne den Namen der ausgewählten (also momentan immer der letzten hinzugefügten Textbox, da ich wie schon erwähnt über die Maus keine andere anwählen kann) Textbox ändern. Dazu möchte ich eine neue Figure öffnen, die ein Editfeld enthält, in welches der Benutzer den gewünschten neuen Namen eingeben kann. Wie bekomme ich es nun hin, dass der dies funktioniert. Bisher bekomme ich immer folgende Fehlermeldung:
Code:
Undefined function 'name_aendern_edit_Callback' for input arguments of type
'matlab.ui.control.UIControl'.
 
Error while evaluating UIControl Callback


Am liebsten wäre es mir, wenn ich die Figure zum Ändern des Namens 'auslagern' könnte, so dass ich über einen Listener immer bei einer Neueingabe in der Editbox automatisch den Namen der ausgewählten Textbox ändere. Ist dies realisierbar? Ich habe leider wenig Erfahrung mit events und listenern. Hast du Ideen, wie man dies implementieren kann?
Vielen Dank vorab für deinen Mühe, ich hoffe, dass ich meine Frage präzise genug formuliert habe und du mir helfen kannst. Ich stehe nämlich momentan total auf dem Schlauch und komme nicht wirklich weiter, obwohl ich permanent etwas versuche und mir mittlerweile auch schon eine Menge im Internet und in der Dokumentation von Matlab durchgelesen habe.

Besten Dank vorab und Grüße
Max

Anbei habe ich die Datei gehangen, in welcher meine bisherigen Versuche implementiert sind!

Hauptfenster.m
 Beschreibung:

Download
 Dateiname:  Hauptfenster.m
 Dateigröße:  6.4 KB
 Heruntergeladen:  590 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.10.2015, 15:39     Titel:
  Antworten mit Zitat      
Hallo,

hier erste Versuche zur Problemlösung.

Angesichts der Vielzahl und zunehmenden Komplexität deiner Fragen stellt sich mir die Frage, ob du dir nicht für das Projekt direktere Unterstützung holen solltest.
Kannst du ein wenig darüber sagen, was das letztliche Ziel ist? Gerne per PN.

Grüße,
Harald

Hauptfenster.m
 Beschreibung:

Download
 Dateiname:  Hauptfenster.m
 Dateigröße:  6.54 KB
 Heruntergeladen:  610 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.10.2015, 19:29     Titel:
  Antworten mit Zitat      
Hallo,

neue Variante.

Grüße,
Harald

Hauptfenster.m
 Beschreibung:

Download
 Dateiname:  Hauptfenster.m
 Dateigröße:  6.88 KB
 Heruntergeladen:  595 mal
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.