Rücksprung nach SETKEY() zum aufrufenden Modul

Moderator: Moderatoren

Antworten
Hippo
Rookie
Rookie
Beiträge: 10
Registriert: So, 20. Okt 2013 16:11

Rücksprung nach SETKEY() zum aufrufenden Modul

Beitrag von Hippo »

hI,
Ich benutze als Menü nicht DCMENU sondern XbpMenu (das die Kunden bereits aus der DOS-Version kennen)
Wenn ich SETKEY(K_ALT_F2,{||memozeig()}) benutze, um von jedem Event aus eine Memodatei aufrufen zu können, ist nach Beendigung des Moduls nicht das aufrufenden Modul (das kann ein DCBROWSE- oder ein DCSTATIC-Objekt sein) im Vordergrund sondern das XBPMENU.
Meine Kenntnisse zu den Parametern PARENT REFERENCE usw. sind leider sehr begrenzt, schön wäre es, wenn es etwas wie SetAppFocus(@oBrowse), das nur für DCBROWSE-Objekte verfügbar ist, innerhalb des Moduls memozeig() anwendbar wäre, allerdings haben die Objekte verschiedene Namen (war anders lösbar wäre)

Hat jemand eine Idee, wie das gehen könnte ?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Rücksprung nach SETKEY() zum aufrufenden Modul

Beitrag von Tom »

Zunächst einmal: Es hat wenig Sinn, SetAppFocus() per Referenz (mit "@") zu verwenden. Das benötigt man nur, wenn die Funktion, die aufgerufen wird, den übergebenen Parameter verändern können soll. SetAppFocus() setzt aber lediglich den Fokus auf das Objekt, das übrigens ein beliebiges Xbase-Part oder ein Fenster sein kann, also nicht nur ein DCBROWSE oder ein DCSTATIC. Es reicht, "SetAppFocus(<oObject>)" zu verwenden. Wenn man Parameter per Referenz übergibt, kann die aufgerufene Funktion die Daten manipulieren (Arrays werden immer per Referenz übergeben), also beispielsweise so:

Code: Alles auswählen

FUNCTION TesteNamen(cName)
IF "äöü" $ cName
  cName := StrTran('ä','ae')
  * usw.
ENDIF
RETURN .T.

cTestName := 'Müller'

IF TesteName(cTestName) // Antwort: .T.
   ? cTestName // 'Müller'
ENDIF
IF TesteName(@cTestName) // Antwort: .T.
   ? cTestName // 'Mueller'
ENDIF
Ohne Referenzparameter wird eine lokale Variable in der Funktion erzeugt, die den Wert enthält, aber die ggf. stattfindenden Veränderungen wirken sich nur hier aus. Übergibt man per Referenz, arbeitet die Funktion direkt mit der Variablen, die übergeben wird.

Zu Deiner eigentlichen Frage:

Wahrscheinlich geht es so am Einfachsten:

Code: Alles auswählen

SETKEY(K_ALT_F2,{||memozeig(SetAppFocus())}) // dadurch bekommt "memozeig" das Objekt, das beim Aufruf den Fokus hatte
In "memozeig":

Code: Alles auswählen

FUNCTION MemoZeit(oXbp)

...

IF ValType(oXbp) == 'O'
  SetAppFocus(oXbp)
ENDIF
RETURN
Zuletzt geändert von Tom am Do, 26. Mär 2015 13:45, insgesamt 1-mal geändert.
Herzlich,
Tom
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Rücksprung nach SETKEY() zum aufrufenden Modul

Beitrag von Tom »

Noch eine Ergänzung:

Wenn der Lösungsansatz so nicht ganz funktioniert, kann das daran liegen, dass zuerst das Fenster den Applikationsfokus erhalten muss, in dem sich das Objekt befindet, das den Fokus hatte. Im Prinzip muss man also nach dem Parent von "oXbp" suchen, wenn das nicht schon ein Fenster ist. Also statt "SetAppFocus(oXbp)" in "memozeig" beispielsweise so etwas:

Code: Alles auswählen

...
IF ValType(oXbp) == 'O'
  SetParentFocus(oXbp)
ENDIF
RETURN

FUNCTION SetParentFocus(oXbp)
IF ValType(oXbp) == 'O' .AND. oXbp:IsDerivedFrom('XbpDialog')
  SetAppFocus(oXbp)
  RETURN .T.
ENDIF
SetParentFocus(oXbp:SetParent())
RETURN .F.
Ins Blaue getippt. Rekursionen sind immer so eine Sache. :wink:
Herzlich,
Tom
Hippo
Rookie
Rookie
Beiträge: 10
Registriert: So, 20. Okt 2013 16:11

Re: Rücksprung nach SETKEY() zum aufrufenden Modul

Beitrag von Hippo »

Hallo Tom,
nicht zum ersten Mal vielen Dank für deinen Tipp und dein "Hirnschmalz". Im Prinzip klappt das ganze schon prima sogar ohne Ergänzung von SetparentFocus(), das Problem mit dem Obektnamen werde ich wohl noch lösen können, evt. mit:
cvar="oxbp" und dann mit setkey(K_ALT_F2,{||memozeig(cvar)} übergeben und in memozeig() den Parameter mit SetAppFocus(&cparam) auswerten.. Mit fehlt nur dazu aktuell die Zeit, aber ich bin ganz otimistisch dank deiner Hilfe.
Antworten