Focus Verlust bei Wechsel zu anderem Programm

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Focus Verlust bei Wechsel zu anderem Programm

Beitrag von saul »

Hallo,
das habe ich nicht verstanden.
Ich habe den Einstieg mit einem CRT Fenster. Als erstes wird dann in meinem Objekt ein Fenster mit xbpdialog gebaut. Dieses Fenster müßte doch dann das Parent für die anderen xbpParts sein oder? Nur wie sage ich das dem Programm und wie den weiteren xbpParts?

mfg
Wolfgang
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Focus Verlust bei Wechsel zu anderem Programm

Beitrag von georg »

Hallo, Wolfgang -

Code: Alles auswählen

oDlg := MyXbpDialog():...
....
oDlg:create()

oXbp := XbpSLE():new(oDlg, oDlg, aPos, aSize)
Die beiden ersten Parameter der Methode :new() geben Parent und Owner an.

In Deinem Beispiel gibst Du an ArrayBrowse():new(, , oPos, oSize ...)

Wenn Du keinen Parent und keinen Owner angibst, wird das über SetAppwindow() abrufbare Objekt zum Parent, und in Deinem Fall ist das dann das XbpCRT. Anstelle der beiden leeren Parameter musst Du eben das MyXbpDialog() Objekt angeben, bzw. die :drawingArea davon:

Code: Alles auswählen

ArrayBrowse():new(oDlg:drawingArea, oDlg:drawingArea, oPos, oSize ...)
oder

Code: Alles auswählen

ArrayBrowse():new(oDlg:drawingArea, , oPos, oSize ...)
Die :drawingArea ist der Teil des XbpDialog, auf dem man seine Objekte platzieren sollte (so habe ich das zumindest bisher verstanden). Wenn Du nur den Parent angibst, verwendet die jeweilige Klasse den Parent ebenfalls als Owner.

Ist das jetzt deutlicher geworden?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Focus Verlust bei Wechsel zu anderem Programm

Beitrag von saul »

Hallo,
ja und nein. Das Problem liegt wie immer im Detail. Wie bereits gesagt, ich habe das Beispielprogramm umgebaut und habe Namen eingebaut die mir das Verständnis erleichtern. Zu Anfang wußte ich überhaupt nicht was da so alles abläuft und warum. Einiges ist mir zwischenzeitlich klarer geworden. Aber da bin ich immer noch dran. Das mit der Parentübergabe habe ich bisher immer so lang probiert bis was auf dem Bildschirm erschien, weiß aber nicht warum.

Code: Alles auswählen

** Mein Objekt
  oLFZEingabe:=ArrayBrowse():New(      ,       , opos     , osize ,     ,           ,):Create()  // läuft in einem CRT Fenster

CLASS ArrayBrowse FROM BrowseFenster
Endclass

METHOD ArrayBrowse:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::BrowseFenster:init( oParent, oOwner, aPos, aSize, aPP, .F. )
   ::ABrowse := XbpBrowse():new( ::drawingarea ,        , aPos , aSize}, aPP  )
Return
METHOD ArrayBrowse:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
  ::BrowseFenster:create( oParent, oOwner, aPos, aSize, aPP, .F. )
  ::ABrowse:Create ()
Return

CLASS BrowseFenster FROM XbpDialog
Endclass

METHOD BrowseFenster:init( oParent, oOwner, aPos, aSize, aPP, lVisible)
  ::XbpDialog:init( ::drawingarea, oOwner, aPos, aSize, aPP, lVisible )
  ::oButton:= XbpPushButton():new(::drawingArea , , aPos, aSize} 
Return
METHOD BrowseFenster:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
  ::XbpDialog:create( oParent, oOwner, aPos, aSize, aPP, lVisible )
  ::oButton:=create()

?::BrowseFenster:setparent()          // bringt xbpCRT  da ich das Fenster im CRT Fenster aufgemacht habe dürfte das stimmen
?::oButton:setparent()                // bringt xbpIWindow, da verstehe ich nicht warum 
::oButton:setparent(::BrowseFenster)  // sollte das Parent auf das Fenster mit xbpdialog gemacht ändern
?::oButton:setparent()                // bringt aber ArrayBrowse 
Return
Stehen da an den Platzhaltern für oParent die falschen Werte drin oder ist ein solcher Aufbau von Hause aus falsch?

mfg
Wolfgang
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Focus Verlust bei Wechsel zu anderem Programm

Beitrag von georg »

Guten Morgen, Wolfgang -


Dein Klassen-Aufbau ist - zumindest mal überflogen - korrekt, das Problem liegt in der Erzeugung des ArrayBrowse Objektes. Wenn Du die beiden ersten Parameter in :new() nicht übergibst, erhält Deine Klasse als Parameter NIL.

Xbase geht normalerweise geht wie folgt damit um, wenn z.B. oParent fehlt:
The parent for an XbpBrowse object can be optionally specified using the parameter <oParent> . By default <oParent> is the active window (the return value of SetAppWindow()). If the default is used, the active window must be an XbpCrt window. If the active window is an XbpDialog window, the drawing area of the window must be specified for <oParent> . The drawing area is referenced using the instance variable oXbpDialog:drawingArea .
Durch die Übergabe von NIL in Deinem Code (oParent und oOwner haben den Wert NIL):

Code: Alles auswählen

METHOD ArrayBrowse:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::BrowseFenster:init( oParent, oOwner, aPos, aSize, aPP, .F. )
wird das XbpCRT-Fenster zum oParent und oOwner.

Um das zu vermeiden, muss das Objekt mit

Code: Alles auswählen

oLFZEingabe:=ArrayBrowse():New(oDlg:drawingArea, oDlg:drawingArea, opos, osize):Create()
erzeugt werden.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
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 Verlust bei Wechsel zu anderem Programm

Beitrag von AUGE_OHR »

georg hat geschrieben:Dein Klassen-Aufbau ist - zumindest mal überflogen - korrekt
hm ...
Ich habe den Einstieg mit einem CRT Fenster. Als erstes wird dann in meinem Objekt ein Fenster mit xbpdialog gebaut. Dieses Fenster müßte doch dann das Parent für die anderen xbpParts sein oder?
ich versuche es zum letzten Mal : nimm ein XbpDialog als "Main" und ein "richtiges" oCRT Fenster mit der o:drawingArea als Parent.

ein oCRT Fenster "sollte" man lieber nicht als Parent verwenden sondern o:drawingArea -> Superclass XbpIWindow() ... oder AppDeskTop()
gruss by OHR
Jimmy
saul
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 284
Registriert: So, 26. Mär 2006 12:23

Re: Focus Verlust bei Wechsel zu anderem Programm

Beitrag von saul »

Hallo Jimmy,
das ist zwar richtig, führt aber dazu dass ich die nächste Baustelle habe. Denn nur durch den Umbau wird mein Wissen ja nicht automatisch mehr. Die Fenstertechnik muß dann ja auch beherscht werden oder?

mfg
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Focus Verlust bei Wechsel zu anderem Programm

Beitrag von brandelh »

AUGE_OHR hat geschrieben:ein oCRT Fenster "sollte" man lieber nicht als Parent verwenden sondern o:drawingArea -> Superclass XbpIWindow() ... oder AppDeskTop()
wer sagt sowas ?
Doku zu SetAppWindow() hat geschrieben:In einer GUI Anwendung dient das Applikationsfenster als Parent für Xbase Parts, die ohne Angabe eines Parent erzeugt wurden.
Falls ein XbpCrt-Fenster als Appliktionsfenster verwendet wird (Hybrid Anwendung), dient dieses Fenster gleichzeitig als Ausgabegerät für alle text-orientierten Bildschirmausgaben
Ein XbpCrt() kann ohne Probleme als Parent dienen, man muss dieses nur nicht angeben, das der Parent dann mit SetAppWindow() bestimmt wird.
Was Jimmy meinte ist, dass man kein DialogFenster (mit XbpDialog()) als Parent bei controls angibt, sondern dessen :drawingArea
Das gibt es nicht bei XbpCrt().

Bei den CRT Fenstern, muss man das jeweilige "Hauptfenster" (also das, welches den Focus erhält wenn er neu zu vergeben ist z.B. nach MsgBox()) bei SetAppWindow() hinterlegt werden.

Ob das einfacher ist als es sich gleich richtig anzueignen (also komplett XbpDialog() ), weiß ich nicht.
Gruß
Hubert
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 Verlust bei Wechsel zu anderem Programm

Beitrag von AUGE_OHR »

brandelh hat geschrieben:wer sagt sowas ?
ich sagte "sollte" ...
brandelh hat geschrieben:Ein XbpCrt() kann ohne Probleme als Parent dienen, man muss dieses nur nicht angeben, das der Parent dann mit SetAppWindow() bestimmt wird.
Was Jimmy meinte ist, dass man kein DialogFenster (mit XbpDialog()) als Parent bei controls angibt, sondern dessen :drawingArea
Das gibt es nicht bei XbpCrt().
YUP
brandelh hat geschrieben:Bei den CRT Fenstern, muss man das jeweilige "Hauptfenster" (also das, welches den Focus erhält wenn er neu zu vergeben ist z.B. nach MsgBox()) bei SetAppWindow() hinterlegt werden.
und "so-rum" in Griff zu kriegen ist einfach viel schwerer.
spätesten mit mehren Threads / CRT Fenster kommt man da ganz schnett an die Grenzen.
brandelh hat geschrieben:Ob das einfacher ist als es sich gleich richtig anzueignen (also komplett XbpDialog() ), weiß ich nicht.
davon habe ich eben nie gesprochen !

Es geht darum das "Main" als XbpDialog() auszulegen und ein CRT Object dann auf der o:DrawingArea.
in dem CRT Object läuft dann der alter Cl*pper Code und die XbParts erhalten oCRT als Parent und die o:DrawingArea als Owner.
dann kann man auch die o:setDisplayFocus und o:killDisplayFocus Callback Slots auch ordenlich bestücken
gruss by OHR
Jimmy
Antworten