Focus-Wechsel bei mehreren Crt-Fenstern

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Focus-Wechsel bei mehreren Crt-Fenstern

Beitrag von Dieter »

Hallo,

mir ist unklar, wie der Focuswechsel bei mehreren XbpCrt-Fenstern, die in der DrawingArea eines XbpDialog-Fensters liegen, ausgewertet werden kann. Ich meine hier den Focuswechsel, der entsteht, wenn ein User in ein Crt-Fenster mit der Maus hineinklickt.

Die Anweisung

Code: Alles auswählen

SetAppEvent( xbeM_LbClick, {|mp1,mp2,obj| FocusWechselverhindern(mp1,mp2,obj) } )
funktioniert leider nicht für die Titelbar und das Systemmenü eines Crt-Fensters. Sie funktioniert aber, wenn der man direkt in das Crt-Fenster klickt. Der Wartezustand eines aktiven Crt-Fenster ( z.B. durch READ) wertet den oben genannten Codeblock aus. Einen Klick in die Titelbar jedoch nicht. Hat jemand eine Idee, wie man dieses Problem angehen könnte?

Zur Information noch die Prozedur, die dafür sorgt, dass der Focus wieder auf das aktive Crt-Fenster gestellt wird.

Code: Alles auswählen

PROCEDURE FocusWechselverhindern( mp1, mp2, oXbp )

//CrtWindow():setFrameState(XBPDLG_FRAMESTAT_NORMALIZED)  // geht hier leider nicht
IF SetAppFocus():ndkName<>CrtWindow():ndkName
  SetAppWindow(CrtWindow())
  SetAppFocus(CrtWindow())
ENDIF
RETURN
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Focus-Wechsel bei mehreren Crt-Fenstern

Beitrag von AUGE_OHR »

hi,
Dieter hat geschrieben: mir ist unklar, wie der Focuswechsel bei mehreren XbpCrt-Fenstern, die in der DrawingArea eines XbpDialog-Fensters liegen, ausgewertet werden kann. Ich meine hier den Focuswechsel, der entsteht, wenn ein User in ein Crt-Fenster mit der Maus hineinklickt.
ich fürchte gar nicht ... das ist Windows

du müsstes aber "ein" XbpCrt Fenster "Modal" machen können, dann kann
der User hinclicken wo er will und nur das Modale Fenster reagiert.
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Beitrag von Dieter »

Hallo Jimmy,

Jimmy hat folgendes geschrieben:
ich fürchte gar nicht ... das ist Windows

du müsstes aber "ein" XbpCrt Fenster "Modal" machen können, dann kann
der User hinclicken wo er will und nur das Modale Fenster reagiert.
Modale Crt-Fenster funktionieren nicht mit meinem alten Code! Meine Crt-Fenster können mehrere Wartezustände haben. Das geht wohl nicht mit modalen Fenstern. Zur Zeit ruft ein Crt-Fenster ein weiteres Crt-Fenster programmgesteuert auf. Dieses kann wiederum ein neues Crt-Fenster aufrufen( usw.). Jedes Crt-Fenster kann Rückgabewerte an das aufrufende Crt-Fenster liefern.
Wenn Du recht hast, dann bleibt mir nichts anderes übrig, als die nicht aktiven Crt-Fenster zu verstecken, damit der User nicht aus Versehen hineinklickt. Aus optischen Gründen, wäre es natürlich schön, wenn der User alle Crt-Fenster geschachtelt übereinander sehen könnte.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Focus-Wechsel bei mehreren Crt-Fenstern

Beitrag von AUGE_OHR »

hi,
Dieter hat geschrieben: Die Anweisung

Code: Alles auswählen

SetAppEvent( xbeM_LbClick, {|mp1,mp2,obj| FocusWechselverhindern(mp1,mp2,obj) } )
funktioniert leider nicht für die Titelbar und das Systemmenü eines Crt-Fensters. Sie funktioniert aber, wenn der man direkt in das Crt-Fenster klickt.

Code: Alles auswählen

PROCEDURE FocusWechselverhindern( mp1, mp2, oXbp )
//CrtWindow():setFrameState(XBPDLG_FRAMESTAT_NORMALIZED)  // geht hier leider nicht
IF SetAppFocus():ndkName<>CrtWindow():ndkName
  SetAppWindow(CrtWindow())
  SetAppFocus(CrtWindow())
ENDIF
RETURN
Frage : ist CrtWindow() deine CRT Class ?
Wenn ja sieht die ganze Sache schon anders aus :)

Eine Class Var :ndkName würde ich durch :SetName() ersetzten damit
man besser in :ChildList() arbeiten kann.

Wenn du auf eine Titlebar clickst ist das der :setDisplayFocus() und wenn
du auf das "Fenster" clickst ist es der :setInputFocus().

somit ist dein

Code: Alles auswählen

SetAppEvent( xbeM_LbClick, {|mp1,mp2,obj| FocusWechselverhindern(mp1,mp2,obj) } )
überflüssig weil du ja dafür die beiden Callback Slots hast. Packe also
deine Function FocusWechselverhindern() in die beiden Slots deiner Class
und suche in der :Childlist() nach deinem :setName().
gruss by OHR
Jimmy
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

Beitrag von Dieter »

Danke Jimmy,

deine Hinweise haben mein Problem gelöst.

Die Callback Slots:

Code: Alles auswählen

oCrt:setDisplayFocus := {|mp1,mp2,obj| FocusWechselverhindern(mp1,mp2,obj)}
oCrt:setInputFocus := {|mp1,mp2,obj| FocusWechselverhindern(mp1,mp2,obj)}
funktionieren prächtig. :D :D :D :D Genau die habe ich gebraucht.

Übrigens ist die CrtWindow() kein Class-Code.
Sie sieht wie folgt aus:

Code: Alles auswählen

/*
 * Routine zur Abfrage des Crt-Anwendungsfensters
 */
FUNCTION CrtWindow( oCrt )
  STATIC soCrt
  IF PCount() > 0
     soCrt := oCrt
  ENDIF
RETURN soCrt
Bei mir haben alle Crt- und Dialog-Fenster direkt einen :VarNamen. Nur das ist Class-Code. Dein Hinweis grundsätzlich mit der Childlist() und :setName() zu arbeiten, werde ich aufgreifen und untersuchen.

Nochmals Dank für deine wertvolle Hilfe.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Antworten