Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

XbpApplication() ... und wie erweitern ?

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

XbpApplication() ... und wie erweitern ?

Beitrag von brandelh » Di, 09. Dez 2014 9:14

Mit dem Applikationsobjekt soll man ja das ganze Programm verwalten ...
XbpApplication() - Klassenfunktion der XbpApplication-Klasse hat geschrieben: XbpApplikation ist eine spezielle Klasse für GUI- und Hybrid Modus-Anwendungen. Pro Anwendung existiert jeweils ein solches Anwendungsobjekt.
Von der Klasse XbpApplication werden normalerweise keine Instanzen erzeugt.
Wenn ich aber davon keine Klasse ableiten kann, aus der ich dann mein eigenes Objekt erzeuge, wie kann ich dann das Anwendungsobjekt um Methoden und iVars erweitern ?

Ich meine schon mal so einen Funktion gesehen zu haben, kann aber nichts finden ... :oops:

Selbst wenn ich eine Ableitung davon mache, wird mir GetApplication() --> oApp aber immer das Original liefern oder ?
Hat jemand damit schon Erfahrungen gemacht ?
Gruß
Hubert

Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 778
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von satmax » Di, 09. Dez 2014 10:13

Ich bin mir nicht ganz sicher was Du meinst, folgendes funktioniert:

Code: Alles auswählen

CLASS myApp FROM xbpApplication
      VAR cUserID    // 
      VAR cPrinter   // 
EXPORTED:
   	 METHOD init
   	 METHOD getUserID()
ENDCLASS

METHOD myApp:init(cUserID)
::cUserID:=cUserID
RETURN self

METHOD myApp:getUserId()

RETURN ::cUserID

Code: Alles auswählen

public_App:=myApp():new("ICH")
debugPrint("public_App:cUserID", public_App:getUserID())
Liefert:
10:11:17 <public_App:cUserID><ICH>
Gruß
Markus

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von brandelh » Di, 09. Dez 2014 10:43

Das ist eine normale Ableitung, die laut Hilfe hier aber normalerweise nicht gemacht wird ;-)
XbpApplikation ist eine spezielle Klasse für GUI- und Hybrid Modus-Anwendungen. Pro Anwendung existiert jeweils ein solches Anwendungsobjekt.
Von der Klasse XbpApplication werden normalerweise keine Instanzen erzeugt. Der Zugriff auf die Instanzvariablen und Methoden des globalen Anwendungsobjekts erfolgt stattdessen über die entsprechenden Klassenvariablen und -methoden der Klasse XbpApplication. Das globale Anwendungsobjekt einer Xbase ++-Applikation kann mit Hilfe der Funktion GetApplication() ermittelt werden.
kennt GetApplication() deine eigenen Methoden ?
So wie du es geschrieben hast, hätte ich das erwartet ... aber die Frage war wie Alaska das vorgesehen hat mit den Class Vars von XbpApplikation ...
Ich habe das auch in der newsgroup gefragt, mal sehen was dort kommt.
Gruß
Hubert

Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 778
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von satmax » Di, 09. Dez 2014 11:13

kennt GetApplication() deine eigenen Methoden ?
Nein, nun in der abgeleiteten Klasse. Hätte ich aber auch nicht anders erwartet.

Eine bestehende Klasse kann man doch nur durch ableiten erweitern, oder? Und nur in der abgeleiteten Klasse stehen die eigenen Erweiterungen zu Verfügung. Oder verstehe ich das falsch?

Ich bin auch auf die Antwort in der Newsgroup gespannt.
Gruß
Markus

Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 778
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von satmax » Di, 09. Dez 2014 11:19

Was aber funktioniert ist:
METHOD myApp:init(cUserID)
::cUserID:=cUserID
oApp := GetApplication()
oApp:cargo:=self
RETURN self
...
oApp := GetApplication()
oApp:cargo:getUserID())
Gruß
Markus

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von brandelh » Di, 09. Dez 2014 13:26

satmax hat geschrieben:Eine bestehende Klasse kann man doch nur durch ableiten erweitern, oder?
das ist die Frage ... im Hinterkopf meine ich schon mal gesehen zu haben dass jemand ohne Ableitung eine Klasse angepaßt hat, aber es kann sein dass ich mich irre 8)
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10522
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpApplication() ... und wie erweitern ?

Beitrag von AUGE_OHR » Di, 09. Dez 2014 20:30

hi,

bislang hab ich nur

Code: Alles auswählen

oMain := GetApplication():mainForm
verwendet womit ich meine eigene XbpDialog Class ansprechen kann.
gruss by OHR
Jimmy

Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 778
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von satmax » Mi, 10. Dez 2014 17:34

Was zum Beispiel geht:

Code: Alles auswählen

LOCAL oApp := GetApplication()
oApp:cargo:=DataObject():New()
In irgendeiner anderen Funktion:

Code: Alles auswählen

LOCAL oApp := GetApplication()
oApp:cargo:Firma :=""
oder gleich

Code: Alles auswählen

oApp:cargo:Strasse    := cUtf8ToAnsi(tokenNext(@tmpStr))
Wieder in einer anderen Funktion:
LOCAL oApp := GetApplication()
IF oApp:cargo:Firma != nil
? oApp:cargo:Firma
ENDIF
Der Vorteil, :cargo kannst jederzeit und nach belieben erweitern, einfach mit

LOCAL oApp := GetApplication()

das Objekt holen (immer über lokale Variable), dann einfach erweitern:

oApp:cargo:WiederWasAnderes:= 4711

So kannst Cargo für vieles einfach und dynamisch verwenden. Die iVar (ich glaube so nennt man das) wird automatisch angelegt.
Gruß
Markus

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von brandelh » Do, 11. Dez 2014 10:53

Hi,

es ist viel einfacher als gedacht, die Doku verschweigt, dass GetApplication() genauso arbeitet wie SetAppWindow().
In meinen Tests hatte ich allerdings von XppApplication() abgeleitet und nicht von XbpApplication() und dann knallt es bei dem ersten XbpDialog() Fenster in Create(),
weil dieses nämlich in GetApplication():mainForm das Objekt speichern möchte. Diese iVar gibt es aber bei XppApplication() nicht.

Tomas Braun hat den Fehler in meinem Code in der NEWS-Group gefunden ...

Nun geht das alten Beispiel in dem ich die CLASS VAR Info ins GetApplication() Objekt eingefügt habe :-)

Code: Alles auswählen

///////////////////////////////////////////////////////////////////////////////
//
//  Function-oriented code created by the Xbase++ FormDesigner
//    Creation date: 08.12.2014 Time: 13:06:40
//
///////////////////////////////////////////////////////////////////////////////

#include "Gra.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Font.ch"

#PRAGMA LIBRARY( "ascom10.lib" )

procedure AppSys
return

CLASS MyApp FROM XbpApplication // NICHT Xpp !!!!
   EXPORTED
   CLASS VAR Info
ENDCLASS

PROCEDURE Main
   LOCAL nEvent, mp1, mp2, aSize
   LOCAL oDlg, oXbp, drawingArea, aEditControls := {}
   LOCAL nLastEvent, oPB

   GetApplication( MyApp() )

   MyApp():info := "Test"

   msgbox(MyApp():info,"1")

   msgbox(GetApplication():info,"2")

   IF IsMemberVar(XbpDialog(),"ClientSize") == .T.
      aSize := {0,0}
   ELSE
      aSize := {154,155}
   ENDIF

   oDlg := XbpDialog():new( AppDesktop(), , {636,703} , aSize, , .F.)
   IF aSize[1] == 0 .AND. aSize[2] == 0
      oDlg:ClientSize := {300,400}
   ENDIF
   oDlg:taskList := .T.
   oDlg:title := "New form"
   oDlg:create()

   drawingArea := oDlg:drawingArea
   drawingArea:setFontCompoundName( "8.Arial" )

   oXbp := XbpMLE():new( drawingArea, , {16,50}, {280,300}, { { XBP_PP_BGCLR, XBPSYSCLR_ENTRYFIELD } } )
   oXbp:tabStop := .T.
   oXbp:editable := .f.
   oXbp:wordWrap := .t.
   oXbp:horizScroll  := .f.

   oXbp:create()

   logger(oXbp) // Logger initialisieren

   oXbp := XbpPushButton():new( drawingArea, , {16,16}, {100,24}, { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   oXbp:caption := "Pushbutton"
   oXbp:tabStop := .T.
   oXbp:create()
   oXbp:activate   := {|| logger("Activate ***")   }
   oXbp:lbDblClick := {|| logger("lbDblClick")  }
   oXbp:lbClick    := {|| logger("lbClick") }
   oXbp:lbDown     := {|| logger("lbDown") }
   oXbp:lbUp       := {|| logger("lbUp") }

   oPB := oXbp
   CenterControl(oDlg)

   oDlg:show()
   SetAppFocus(oDlg)

   nEvent := xbe_None
   nLastEvent := 0
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      if oXbp = oPB .and. nEvent = xbeP_Activate
         if nLastEvent+0.30 > seconds()
            nEvent := xbe_None
            tone(1000,3)
         else
            nLastEvent := seconds()
         endif
      endif
      if nEvent # xbe_None
         oXbp:handleEvent( nEvent, mp1, mp2 )
      endif
   ENDDO
RETURN

function logger(cTxt)
   static oLog := NIL
   if valtype(cTxt)="O"
      oLog := cTxt
   else
      oLog:setData( oLog:editBuffer()+chr(13)+chr(10)+time()+chr(9)+cTxt )
   endif
RETURN NIL
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10522
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpApplication() ... und wie erweitern ?

Beitrag von AUGE_OHR » Do, 11. Dez 2014 20:43

brandelh hat geschrieben:hatte ich allerdings von XppApplication()
abgeleitet und nicht von XbpApplication()
äh ... Typo ?
gruss by OHR
Jimmy

Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1818
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von Rolf Ramacher » Fr, 12. Dez 2014 9:33

Hallo zusammen,

was macht man min xbpapplication eigentlich ? diese Funktion habe ich gar nicht . Zusatztool ?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 13753
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von brandelh » Fr, 12. Dez 2014 9:46

Die wurde in 1.90.355 eingeführt, um Ereignisse für die komplette Anwendung zu verarbeiten und wohl auch für VisualStyles:
Doku hat geschrieben: XbpApplication() - Klassenfunktion der XbpApplication-Klasse
Superklassen
XppApplication()
Rückgabe
Die Funktion XbpApplication() gibt das Klassenobjekt der XbpApplication-Klasse zurück.

Beschreibung

XbpApplikation ist eine spezielle Klasse für GUI- und Hybrid Modus-Anwendungen. Pro Anwendung existiert jeweils ein solches Anwendungsobjekt.
Von der Klasse XbpApplication werden normalerweise keine Instanzen erzeugt. Der Zugriff auf die Instanzvariablen und Methoden des globalen Anwendungsobjekts erfolgt stattdessen über die entsprechenden Klassenvariablen und -methoden der Klasse XbpApplication.
Das globale Anwendungsobjekt einer Xbase ++-Applikation kann mit Hilfe der Funktion GetApplication() ermittelt werden.

Klassenvariablen

:enableVisualStyles Visuelle Stile für die Anwendung ein- oder ausschalten.
Attribut: EXPORTED
Datentyp: Numerisch (XBPAPP_ALLSTYLES)

:mainForm Das Hauptfenster der Anwendung.
Attribut: EXPORTED
Datentyp: Object (NIL)

Klassenmethoden

:getEnableVisualStyles()
Stellt fest, ob visuelle Stile für die Anwendung ein- oder ausgeschaltet sind.

:setEnableVisualStyles( <lEnable> )
Visuelle Stile für die Anwendung ein- oder ausschalten.

:setMainForm( <oForm> )

Das Hauptfenster der Anwendung festlegen.

Globale Nachrichten

xbeP_SystemPropertyChanged Eine Systemeinstellung wurde geändert.
Slot :systemPropertyChanged := {| nProperty, cArea, self | ... }

Methode :systemPropertyChanged( <nProperty>, <cArea> ) --> self
geerbt von der Super Klasse:
Klassenvariablen

:cargo Instanzvariable zur freien Verwendung.

Attribut: CLASS VAR EXPORTED

Datentyp: Any (NIL)

Klassenmethoden

:handleEvent( <nEvent>, <mp1>, <mp2> ) --> self
Globales Anwendungsereignis verarbeiten.

Globale Nachrichten

xbeP_SystemPowerStatus Der Energiestatus des Systems hat sich geändert.
Slot :systemPowerStatus := {| nChange, uNIL, self | ... } --> nResponse
Methode :systemPowerStatus( <nChange> ) --> nResponse
Gruß
Hubert

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 6793
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpApplication() ... und wie erweitern ?

Beitrag von Tom » Fr, 12. Dez 2014 10:18

Hallo, Rolf.

XbpApplication ist ein Klassenobjekt. Das ist, sehr einfach gesagt, eine Klasse, von der es automatisch ein Objekt gibt, und zwar immer nur eines. Man kann keine eigenen Klassen davon ableiten oder weitere Objekte erzeugen. XbpApplication() ist schlicht vorhanden. Das Klassenobjekt enthält einige Informationen über die Anwendung selbst, wie Hubert das skizziert hat. Man erreicht es über GetApplication(). Wenn man beispielsweise möchte, dass die eigene Applikation keine visuellen Stile verwendet, obwohl eine Manifestdatei vorhanden/gelinkt ist und das Betriebssystem generell so eingestellt ist, macht man das hier (vor dem Erzeugen des ersten Dialogs):

Code: Alles auswählen

GetApplication():EnableVisualStyles := XBPAPP_NOSTYLES
Will man von irgendwo in der Anwendung - ganz egal, in welchem Thread man sich befindet oder was sonst so passiert - auf das Dialogobjekt zugreifen, das als erstes bzw. als Applikationsfenster erzeugt wurde, so erhält man das auf diese Art:

Code: Alles auswählen

GetApplication():mainForm
Will man also erfahren, was im Hauptfenster als Titel angezeigt wird - oder das manipulieren -, macht man das so:

Code: Alles auswählen

? GetApplication():mainForm:title
oder

Code: Alles auswählen

GetApplication():mainForm:SetTitle('Anderer Fenstertitel')
Herzlich,
Tom

Antworten