Fehlermeldung bei Abbruch der Beenden-Routine

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Fehlermeldung bei Abbruch der Beenden-Routine

Beitrag 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)
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9365
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Stevie.

Code: Alles auswählen

DSDIALOG:ENDDIALOG(1345)
In dieser Zeile wird ein Parameter/eine Variable benutzt, die nicht existiert.
Herzlich,
Tom
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag 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.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag 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
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag 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
Robert
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 36
Registriert: Mo, 13. Feb 2006 12:47

Re: Fehlermeldung bei Abbruch der Beenden-Routine

Beitrag 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.
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: Fehlermeldung bei Abbruch der Beenden-Routine

Beitrag 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.
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Beitrag von stevie »

Habs jetzt so verändert:
oApp:SetQueryClose:= {|o| AppQuit(),.F.}
So funktionierts jetz.
Danke
Robert
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 36
Registriert: Mo, 13. Feb 2006 12:47

Beitrag 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.
Antworten