Ok, das Argument der Schichten klingt plausibel.
Dann löse ich es doch besser über Events und die Kommunikation mit der Hauptform. Da gibt es ja ein sehr hilfreiches How-To im Forum.
Hallo Forum,
gibt es eine Möglichkeit die Änderung z. B. einer Bool-Variable, die in den Properties Settings angelegt ist, in einem Benutzersteuerelement (also nicht der Mainform) eines Programms zu erkennen.
Ich denke man müsste das über ein Event lösen. Aber meine Programmierkenntnisse reichen dafür nicht aus. Ich habe auch bei der Recherche keine Lösung gefunden, die ich passend fand. Daher die Grundsätzliche Frage, wie so etwas geht.
Falls ich ein Codebeispiel im Forum übersehen habe, könnt ihr auch gerne darauf verweisen.
Beste Grüße und vielen Dank!
Hi,
vielen Dank für die Antwort. Jetzt habe ich doch nach tagelanger Suche den Fehler selbst gefunden.
Im Programm ist noch eine Kommunikation mit einer Steuerung, deren Timer dazwischenfunkt.
Den muss man kurzzeitig deaktivieren.
Dann läuft alles.
Trotzdem Danke für die hilfsbereitschaft.
Grüße!
Hallo Forumsmitglieder,
ich habe eine Frage bezüglich einer Windows-Formsanwendung. Ich möchte gerne in einem Programm einen Scanner ansteuern. Ich habe eine Anwednung nach folgendem Beispiel erstellt:
Beispielcode für eine Scannerapplication
Das Programm funktioniert einwandfrei!
Jetzt habe ich versucht diesen Code in meiner Anwendung zu implementieren, das führt aber zu einem mir unverständlichen Verhalten:
Fall 1)
Wird das Scannen aus dem laufenden Programm gestartet (normaler Anwednungsfall), wird der Code zwar ohne Fehlermeldung ausgeführt, aber das Scannen startet erst, wenn man das Fenster schließt (Schließen Button). Anstatt zu schließen bleibt das Fenster danach aber offen und die Anwendung bedienbar.
Fall2)
Wenn ich das Programm mit Haltepunkten ausführe, wird alles genau, wie programmiert, ausgeführt und der Scanner startet sofort.
Ich habe versucht das Problem mit Haltepunkten "einzukreisen" und gedacht, dass es vielleicht ein Timing-Problem ist, das sich mit System.Threading.Thread.Sleep(); lösen lässt anstatt einen Haltepunkt zu verwenden. Leider ist dies aber nicht der Fall und den Thread anzuhalten ändert nichts.
Ich habe das Gefühl, dass der Scannbefehl zwar gestartet wird, aber in irgendeiner Bearbeitungswarteschlange untergeht. Deshalb meldet die Anwednung, zwar dass der Code ausgeführt wurde, aber es passiert nichts.
Welche Möglichkeiten zum Debuggen gibt es für so ein Verhalten oder besser gefragt, worauf deutet so ein Verhalten denn hin und wonach könnte ich suchen oder womit Abhilfe schaffen?
Da es sich um relativ viel Code handelt, habe ich erst mal darauf verzichtet ihn hier miteinzufügen, kann das aber gerne bei Bedarf nachholen.
Vielen Dank für die Hilfe. Dein Artikel war sehr hilfreich! 👍
Gut ist auch, dass darin auch gängige Fehler aufgelistet sind. Einige davon habe ich bei meiner vorangegangenen Internetsuche selbst gefunden und probiert X(
Gut ist auch, dass es eine schöne Druckansicht gibt. =)
Hallo wissende Forumsmitglieder,
ich habe folgende Aufgabenstellung:
Für eine GUI habe ich in meiner MainForm Buttons, die bei Click verschiedene Benutzersteuerelemente öffnen. Auf jedem dieser Benutzersteuerelemente befindet sich eine Art Notaus-Button.
Wenn dieser jeweils betätigt wird, sollen alle Buttons des gerade aktiven Benutzersteuerelements und die Buttons der MainForm deaktiviert werden, bis der Notausbutton ein zweites mal gedrückt wird. Dann müssen alle Buttons wieder aktiviert werden.
Meine Frage ist, wie man "sauber" Buttons in einer anderen Form deaktivieren kann.
Meine Recherche im Internet hat folgenden Code als Lösung ergeben. Das ist aber nicht besonders zuverlässig bei mehreren Benutzersteuerelementen. Für zwei scheint das zu funktionieren, bei mehreren geht das aber nicht mehr.
FormMain FormM = (FormMain)Application.OpenForms["FormMain"];
FormM.DisableButtons(false);
(DisableButtons als public definierte Methode in FormMain zum deaktivieren der Buttons angelegt)
Was wäre der Richtige Weg bzw. was muss ich in meiner MainForm und in den Benutzersteuerelementen als Code programmieren?
Herzliche Grüße und vielen Dank für die Hilfe
Ok, ich will das gerne so machen, wie ihr sagt, aber dafür bräuchte ich noch einmal eine genauere Beschreibung.
Wie soll ich die UserControls genau anlegen? Wie stelle ich sicher, dass immer nur genau eines offen ist und alle anderen im Hintergund nicht laufen?
Meine Version habe ich so als Codebeispiel im Internet gefunden. Warum genau ist sie schlecht oder ungünstig?
Hallo Th69,
die Verwendung von Benutzersteuerelementen war ein prima Tipp. Das funktioniert einwandfrei.
Ich habe sie folgendermaßen angelegt:
Im User Control selbst:
private static ucMovement _instance;
public static ucMovement Instance
{
get
{
if (_instance == null)
_instance = new ucMovement();
return _instance;
}
}
Ein Button in der Main-Form:
if (!panelTabs.Controls.Contains(UserControls.ucMovement.Instance))
{
panelTabs.Controls.Add(UserControls.ucMovement.Instance);
UserControls.ucMovement.Instance.Dock = DockStyle.Fill;
UserControls.ucMovement.Instance.BringToFront();
}
else
UserControls.ucMovement.Instance.BringToFront();
Mit Childform meine ich die Form, die in das Panel geladen wird. Die Bezeichnung stammt aus der Methode, in der eine Form in das Panel geladen wird (siehe Codeabschnitt von oben). Letztlich habe ich aber zu meiner Haupt-Form eine "Windows Form" zu dem Projekt hinzugefügt.
Ich habe mir noch einmal das Anleitungs-Video angeschaut und letztlich ist dort doch der gleiche Effekt zu sehen. Scheinbar kann ich das doch nicht so ohne weiters lösen.
Das ganze soll ja eh nur auf einem bestimmten Bildschirm laufen. Dann werde ich das alles auf diesen Anpassen und naja WPF halt dann demnächst.
Also Danke erst mal für die Antworten.
Zunächst: WPF werde ich mir schon noch zu Gemüte führen, das ist aber für meine aktuelle Situation nicht weiterführend.
Dass ein in der Größe verzerrtes Bild auch zu anderen Abständen der buttons führt ist mir klar.
Die Größe der Childform soll aber eigentlich auf die Größe des Panels beschränkt werden. Bei gleich groß definiertem Panel und Childform sollte sich also eigentlich nichts verschieben.
Was aber passiert ist, dass die einzupassende Childform viel zu groß wird.
Wenn ich in jede Ecke meiner Childform einen Button oder irgendwas anderes positioniere, wird das alles abgeschnitten, weil die Form anscheinend zu groß ist. Ich sehe nur was im linken oberen Ausschnitt ist. Diese Verzerrung erklärt auch, warum die Buttons zu große Abstände haben.