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

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von dtmackenzie am Di, 23. Jun 2009 14:34, insgesamt 2-mal geändert.
Viele Grüße,
David
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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 ?
Gruß
Hubert
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag von dtmackenzie »

Hallo Hubert,

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

David
Zuletzt geändert von dtmackenzie am Fr, 19. Jun 2009 15:51, insgesamt 1-mal geändert.
Viele Grüße,
David
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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 ...
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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.
Gruß
Hubert
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag 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
Viele Grüße,
David
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

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

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

Beitrag von Martin Altmann »

Hi David,
auch Dein Avatar (Bild) ist leider defekt.
Bitte passe doch dein Profil entsprechend an.

Vielen Dank,
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.
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

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

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

Beitrag 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
: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.
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag 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
Viele Grüße,
David
Dieter
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 237
Registriert: Do, 14. Aug 2008 14:59
Wohnort: Straelen
Hat sich bedankt: 2 Mal
Danksagung erhalten: 3 Mal

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

Beitrag 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.
Viele Grüße

Dieter

Was man nicht versteht, besitzt man nicht.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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 ;)
gruss by OHR
Jimmy
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag 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
Viele Grüße,
David
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

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

Beitrag von Jan »

David,

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

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

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

Beitrag 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).
Gruß
Hubert
Antworten