Crt Class / :setDisplayFocus / Debugger

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
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

Crt Class / :setDisplayFocus / Debugger

Beitrag von AUGE_OHR »

hi,

Ich habe in meiner Xbase++ Hybrid Anwendung eine eigene Crt Class
die jeweils als Thread läuft. Zum "steuern" der Threads verwende ich
Tabpage oder XbpPushbutton damit nur jeweils ein Thread aktive ist
und kann per SAY/GET bearbeitet werden während die anderen Threads
im Signal:wait() Modus sind. Ich muss aber für jeden inaktiven Thread
die Workspacelist, RECNO() etc. sichern da die Hybridanwendung ja
den "alten" prozeduralen Cl*pper Code verwendet.

Nachdem das ganze nun funktioniert will ich mehr ... Nun soll ein Crt
durch anklicken aktiviert werden als wenn ich auf den Button clicken
würde. soweit sogut aber nun hab ich beim debuggen Probleme

Code: Alles auswählen

   ::oCrt:killDisplayFocus := {| x,y,oObj | ::aArea := SaveWorkSpace() }
   ::oCrt:setDisplayFocus  := {| x,y,oObj | MyCoffee( ::IDno ,aTabObj) }
während das :killDisplayFocus keine Probleme macht, komme ich beim
:setDisplayFocus immer wieder in die Debugger Schleife in MyCoffee()
wenn ich aus dem Debugger in die Anwendung clicke die hinter dem
Debugger liegt ...

Als workaround hab ich die Auflösung des Monitors auf 1920 gestellt damit
ich die Anwendung und den Debugger nebeneinander sehen kann.

mache ich mit :setDisplayFocus() irgend einen Irrtum den ich nicht
bedacht habe ?

gruss by OHR
Jimmy
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: Crt Class / :setDisplayFocus / Debugger

Beitrag von brandelh »

AUGE_OHR hat geschrieben:h

Code: Alles auswählen

   ::oCrt:killDisplayFocus := {| x,y,oObj | ::aArea := SaveWorkSpace() }
   ::oCrt:setDisplayFocus  := {| x,y,oObj | MyCoffee( ::IDno ,aTabObj) }
während das :killDisplayFocus keine Probleme macht, komme ich beim
:setDisplayFocus immer wieder in die Debugger Schleife in MyCoffee()
wenn ich aus dem Debugger in die Anwendung clicke die hinter dem
Debugger liegt ...
...
mache ich mit :setDisplayFocus() irgend einen Irrtum den ich nicht
bedacht habe ?
in dem Moment wenn du vom Debugger auf das CRT klickst, wird dort der Event ausgelöst und erneut MyCoffee aufgerufen. Gerade in diesen Situationen (events) ist das Debuggen z.Z. zumindest nicht einfach ...
Ich nutze hier die gute alte ALTERNATE Datei (auch bei NUR GUI Anwendungen !):

Code: Alles auswählen

set console off   // wichtig, falls nur GUI !
set alternate to xxxx  (additive ?)
set alternate on

? "wo bin ich, was ist der wert von ",cTest

set alternate to
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: Crt Class / :setDisplayFocus / Debugger

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: in dem Moment wenn du vom Debugger auf das CRT klickst, wird dort der
Event ausgelöst und erneut MyCoffee aufgerufen. Gerade in diesen
Situationen (events) ist das Debuggen z.Z. zumindest nicht einfach ...
jaja genau das ist das Problem ...
brandelh hat geschrieben: Ich nutze hier die gute alte ALTERNATE Datei (auch bei NUR GUI Anwendungen !):

Code: Alles auswählen

set console off   // wichtig, falls nur GUI !
set alternate to xxxx  (additive ?)
set alternate on
? "wo bin ich, was ist der wert von ",cTest
set alternate to
hm ... ja ... damit komme ich zwar an die Variabeln aber ich kann nicht
"sehen" was das Programm macht :(

jemand vielleicht noch eine Idee ?
gruss by OHR
Jimmy
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: Crt Class / :setDisplayFocus / Debugger

Beitrag von brandelh »

AUGE_OHR hat geschrieben: hm ... ja ... damit komme ich zwar an die Variabeln aber ich kann nicht
"sehen" was das Programm macht :(

jemand vielleicht noch eine Idee ?
Hallo Jimmy,

doch genau das kann man dann sehen, wenn man die ? mit sinnvollen Texten und Variablen bestückt
und die Protokolldatei danach ansieht.
Dort steht genau drin wo das Programm in welcher Reihenfolge war.
Im Extremfall drucke ich mir die Ausgabe aus und gehe Schritt für Schritt
durch den Quellcode. Meines Wissens (habe ich aber noch nicht gemacht) geht das auch über mehrere Threads.

Wer eine bessere Idee hat möge sich melden.
Besser als unser Debugger ist es alle mal.
Gruß
Hubert
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo,

ich verwende in solchen Fällen ein Tool von SysInternals (jetzt Microsoft) namens DebugView. Es dient der Anzeige von Debugmeldungen, die von der untersuchten Anwendung mit Hilfe der der API-Funktion OutputDebugString() abgesetzt werden. DebugView kann auch als Remote-Debugger auf einem anderen Rechner im Netzwerk ausgeführt werden, z.B. wenn es auf dem Bildschirm eng wird und speziell natürlich wenn Fokuswechsel-Eventhandler debugged werden sollen.

Um zu verfolgen, was die untersuchte Anwendung treibt, füge ich an den interessanten Stellen die Zeile
"DebOut( <cMeldung> )" in den Source ein, ggf. umgeben von #ifdef DEBUG ... #endif

z.B. in einer aufgerufenen Funktion gleich als erste Zeile

Code: Alles auswählen

DebOut(  "Start " + procname() )
und vor RETURN

Code: Alles auswählen

DebOut( "Ende " + procname()  )
DebugView gibt es hier: http://www.microsoft.com/technet/sysint ... gview.mspx

Wichtig: Wenn die Anwendung unter XppDbg läuft, zeigt DebugView nichts an. Offenbar hat XppDbg als Empfänger solcher Meldungen Vorrang -- schluckt sie aber, ohne sie anzuzeigen.

Viele Grüße,
Günter

Code: Alles auswählen

FUNCTION DebOut( cString )
STATIC tpl
IF tpl = NIL
   tpl  := DllPrepareCall( "kernel32.dll", DLL_STDCALL, "OutputDebugStringA" )
ENDIF
RETURN DllExecuteCall( tpl, "T"+ltrim(str(ThreadID())) + " " + cString )
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo zusammen,

also wenn ich irgendwelche Probleme habe um diese dann zu lösen lasse ich mir mit msgbox die entsprechenden Variablen oder array usw.
anzeigen. Ob sich das jetzt mit diesem Punkt anwenden kann ??
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Rolf,

sobald die MsgBox erscheint, wechselt der Fokus. Das dürfte im vorliegenden Fall ebenso problematisch sein.

Viele Grüße
Günter
hschmidt
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 164
Registriert: Mo, 09. Jan 2006 17:06
Wohnort: Paderborn
Hat sich bedankt: 2 Mal
Kontaktdaten:

Beitrag von hschmidt »

Hallo Günter,
das war ein wertvoller Hinweis für mich.
Wir entwickeln in 2 Sprachen (Xbase++ und VO) und unsere Applikationen 'unterhalten' sich per OLE-Automation.
Mit Debugview habe ich jetzt die Möglichkeit, Debugmeldungen beider Programme in einem Fenster/Datei auszugeben und auszuwerten.

Vielen Dank!

Hans
Antworten