Seite 1 von 1
XbpApplication() ... und wie erweitern ?
Verfasst: Di, 09. Dez 2014 9:14
von brandelh
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 ...
Selbst wenn ich eine Ableitung davon mache, wird mir
GetApplication() --> oApp aber immer das Original liefern oder ?
Hat jemand damit schon Erfahrungen gemacht ?
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Di, 09. Dez 2014 10:13
von satmax
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>
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Di, 09. Dez 2014 10:43
von brandelh
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.
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Di, 09. Dez 2014 11:13
von satmax
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.
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Di, 09. Dez 2014 11:19
von satmax
Was aber funktioniert ist:
METHOD myApp:init(cUserID)
::cUserID:=cUserID
oApp := GetApplication()
oApp:cargo:=self
RETURN self
...
oApp := GetApplication()
oApp:cargo:getUserID())
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Di, 09. Dez 2014 13:26
von brandelh
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
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Di, 09. Dez 2014 20:30
von AUGE_OHR
hi,
bislang hab ich nur
verwendet womit ich meine eigene XbpDialog Class ansprechen kann.
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Mi, 10. Dez 2014 17:34
von satmax
Was zum Beispiel geht:
Code: Alles auswählen
LOCAL oApp := GetApplication()
oApp:cargo:=DataObject():New()
In irgendeiner anderen Funktion:
oder gleich
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.
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Do, 11. Dez 2014 10:53
von brandelh
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
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Do, 11. Dez 2014 20:43
von AUGE_OHR
brandelh hat geschrieben:hatte ich allerdings von XppApplication()
abgeleitet und nicht von XbpApplication()
äh ... Typo ?
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Fr, 12. Dez 2014 9:33
von Rolf Ramacher
Hallo zusammen,
was macht man min xbpapplication eigentlich ? diese Funktion habe ich gar nicht . Zusatztool ?
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Fr, 12. Dez 2014 9:46
von brandelh
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
Re: XbpApplication() ... und wie erweitern ?
Verfasst: Fr, 12. Dez 2014 10:18
von Tom
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:
Will man also erfahren, was im Hauptfenster als Titel angezeigt wird - oder das manipulieren -, macht man das so:
oder
Code: Alles auswählen
GetApplication():mainForm:SetTitle('Anderer Fenstertitel')