|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 13.08.2007, 11:34 Titel: [C#, Pro] "Prevent Steal Focus" |
|
|
Ich hoffe, mir kann auch mal jemand helfen (^_^);
Ich habe folgendes Problem:
Während ich das Ereignis "DropDown" einer ComboBox verarbeite, um der ComboBox Einträge hinzuzufügen öffne ich ein Statusfenster (asyncron, also anderer Thread) mit einer entsprechenden Wartemeldung (animiert, deshalb ich unter anderem der andere Thread notwendig).
Dabei werden im Hauptthread die SQL-Server-Instanzen im Netzwerk gesucht (und auch gefunden, das ich nicht mein Problem) und den Items der ComboBox hinzugefügt. Ist der Prozess der Serversuche abgeschlossen, schließt sich das Statusfenster und der Zusatzthread wird beendet. - Alles kein Problem.
Leider ist danach die DropDownbox gleich wieder geschlossen. Sie flackert nach verlassen des Statusfensters kurz auf und verschwindet sofort wieder.
Das Problem ist wahrscheinlich das Statusfenster, da es während der Suchaktion den Focus von der ComboBox stielt.
Genau dass muss ich aber verhindern, um den Benutzer der Combobox nicht ein 2. mal zu zwingen, den DropDown auszulösen. (Die Serverliste wird gecached, das Statusfenster wird also nur einmal angezeigt)
Jetzt habe ich leider vergeblich nach einem Ereignis gesucht, mit dem ich ggf. den Verlust des Focus während der Verarbeitung der Suchaktion verhindere.
Ich suche also jemand, der mir eine Idee liefert, mit der ich den Focusverlust kompensieren kann. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 13.08.2007, 13:35 Titel: |
|
|
Das Problem ist sogar noch größer:
Leider kann ich die Auflistung der ComboBox während des Ereignisses "DropDown" nicht so bearbeiten, wie ich es gerne hätte.
Ein einfaches CPP: | comboBox1.Items.Clear(); | löst bereits eine Exception aus (leider sogar, wenn ich im selben Thread - also Syncron - bleibe).
Nur sind Clear() / Add() aber genau die Funktionen, die ich verwenden wollte, um die Items in der Auflistung zu ändern, welche von der ComboBox angezeigt werden sollen
Ich kann den Ansatz also wahrscheinlich komplett über Bord werfen... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 13.08.2007, 16:40 Titel: |
|
|
Ok. 2. Problem gelöst:
Wenn ich ein CPP: | comboBox1.BeginUpdate(); | und ein CPP: | comboBox1.EndUpdate(); | um die Clear() / Add()-Aktion rumbaue, funktioniert das hinzufügen / entfernen wieder richtig. Bleibt noch das Problem des verlorenen Focuses.
Jemand eine Idee dazu? _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 13.08.2007, 19:54 Titel: |
|
|
Könnte nicht folgendes klappen. Du fängst einfach den LostFocus Event ab und setzt den Focus einfach wieder auf dein Control, bzw klappst es wieder aus, Nachteil wäre dann wohl der störende Auf und wieder Einklappeffekt und auch die doppelte DropDown Behandlung.
Alternativ könntest du dir auch das ComboBox Control ableiten und die entsprechenden Focushandling Methoden überladen.
Persönlich würde ich zur 2ten Variante tendieren. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 13.08.2007, 20:16 Titel: |
|
|
Es war beides nicht Notwendig:
Vorschlag 1 ist nicht möglich, weil das "LostFocus"-Ereignis (alias Leave) keinen CancelEventArgs enthält, und damit der Focus verloren geht. Ich könnte ihn zwar nachher wieder draufsetzen aber dann wird das DropDownFeld trotzdem eingeklappt...
Vorschlag 2 hab ich mir auch schon überlegt.
Ich stoße leider immer öfters an echte Grenzen von WinForms und habe schon das eine oder andere Control komplett neu geschrieben (nicht nur abgeleitet und erweitert)
Für die Combobox wollte ich den Weg allerdings nicht gehen, die funktionierte bisher zufriedenstellend...
Ich habe mich dann für Variante 3 Entschieden:
ShowNoActivate()...
Ich hab das Statusfenster mit ShowNoActivate angezeigt. Da es TopMost ist, wird es angezeigt, das Dropdown behält aber den Focus... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht 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.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|