Autor Beitrag
Scofield2011
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: Di 07.08.12 21:09 
Hallo,

ich habe in meiner Anwendung ein für meine Begriffe merkwürdiges Verhalten beobachtet.

In meinem Projekt habe ich
- ein Hauptform, das nicht resizeable aber auf die Taskleiste minimierbar ist

- mehrere Subforms, das heißt sie werden im Bereich des Hauptforms am Bildschirm dargestellt und können weder in ihrer Größe verändert werden, noch minimiert und werden auch immer zusammen mit dem Hauptform verschoben. Außerdem können sie den äußeren Bereich des Hauptforms nie verlassen.

- ein paar dieser Subforms wiederum haben selbst ein Subform, für die dasselbe wie für die anderen Subforms gilt


Das merkwürdige Verhalten gestaltet sich wie folgt:

- Wenn ich im Hauptform ein Subform öffnen und wieder schließe gibt es kein Problem. Übrigens werden bei mir sämtliche Subforms nicht wirklich geschlossen, sondern mit Hilfe der Hide Methode unsichtbar gemacht.

- Wenn ich allerdings im Hauptform ein Subform öffne und innerhalb dieses ein untergeordnetes Subform öffne, gibt es beim Schließen in umgekehrter Reihenfolge beim Schließen des ersten Subforms immer den Effekt das mein Hauptform auf die Taskleiste minimiert wird.

Ich hoffe die Beschreibung ist nicht zu verwirrend und jemand kann mir vielleicht einen Tipp geben, wo die Ursache liegen könnte.

Außerdem würde mich interessieren ob es eine Einstellung für die Forms gibt, die alle darunterliegenden Forms sich ähnlich verhalten läßt wie bei einer MessageBox. Also das sie quasi für sämtliche Eingaben gesperrt sind und das dies durch das typische Windows Geräusch begleitet wird.

Vielen Dank schon einmal im Voraus für eure Hilfe.

Scofield2011
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 07.08.12 22:07 
Zitat:
Außerdem würde mich interessieren ob es eine Einstellung für die Forms gibt, die alle darunterliegenden Forms sich ähnlich verhalten läßt wie bei einer MessageBox. Also das sie quasi für sämtliche Eingaben gesperrt sind und das dies durch das typische Windows Geräusch begleitet wird.


Das nennt man eine modale Form und die musst du dann per ShowModal anzeigen und nicht einfach per Show.

Wenn du das Problem hast das sich deine Form scheinbar willkürlich minimiert dann liegt das meist daran das man (implizit oder explicit) am Focus einer Form schraubt während ein Focus wechsel gerade zu Gange ist. Beispiel man zeigt eine Form im Load Event einer anderen Form an. Im Load Event ist der Focus gerade von der alten auf die neue Form am wechseln und man drückt nochmal eine dritte Form rein die sich den Focus krallt. Das kann je nachdem was diese 3.te Form macht und wie sie sich beendet dazu führen das nach dem Load Event keine Form mehr davon überzeigt ist den Focus zu haben und alle sich minimieren.

Für das Problem solltest du uns deinen Code zeigen damit wir wissen wie du die Formen anzeigst (Show, ShowModal, Visible = true etc.) und wie (oder ob) der Parent,Owner einer Form gesetzt wird.
Scofield2011 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: So 12.08.12 17:16 
Also, vielen Dank erst einmal für die Hilfe.

Als erstes erzeuge ich beim Laden im Hauptform eine Instanz des Subforms z.B.:

ausblenden C#-Quelltext
1:
AboutBox1 AboutDialog = new AboutBox1();					


Wird dann auf z.B. den Button, der es anzeigen soll geklickt, wird dann in der Öffnen Methode folgendes eingefügt:

ausblenden C#-Quelltext
1:
2:
AboutDialog.Owner = this;
AboutDialog.Show();


Und beim Schließen folgendes:

ausblenden C#-Quelltext
1:
AboutDialog.Hide();					


So gehe ich bei allen Dialogen vor. Ach so erwähnenswert ist vielleicht noch, dass alle genannten Codestellen in public Methoden des Hauptforms aufgerufen werden.

Ich habe jetzt übrigens festgestellt, dass das geschilderte Problem mit dem Minimieren auch auftritt, wenn ich mindestens zwei Subforms vom Hauptform aus geöffnet und wieder geschlossen habe. Es tritt dann immer auf, wenn ich den letzten, egal welchen, schließe.

Deine Vermutung mit dem Focus ist ein guter Hinweis, aber wie kann ich das beheben?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 13.08.12 09:50 
Hallo Scofield2011,

warum machst du es denn so kompliziert?
Nimm einfach
ausblenden C#-Quelltext
1:
aboutDialog.ShowDialog(this);					

Ralf meinte mit ShowModal wohl auch ShowDialog (in einigen anderen Frameworks heißt die Methode so - ich selber komme da auch häufig durcheinander, wenn ich mal wieder C++ o.ä. programmiere ;-))

P.S. Variablennamen sollten einen kleinen Anfangsbuchstaben haben (damit man diese auf Anhieb von Klassennamen unterscheiden kann)...
Scofield2011 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Windows XP, Windows 7, Windows 8
C#, VBA, VB
BeitragVerfasst: Mi 15.08.12 01:24 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:


ausblenden C#-Quelltext
1:
aboutDialog.ShowDialog(this);					


P.S. Variablennamen sollten einen kleinen Anfangsbuchstaben haben (damit man diese auf Anhieb von Klassennamen unterscheiden kann)...



Ich wußte bisher nicht, dass man das so abkürzen kann. Danke für den Hinweis. Das wird meinen Code in Zukunft übersichtlicher gestalten und sei es auch nur minimal.

Das mit den Variablennamen weiß ich, aber leider setze ich es noch nicht zu 100% um. Auch wenn ich es mir immer vornehme, irgendwo schleicht sich dann doch wieder eine mit großen Anfangsbuchstaben ein.


Zum Problem: Ich habe es mittlerweile mit dem gezielten Platzieren von ein paar Focus() gelöst. Danke noch einmal für die Tipps, die zum Ziel geführt haben.