Verfasst am: 06.10.2015, 20:09
Titel: Textboxen einer Gui über Button durch Klassen hinzufügen
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
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
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?
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
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' forclass
'Hauptfenster'.
Error in Hauptfenster>@(varargin)obj.geklickte_textbox_Callback(varargin{:})(line71)
'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 (line76) set(obj.button_geklickt, 'BackgroundColor', 'blue');
Error in Hauptfenster>@(varargin)obj.button_hinzu_Callback(varargin{:})(line34)
'Callback', @obj.button_hinzu_Callback); % <-- angepasst
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' forinput arguments of type
'matlab.ui.control.UIControl'.
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!
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.
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
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.