Seite 1 von 1

Fehlermeldung bei Abbruch der Beenden-Routine

Verfasst: Di, 09. Okt 2007 9:02
von stevie
Ich habe das, zum, mit Xclass erzeugten Fenster, beenden, festgelegt.
PROC AppQuit
LOCAL nButton, oXbp := SetAppFocus()

nButton := ConfirmBox( , ;
"Wollen Sie das Programm beenden ?", ;
"Beenden", ;
XBPMB_YESNO , ;
XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE )

IF nButton == XBPMB_RET_YES
CLOSE ALL
QUIT
ENDIF
IF nButton == XBPMB_RET_NO
SetAppFocus( oXbp )
endif
RETURN

Jetzt meine Frage: Wenn ich das über einen Button aufrufe funktioniert es einwandfrei, d.h. Ja beendet das Programm und Nein schließt die Meldung und lässt das Fenster offen. Wenn ich aber das mit setappclose() zum Standard-Schließendialog mache, wird beim aufs rechte Kreuz klicken, die Routine aufgerufen und bei Ja auch das Programm beendet, aber bei Nein erscheint diese Meldung:
oError:args :
-> VALTYPE: U VALUE: NIL
oError:canSubstitute: J
oError:cargo : NIL
oError:description : Parameter hat falschen Typ
oError:genCode : 2
oError:operation : .not.<NIL>
oError:osCode : 0
oError:severity : 2
oError:subCode : 3
oError:subSystem : BASE
oError:thread : 1
Aufgerufen von DSDIALOG:ENDDIALOG(1345)
Aufgerufen von (B)DSDIALOG:INIT(250)
Aufgerufen von DSDIALOG:HANDLEEVENT(1072)
Aufgerufen von DSAPP:HANDLEEVENT(927)
Aufgerufen von APPEXEC(156)
Aufgerufen von MAIN(12)

Verfasst: Di, 09. Okt 2007 11:57
von Tom
Hallo, Stevie.

Code: Alles auswählen

DSDIALOG:ENDDIALOG(1345)
In dieser Zeile wird ein Parameter/eine Variable benutzt, die nicht existiert.

Verfasst: Di, 09. Okt 2007 12:48
von stevie
Tom hat geschrieben:Hallo, Stevie.

Code: Alles auswählen

DSDIALOG:ENDDIALOG(1345)
In dieser Zeile wird ein Parameter/eine Variable benutzt, die nicht existiert.
Das Problem ist: Welche? Der Text wird, wie es aussieht, über Appexec aufgerufen. Ich hab ja nur rund 300 Zeilen.

Verfasst: Di, 09. Okt 2007 12:58
von Martin Altmann
Stevie,
die Zeile ist innerhalb der Sourcen von XClass++.
Wenn Du also die Sourcen hast, dann musst Du in der dsdialog.prg in Zeile 1345 schauen. Meine dsdialog.prg ist vom 08.01.2007 und hat in der Zeile 1345 was anderes stehen!
Jedoch glaube ich nicht, dass Du dort einen Fehler findest - vielmehr wird Dich das auf die richtige Spur führen, wahrscheinlich ist Dein Objekt zu dem Zeitpunkt bereits nicht mehr aktiv...

Viele Grüße,
Martin

Verfasst: Di, 09. Okt 2007 13:45
von stevie
Martin Altmann hat geschrieben:Stevie,
die Zeile ist innerhalb der Sourcen von XClass++.
Wenn Du also die Sourcen hast, dann musst Du in der dsdialog.prg in Zeile 1345 schauen. Meine dsdialog.prg ist vom 08.01.2007 und hat in der Zeile 1345 was anderes stehen!
Jedoch glaube ich nicht, dass Du dort einen Fehler findest - vielmehr wird Dich das auf die richtige Spur führen, wahrscheinlich ist Dein Objekt zu dem Zeitpunkt bereits nicht mehr aktiv...

Viele Grüße,
Martin
Meine dsdialog.prg ist vom 8.11.2004. Da steht dann diese Fkt.:
METHOD EndDialog(uRet) CLASS dsDialog
LOCAL oSelf := self:&(self:classname())

if IsCodeblock(::bQueryClose) .and. ! ::WantToClose
if ! eval(::bQueryClose, self) //Zeile 1345
RETURN self
endif
::WantToClose := True
endif

// set modal dialog result
if ::lModal .and. ! IsNil(uRet)
::uDlgResult := uRet
endif

::WantToClose := True

if ! ::lModal .and. ::nAppMode == DS_CHILD_DLG
PostAppEvent(dsEV_DLG_DESTROY,,, self)

elseif ::nAppMode != DS_CHILD_DLG
oSelf:Destroy()
endif

RETURN SELF

Verfasst: Di, 09. Okt 2007 14:07
von Martin Altmann
Hmm,
damit hast Du eine ziemlich alte XClass++-Version...
Was für eine Xbase++-Version nutzt Du denn?

Viele Grüße,
Martin

Verfasst: Di, 09. Okt 2007 14:15
von stevie
Martin Altmann hat geschrieben:Hmm,
damit hast Du eine ziemlich alte XClass++-Version...
Was für eine Xbase++-Version nutzt Du denn?

Viele Grüße,
Martin
xclass 3.7.145
xbase 1.82

Re: Fehlermeldung bei Abbruch der Beenden-Routine

Verfasst: Di, 09. Okt 2007 18:05
von Robert
stevie hat geschrieben:
Jetzt meine Frage: Wenn ich das über einen Button aufrufe funktioniert es einwandfrei, d.h. Ja beendet das Programm und Nein schließt die Meldung und lässt das Fenster offen. Wenn ich aber das mit setappclose() zum Standard-Schließendialog mache, wird beim aufs rechte Kreuz klicken, die Routine aufgerufen und bei Ja auch das Programm beendet, aber bei Nein erscheint diese Meldung:
Hallo,

mal zum Verständnis:
kann es sein, dass du statt setappclose eher setQueryClose von xclass meinst?

Wenn ja dann sieht ein Aufruf sehr wahrscheinlich so ähnlich aus:

oDlg: setQueryClose := { |o| AppQuit() }

Falls dem so ist, muss AppQuit() .T. oder .F. zurückgeben, jenachdem, ob das Fenster geschlossen werden soll oder nicht.

So wäre dir auch beim "Ja" der Fehler aufgetaucht, da du aber mit QUIT das Programm schon vorher beendest, wird das Ergebnis des Codeblocks nicht mehr ausgewertet.

Re: Fehlermeldung bei Abbruch der Beenden-Routine

Verfasst: Di, 09. Okt 2007 20:10
von stevie
Robert hat geschrieben:
stevie hat geschrieben:
Jetzt meine Frage: Wenn ich das über einen Button aufrufe funktioniert es einwandfrei, d.h. Ja beendet das Programm und Nein schließt die Meldung und lässt das Fenster offen. Wenn ich aber das mit setappclose() zum Standard-Schließendialog mache, wird beim aufs rechte Kreuz klicken, die Routine aufgerufen und bei Ja auch das Programm beendet, aber bei Nein erscheint diese Meldung:
Hallo,

mal zum Verständnis:
kann es sein, dass du statt setappclose eher setQueryClose von xclass meinst?

Wenn ja dann sieht ein Aufruf sehr wahrscheinlich so ähnlich aus:

oDlg: setQueryClose := { |o| AppQuit() }

Falls dem so ist, muss AppQuit() .T. oder .F. zurückgeben, jenachdem, ob das Fenster geschlossen werden soll oder nicht.

So wäre dir auch beim "Ja" der Fehler aufgetaucht, da du aber mit QUIT das Programm schon vorher beendest, wird das Ergebnis des Codeblocks nicht mehr ausgewertet.
So siehts aus. Das das was zurückgeben muss, wusste ich nicht.
Es war nur komisch, dass der Fehler nur beim Kreuz auftrat und sonst nicht.

Verfasst: Mi, 10. Okt 2007 12:31
von stevie
Habs jetzt so verändert:
oApp:SetQueryClose:= {|o| AppQuit(),.F.}
So funktionierts jetz.
Danke

Verfasst: Mi, 10. Okt 2007 14:25
von Robert
stevie hat geschrieben:bei Ja auch das Programm beendet, aber bei Nein erscheint diese Meldung:
Der Fehler ist deshalb nur bei Nein gekommen, weil nur in diesem Fall die Funktion AppQuit() bis zum Ende ausgeführt wurde und somit der Codeblock keinen Rückgabewert erhalten hat.
Bei Ja wurde QUIT aufgerufen und das Programm beendet. Dadurch wird der Rückgabewert von AppQuit gar nicht mehr ausgewertet.