Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

xbpBrowse() im OEM-Umfeld [Erledigt]

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 12757
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

xbpBrowse() im OEM-Umfeld [Erledigt]

Beitrag von Jan » Mo, 09. Apr 2018 11:17

Hallo,

im Moment stehe ich vor einem Rätsel. Ich habe eine OEM-Oberfläche. In der oberen Hälfte des Dialoges habe ich ein XbpBrowse. Wenn ich dort einen Hotkey drücke, wird eine Funktion aufgerufen, die ein MemoEdit() beinhaltet. In dieser Funktion gibt es eine Eventschleife, die mich erst zurück läßt, wenn ich den MemoEdit() mit STRG+W oder ESC verlasse.

Problem: Sobald ich in diese Funktion rein gesprungen bin, und den Fokus wieder auf den Browse setzen möchte, gibt es einen Laufzeitfehler. Weil der Browse plötzlich NIL ist. Der aber vor dem Aufruf der Editfunktion noch existierte.

Der Browse wird nicht als Parameter an die Funktion übergeben. Und nirgends geNILt oder :destroyed.

Wo kann da das Problem liegen?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7042
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: xbpBrowse() im OEM-Umfeld

Beitrag von Tom » Mo, 09. Apr 2018 12:05

Wo kann da das Problem liegen?
Überall. Wahrscheinlich aber sitzt es. Vor Deinem Rechner. 8)

Nahezu auszuschließen ist allerdings, dass dieses Problem irgendwas mit Zeichensätzen zu tun hat. :wink:

Spaß beiseite. Du rufst das MemoEdit auf und willst (anschließend?) den Fokus wieder auf das Browse setzen, aber die Variable enthält NIL. Wird sie irgendwo doppelt besetzt? Wie sieht der Code aus? Und was zur Hölle ist eine "OEM-Oberfläche"?
Herzlich,
Tom

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 12757
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: xbpBrowse() im OEM-Umfeld

Beitrag von Jan » Mo, 09. Apr 2018 12:17

Tom,

mir ist bewußt, daß der Fehler sehr sicher bei mir liegt. Ich versteh ihn aber nicht.

Die Oberfläche ist Text, nicht GUI. Aber mit ein paar eingestreuten GUI-Elementen wie hier halt dem Browse.

Und nein, die Variable für den Browse wird nirgends anderweitig verwendet. Die ist erstmal LOCAL.

Der Code ist im Prinzip das hier:

Code: Alles auswählen

   // UDF mit Tatstaurabfragen etc, aufgerufen in oBrowse:keyboard und oBrowse:stableBlock
   ...
   CASE cLetzterBuchstabe = "D"                                                                   
        SetAppFocus(MEMVAR->oXbp)
        lesekomudokufeld()
        SetAppFocus(oBrowse)
        oBrowse:refreshAll()
   ...

FUNCTION lesekomudokufeld

LOCAL cAltColor := SetColor()
LOCAL nEvent := 0
LOCAL mp1 := nil
LOCAL mp2 := nil
LOCAL oXbp := nil

SetColor("n/w*")
@ 17, 106 Clear TO 25, 209
SET cursor ON
MemoEdit(komu->dok, 17, 106, 25, 209, .F.)
SetColor(cAltColor)

DO WHILE .T.
   nEvent := AppEvent(@mp1, @mp2, @oXbp)
   IF nEvent = K_CTRL_END .OR. nEvent = K_ESC
      Clear TypeAhead
      Keyboard Chr(255)
      RETURN NIL
   ENDIF
   MEMVAR->oXbp:handleEvent(nEvent, mp1, mp2)
ENDDO

RETURN NIL
MEMVAR->oXbp ist SetAppWindow(), das wird direkt beim Programmstart festgelegt. Und ich mach das mit dem SetAppFocus() deswegen, damit ich den Fokus erstmal weg vom Browse und danach wieder hin zum Browse bekomme. Wobei das vollkommen egal ist - selbst wenn ich das auskommentiere, klappt das nicht. In der zeile, wo ich die Editfunktion aufrufe, ist oBrowse noch sauber belegt. Komme ich aus der Funktion zurück, ist das NIL.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 7042
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: xbpBrowse() im OEM-Umfeld

Beitrag von Tom » Mo, 09. Apr 2018 13:18

Mmh. Dann müsste das Problem ja im MEMVAR->oXbp:handleEvent(nEvent, mp1, mp2) stecken. Übergib doch mal das Browse als Parameter an das Memoedit und logge es vor und nach jedem Aufruf des Part-Handlers.
Herzlich,
Tom

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 14211
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: xbpBrowse() im OEM-Umfeld

Beitrag von brandelh » Mo, 09. Apr 2018 13:32

Mir fällt das auf ...

Code: Alles auswählen

SetAppFocus(MEMVAR->oXbp)
vor der Zuweisung an ein Control, muss zunächst das Fenster den Input-Focus haben, wenn also das nicht auf dem gleichen Fenster liegt, dann

Code: Alles auswählen

SetAppFocus(oWin)
SetAppFocus(oControl)

Code: Alles auswählen

FUNCTION lesekomudokufeld
LOCAL oXbp := nil
...
MemoEdit(komu->dok, 17, 106, 25, 209, .F.)
...
DO WHILE .T.
   nEvent := AppEvent(@mp1, @mp2, @oXbp) //////// LOCAL oXbp !!!!
   IF nEvent = K_CTRL_END .OR. nEvent = K_ESC
...
   ENDIF
   MEMVAR->oXbp:handleEvent(nEvent, mp1, mp2) //// MEMVAR oXbp
ENDDO

RETURN NIL
das Control das den Event empfangen hat, sollte den normal auch verarbeiten ...
Wobei wenn ich Memoedit() aufgerufen habe, habe ich der selbst eine Funktion übergeben die sich um die interne Tastatur Steuerung kümmert.
Was genau regelt die Eventloop des Hilfefensters ?
Gruß
Hubert

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 12757
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: xbpBrowse() im OEM-Umfeld

Beitrag von Jan » Mo, 09. Apr 2018 13:45

Hubert,

ja, das mit dem lokalen und dem PUBLIX oXbp war mir auch gerade aufgefallen nach dem Beitrag von Tom - es lebe copy and past :-( . Da teste ich gerade mit der Korrektur weiter.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 12757
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: xbpBrowse() im OEM-Umfeld

Beitrag von Jan » Mo, 09. Apr 2018 13:58

Tja, was soll ich sagen? Kaum macht mans richtig, schon funktionierts.

Es war in der tat die Diskrepanz beim oXbp. hatte ich einfach aus einer anderen Schleife rüber kopiert weil ich zu faul war, die paar Zeilen noch mal von Hand einzutippen. Und da ansich das Richtige stand mit oXbp war ich beim lesen auch komplett nicht darüber gestolpert.

Danke an Tom für den eher unabsichtlich gegebenen Hinweis, und Hubert für das nochmal mit der nase drauf stoßen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.

Antworten