Seite 1 von 1

Erfolg! Und eine weitere Frage... [ERLEDIGT]

Verfasst: Fr, 19. Jun 2009 15:03
von dtmackenzie
Erstmal ein riesen Dankeschön für Eure Hilfe - unsere interne (ehemalige Clipper 5.3) EDV-Anwendung ist nun mit Xbase++ (Textmodus) und ADS im Betrieb.
Es kommen immernoch Inkompatibilitäten zum Vorschein aber die in der letzten Zeit aufgetretene Probleme sind lösbar und die Benutzer sind halbwegs zufrieden, insbesondere was die Geschwindigkeit betrifft - nochmal einen besonderen Dank an olaf870!

Nun zur nächsten Frage - ist es in einer Textmodus-Anwendung irgendwie möglich, beim Ereignis "Fenster schließen" eine Funktion auszuführen? Zum Beispiel wenn der Benutzer den Windows "X-Knopf" oben rechts im Fenster clickt. Ich würde gern die Datenbankverbindung ordentlich kappen in diesem Fall anstatt auf das ADS-Timeout zu warten. Ist ja aber nicht so ganz schlimm wenn es nicht geht.

Viele Grüße,
David

Re: Erfolg! Und eine weiter Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 15:30
von brandelh
Hallo,

ist das Programm mit GUI = YES compiliert ?
Dann basiert es auf einem XbpCrt() und das hat einen XbpCrt():close slot.
Ich verwende bei meinem in der abgewandelten AppSys:

Code: Alles auswählen

oCrt:close := {|| prog_ende() } 
// -> die Funktion die bei uns von F12 zum Beenden aufgerufen wird.
Oder aber ...
SetAppWindow():close := {|| prog_ende() } // im Haupprogramm
in prog_ende() wird dann gefragt ob die Schleife verlassen werden soll oder nicht.
Wenn ja raumt es auf und quit ...
Wenn nein, Bildschirm refreshen und weiter ...

Wie heist eigentlich die Klasse bei GUI=NO ?

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 15:35
von dtmackenzie
Hallo Hubert,

das Programm ist im Textmodus, also mit GUI=NO compiliert.
Deine letzte Frage trifft genau den Punkt...

David

Re: Erfolg! Und eine weiter Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 15:48
von brandelh
Hi,

probier doch mal ob SetAppWindow() was sinnvolles zurück gibt, bzw.
versuche gleiche SetAppWindow():close := {|| myfunk() }

Bei der 1.90.355 könnte ein AppObject() helfen, aber ich habe es jetzt nicht probiert.

Re: Erfolg! Und eine weiter Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 15:53
von AUGE_OHR
dtmackenzie hat geschrieben:das Programm ist im Textmodus, also mit GUI=NO compiliert.
Deine letzte Frage trifft genau den Punkt...
siehe dir doch mal in die c:\ALASKA\XPPW32\SOURCE\SYS\AppSys.prg

wenn GUI=NO -> CASE nAppType == APPTYPE_VIO .OR. nAppType == APPTYPE_NOVIO
in der AppSys.PRG wird auch das oCrt := RootCrt():New() erzeugt und mit SetAppWindow ( oCrt )
das oCrt "Fenster" als Ausgabe gewählt.

... nun gibt SetAppWindow() ohne Parameter das "Fenster" zurück -> oCrt und da kannst du nun
deinen oCrt:close := {|| myEnde() } reinpacken. Da es nach dem oCrt:create() ist muss man
evtl. ein oCrt:configure() ausführen ... müsste mal in alten Source kramen ...

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 16:10
von brandelh
Hi,

also ich habe es probiert. Man muss nach

Code: Alles auswählen

SetAppWindow():close := {|| EndeFunc() }
kein configure() ausführen, da ja an den Einstellungen für die Resource etc. nichts geändert wird.
Erst wenn der Event ausgelöst wird, wird nachgesehen ob die Instanzvariable (Callback-Slot) ungleich NIL ist.

ABER man MUSS ein XbpCRT() Fenster haben (-> GUI=YES ) sonst kommt Instanzvariable nicht gefunden.

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 16:23
von dtmackenzie
Ja, SetAppWindow() ergibt ein RootCrt bzw. VCrt Objekt, beim Versuch SetAppWindow():close zuzuweisen bekomme ich die Fehlermeldung "Member-Variable ist für dieses Objekt unbekannt".
Trotzdem Danke für die nette Idee!
Jetzt ab ins Wochenende...

David

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 16:38
von brandelh
Also mit dem AppObject() wird es wohl auch nicht gehen, da dieses (so wie ich das verstehe) nicht für den Close Event zuständig ist.

ABER !

mir viel gerade ein, es gibt eine Stelle die fürs Aufräumen zuständig ist, EXIT PROCEDURE
aber auch diese wird nach meinem Test nicht aufgerufen ...

Kann man eine Console nicht so einstellen, dass diese nicht per X beendet werden kann ?

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Fr, 19. Jun 2009 22:21
von Martin Altmann
Hi David,
auch Dein Avatar (Bild) ist leider defekt.
Bitte passe doch dein Profil entsprechend an.

Vielen Dank,
Martin

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Mo, 22. Jun 2009 9:58
von dtmackenzie
Hi Martin,

mein Avatar war auf unserer Webseite, ging verloren bei Provider-Wechsel (von 1&1 nach Strato).
Hab ich aber nun direkt ins Forum hochgeladen.

Hi Hubert,

ich habe letzte woche alle QUITs in der Anwendung mit einer eigener Funktion ersetzt - dafür wäre EXIT PROCEDURE auf alle Fälle eleganter gewesen.
Leider habe ich keinen Weg gefunden, das X in der Consoleneinstellungen zu unterbinden.
Unser Gerätetreiberprogrammierer hat vorgeschlagen, einen zweiten Prozess als "Wächter" zu starten und mit Windows-API FindWindow() bzw. EnumWindows() zu kontrollieren, ob das Programm noch läuft. Naja, den Gedanke lasse ich lieber eine Woche reifen...

Viele Grüße,
David

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Mo, 22. Jun 2009 10:59
von Martin Altmann
Hallo David,
vielen Dank!
Tipp: Wende Dich an Sören und komme mit ihm gemeinsam am 1.8. nach Osnabrück.
Dort kannst Du Steffen Pirsig direkt fragen - ich mache nur noch GUI und habe mich mit Hybrid/VIO damals (vor Jahren) nicht lange aufgehalten...

Viele Grüße,
Martin

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Mo, 22. Jun 2009 11:08
von dtmackenzie
Hi Martin,

leider kann ich nicht nach Osnabrück - bin am 1.8. außer Lande.
Die Wochenenden sind sowieso meistens anders geplant...
Ich wollte mich aber doch bald bei Sören melden - da hast Du mich gerade daran erinnert...

Viele Grüße,
David

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Mo, 22. Jun 2009 22:54
von Dieter
Hallo David,

ich verstehe nicht ganz, warum du nicht mit GUI = YES kompilierst?
Ein xbpCrt-Fenster bleibt auch dann ein Textmodus-Fenster. Der Unterschied ist,
dass man das Fenster in der Größe verändern kann (z.B. 30 Zeilen x 100 Spalten) und
man auf Instanzvariable und Methoden der xbpcrt-Klasse zugreifen kann. Für dich am wichtigsten
ist aber, dass wenn ein Benutzer den Windows "X-Knopf" oben rechts im Fenster clickt,
ein Ereignis xbeP_Close generiert wird, welches auch ein Textmodus-Programm über einen
Codeblock auswerten kann.
Für ein Standard-Clipper Crt-Fenster (25 x 80) habe ich in der main() folgenden Code untergebracht:

Code: Alles auswählen

//Crt-App-Fenster
aSizeDesktop := AppDesktop():currentSize()
oCrt := SetAppWindow()
oCrt:close := {|| session_ende()}
oCrt:FontName := "TERMINAL"
oCrt:FontHeight := 18
oCrt:FontWidth := 10
oCrt:Border := XBPDLG_SIZEBORDER
oCrt:configure()
aSize := oCrt:currentSize()
aPos  := { (aSizeDesktop[1]-aSize[1]) /2, (aSizeDesktop[2]-aSize[2]) /2}
oCrt:SetTitle("FI-Session " + Str(ses_nr))
oCrt:configure(NIL,NIL,aPos,25,80)
Ich hoffe, dass du dein Problem so in den Griff bekommst und keine weiteren Kompatibilitätsprobleme auftauchen.

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Mo, 22. Jun 2009 23:50
von AUGE_OHR
Dieter hat geschrieben:ich verstehe nicht ganz, warum du nicht mit GUI = YES kompilierst?
Yup Du hast völlig Recht.

Damit es noch mehr nach Windows aussieht kann man mit einem XbpDialog() in der Main anfangen
und auf die oDialog:drawingArea das oCrt Fenster setzen. Da das oCrt ja nun ein (MDI) Child ist
kannst du den oCrt:title nun in den oDialog:title verlegen und ja auch das XbpMenu() benutzen ...

also David, der nächste Schritt Xbase++ nach GUI steht an ;)

Re: Erfolg! Und eine weitere Frage ("Close" abfangen?)...

Verfasst: Di, 23. Jun 2009 14:31
von dtmackenzie
Danke Dieter, Danke Jimmy.

Ja, Ihr habt doch Recht, ich sollte das bald probieren.
Für MDI/Multithreading ist die Anwendung nicht ausgelegt, aber z.B. größere Fenster wären auch schon von Nutzen.
Also, ich markiere diesen Diskussionsfaden erstmal als erledigt.

Viele Grüße,
David

Re: Erfolg! Und eine weitere Frage... [ERLEDIGT]

Verfasst: Di, 23. Jun 2009 14:43
von Jan
David,

MDI und Multithreading sind 2 Paar ganz verschiedene Schuhe. Du kannst zwar beides gleichzeitig nutzen, musst aber nicht.

Jan

Re: Erfolg! Und eine weitere Frage... [ERLEDIGT]

Verfasst: Di, 23. Jun 2009 15:05
von brandelh
Hi,

auch wird das Programm als solches nicht zu einem GUI / MDI etc. Programm
nur weil der GUI=YES gesetzt wird. Es sieht bis auf wenige Ausnahmen noch genauso aus wie vorher.
Nur kann man nun alles nutzen, was Xbase++ mehr zur Verfügung stellt als Clipper.

Vorteile Z.B.
- XbpPrinter() (oder meine Druckerklasse ;-) )
- XbpCrt() Fenster steuern (Titel, Größe, Schriftart, CLOSE Event etc.)
- GUI Meldungen bzw. Auswahlfenster (wenn man möchte)
...

Nachteile (falls man das so nennen will ...)
- Kein VOLLBILD Modus, der mit CMD Fenstern möglich ist oder war (???), schon lange nicht mehr probiert ;-)
- Schriftart kann nicht über das äußere Consolenmenü eingestellt werden (nur im Programm, was besser ist ...)

Zu dem Thema passt mein MIG_01 Vortrag auf der Devon 2007, der liegt in der Wissensdatenbank (wenn ich mich jetzt nicht irre).