| Autor |
Beitrag |
thetemplar_
Hält's aus hier
Beiträge: 7
|
Verfasst: Fr 31.07.09 11:03
Hey,
ich hab jetzt schon den ganzen Morgen ein und das selbe Problem:
(ich bin mal so frei und Posten den ganzen Quelltext, bevor was fehlt  )
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| namespace WindowsFormsApplication1 { public partial class Form1 : Form {
TextBox[] dynButton = new TextBox[100]; int j; int i; public Form1() { InitializeComponent(); j = 9; for (i = 0; i < j; i++) { dynButton[i] = new TextBox(); dynButton[i].Text = ""; dynButton[i].Location = new Point(15, i * 40 + 70); Controls.Add(dynButton[i]); dynButton[i].GotFocus += new EventHandler(Form1_GotFocus); } }
void Form1_GotFocus(object sender, EventArgs e) { for (i = 0; i < 9; i++) { if (dynButton[i].Focused) { bt_blank.Focus(); Form2 zweitesform = new Form2(); zweitesform.Show(); break; } } } } } |
Die Textfelder sollen bei GotFocus einfach eine 2tes Formular öffnen. Leider klappt es zu gut: Sie öffnen grundsätzlich 2 "Form2"-Formulare, weis der Teufel wieso.
Ich habe schon nahezu alles versucht, aber jedesmal wenn ich eins der Boxen anklicke bekomme ich 2 Fenster.
Gibts es einen anderen Lösungsansatz oder fällt jemanden der Fehler auf den ich seid 3 Stunden nicht sehe?
Ich hab es schon extra in ein neues Projekt "ausgelagert", weil ich dachte ggf fuscht mit etwas anderes dazwischen, aber auch in der Solo-Variante mag er nicht das machen was er soll.
Achja, ich hab mal ein BreakPoint an das Ende von void Form1_GotFocus gesetzt, dann bricht er das Prog mit 1 Form2-Fenster ab, also schließe ich drauf das irgendwas dannach den Focus "refreshed" und die Funktion erneut aufruft. Demnach müsste es aber eine Endlosschleife werden, nicht bloß 2 Aufrufe.
Würd mich freuen wenn wer was weis
//edit: Ach, und Form2 ist leer, da kann auch nichts sein...
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Fr 31.07.09 11:31
Ergänzende Hinweise auf seine ersten Versuche. Dort hat er u.a. gesagt:
| Zitat: | Das Problem ist, dass es eine Anwendung für ein PDA ist, aber ich kann die exe auch Problemlos unter WinXP startet. Nur eben nicht per Debugger, der will immer so ein Emulatur des PDAs starten der meine Software nicht mal läd und überhaupt müffelt  |
Nur zur Information... Jürgen
|
|
thetemplar_ 
Hält's aus hier
Beiträge: 7
|
Verfasst: Fr 31.07.09 12:36
Ja, danke dass du das ergänzt hast, ich wollte nicht den Link direkt posten, nachher gibt es noch Sachen dazu, anstatt zu dem Thema, dessen Lösung ich immernoch suche. Naja auch egal.
Hat wer ne Idee? Ich bin zur Zeit am überlegen irgendwie die Sache anderes anzugehen, aber ich finde kein anderen Ansatz. Da fällt mir auf ich hab noch garnicht gesagt was ich machen will: Es ist ne PDA Anwendung, und da die Tastaturen allesamt zu klein oder andersweitig komisch sind hätte ich gerne selber eine Programmiert, ich brauche nur ein großen Numblock mit einer Textbox. Wenn man in dem Form auf OK klickt wird der Wert aus der Textbox einfach in die Textbox in Form1 übertragen, die dafür gesorgt hat dass das KeyboardFormular aufgerufen wurde.
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 31.07.09 12:51
Überlege dir erst einmal, wie es überhaupt weiter geht: Du wirst später auf jeden Fall in einem Klassenfeld speichern müssen, welche TextBox gerade die Subform geöffnet hat. Wenn die gleiche TextBox wieder den Focus erhält, machst du überhaupt nichts, wenn es eine andere ist, verschiebst du die Subform an die richtige Stelle. Wenn du so weit bist, ist es einfach gar nicht mehr möglich, dass zwei Subforms gleichzeitig auf sind, aus welchem Grund auch immer das gerade passiert.
_________________ >λ=
|
|
thetemplar_ 
Hält's aus hier
Beiträge: 7
|
Verfasst: Fr 31.07.09 13:04
Daran hab ich noch garnicht gedacht.
Wiegesagt, es ist ne PDA Anwendung, dh ist eine Tastatur auf, liegt sie "Fullscreen" auf allem anderen. Somit kann man nicht mehrere öffnen. Aber es so zu verhindern wär ne Idee, gleich mal versuchen. Danke
|
|
PerryRhodan
      
Beiträge: 34
C# (VS 2005 + 2008), .NET 2.0 + 3.5 (inkl. WPF, WCF)
|
Verfasst: Fr 31.07.09 13:32
Hallo,
zur Erklärung:
Der Grund ist einfach.
Du befindest Dich in der Behandlungsroutine von GotFocus und versetzt dort den Focus, erzeugst hier aber auch eine neue Form. Es läuft folgendes ab:
1. GotFocus setzt den Fokus auf bt_blank um. Diese Aktion landet in der Message-Warteschlange.
MessageWarteschlange: bt_blank.Focus
2. GotFocus erzeugt ein neues Formular, diese Aktion landet nicht in der Message-Warteschlange, sondern wird sofort ausgeführt. Dadurch bekommt jedoch automatisch Form2 den Fokus.
3. MessageWarteschlange wird abgearbeitet. bt_blank.Focus ausgeführt. Hierfür erhält aber erst wieder Form1 den Fokus und somit auch das vorher fokussierte Eingabefeld. Behandlung des Fokusereignis in der Message-Wartschlange und damit: dynButton.GotFocus()
4. Fokus wird nun tatsächlich auf bt_blank gesetzt.
5. Die Warteschlange wird abgearbeitet und damit die Behandlungsroutine GotFocus neu ausgeführt.
6. GotFocus setzt den Fokus auf bt_blank um. Diese Aktion landet in der Message-Warteschlange.
MessageWarteschlange: bt_blank.Focus
7. GotFocus erzeugt ein neues Formular, diese Aktion landet nicht in der Message-Warteschlange, sondern wird sofort ausgeführt. Dadurch bekommt jedoch automatisch Form2 den Fokus.
8. MessageWarteschlange wird abgearbeitet. bt_blank.Focus ausgeführt. Hierfür erhält aber erst wieder Form1 den Fokus und somit auch das vorher fokussierte Eingabefeld. !!!DIESMAL bt_blank!!! Damit wird GotFocus für die dynamischen Textfelder NICHT mehr ausgeführt.
Wer jetzt mitgerechnet hat, sieht, dass GotFocus zweimal ausgeführt wurde.
Grüße
PerryRhodan
_________________ C# im IRC: QuakeNet, Channel: #dotNet.de
|
|
thetemplar_ 
Hält's aus hier
Beiträge: 7
|
Verfasst: Fr 31.07.09 15:36
wow, danke...
aaaaaaber:
Das würde ja heißen wenn ich den bt_blank.Focus(); entferne geht alles super bis ich das 2te Formular schließe, dann hab ich wieder Formular1 vor mir und wieder den Focus auf die TextBox usw.
Ich habe es versucht und bt_blank.Focus(); rausgenommen und siehe da: 2x Form2. Also muss es noch etwas anderes geben...
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Fr 31.07.09 17:35
thetemplar_ hat folgendes geschrieben : | | Wiegesagt, es ist ne PDA Anwendung, dh ist eine Tastatur auf, liegt sie "Fullscreen" auf allem anderen. |
Öhm, tritt das Problem dann überhaupt unter WinCE auf? Und meine Lösung sieht dann nicht viel anders aus: Merk dir einfach, ob die Subform bereits geöffnet ist.
_________________ >λ=
|
|
PerryRhodan
      
Beiträge: 34
C# (VS 2005 + 2008), .NET 2.0 + 3.5 (inkl. WPF, WCF)
|
Verfasst: Fr 31.07.09 17:58
Hallo,
wenn Du ganz genau drauf achtest, wie die Fenster auf dem Desktop liegen, so liegen nach Durchlauf des Ereignishandlers von hinten nach vorne die Fenster in folgender Reihenfolge auf dem Desktop:
- 1. erstelltes Fenster ganz hinten.
- ursprüngliches Fenster, welches die Ereignisbehandlungsroutine enthält.
- 2. erstelltes Fenster ganz vorne.
Das bedeutet, dass nach dem Ablaufen des ersten Handlers, also nach der Show(), wo eigentlich das erstellte Fenster den Fokus haben sollte, der Fokus wieder zurück auf das ursprüngliche Fenster springt. Macht auch Sinn - weil hier ja die MessageQueue abgearbeitet wird. Dadurch erhält aber das Textfeld wieder den Fokus und lässt die Fenstererstellung neu ablaufen, womit dann das zweite erstellte Fenster im Vordergrund liegt.
Warum hier nun wiederrum das ursprüngliche Fenster nicht den Fokus erhält und wir uns in einer Endlosschleife befinden, entzieht sich meiner Kenntnis. Ich vermute jedoch, dass Windows intern schon der Meinung ist, dass das erste dynamisch erstellte Formular aktiviert sein müsste und somit der Fokus eben nicht auf das ursprüngliche Formular zurückspringt.
Grüße
PerryRhodan
_________________ C# im IRC: QuakeNet, Channel: #dotNet.de
|
|
thetemplar_ 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mo 03.08.09 12:11
Kha hat folgendes geschrieben : | | Und meine Lösung sieht dann nicht viel anders aus: Merk dir einfach, ob die Subform bereits geöffnet ist. |
Ja, so hab ich es nun gelöst. Irgendwie nicht das allerbeste, aber es funktioniert
Einfach eine bool-var genommen die je nach Zustand weiteres öffnen zulässt oder eben nicht.
Danke euch
|
|
|