Zugriff auf Statusbar des Haupt-Anwendungsfensters

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2128
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von Werner_Bayern »

Servus,

auch mich hat es erwischt, nach 22 Jahren Clipper-Programmierung nun doch auf Xbase++ umzusteigen. Bin gerade am Programmieren meines ersten Programmes mit Xbase++, selbstverständlich in reinem GUI.

Anfängerfrage: Habe brav mein Anwendungsfenster in AppSys definiert inkl. Statusbar.
Jetzt möchte ich in versch. Funktionen, die z. B. von main oder von Funktionen, die über das Menü im Anwendungsfenster mittels Codeblöcke aufgerufen werden, die Statusbar:caption des Anwendungsfensters ändern.

Wie löst man sowas elegant?

Danke,

Werner
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15707
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 71 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von brandelh »

Hi,

in der AppSys speicherst du dein Hauptfenster in der Funktion SetAppWindow()

Code: Alles auswählen

SetAppWindow(oDlg) <-  speichern
im gesamten Programm kannst du darauf zugreifen ... z.B. um den Titel zu ändern ...

Code: Alles auswählen

SetAppWindow():setTitle("Mein neuer Titel")
Alle Methoden und Childs (->childlist) kann man so erreichen.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2128
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von Werner_Bayern »

Morgen,

Danke. Leider aber nicht die Statusbar. Das hatte ich so schon getestet. Ich meine NICHT die Titelzeile des Anwendungsfensters.

Servus,

Werner
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15707
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 71 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von brandelh »

Was genau ist denn die Statusbar ?

In einem XbpDialog gibt es sowas nicht, außer man baut es ein.
Wenn man es einbaut, gibt es eine Instanzvariable ...

Ich habe meinen Fenstern unten eine SLE für Informationen spendiert und fülle die so.
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2128
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von Werner_Bayern »

Habs derweil so gelöst:

Code: Alles auswählen

// Statusbar Hauptfenster
oStatusbar := XbpStatusbar():new(oDlg:drawingArea)
oStatusbar:create(,,{0, 0}, {oDlg:drawingArea:currentsize()[1], 30})
oPanel := oStatusbar:getItem(1)
oPanel:autosize := XBPSTATUSBAR_AUTOSIZE_SPRING
oDlg:cargo := oStatusbar
und in der Funktion dann:

Code: Alles auswählen

oXbp := SetAppWindow():cargo
oXbp:getItem(1):caption := "neue Meldung"
Geht aber sicher auch eleganter?

Danke.

Werner
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von AUGE_OHR »

Werner_Bayern hat geschrieben:Habs derweil so gelöst:
...
Geht aber sicher auch eleganter?
Das ist schon sehr gut so gelöst mit :Cargo !

Wenn du nun weiter mit Objecten unter Xbase++ arbeitest werden sich ähnliche Fragen ergeben.
Ich lösen das ganze mit dem "Summer 93" Prinzip.

Code: Alles auswählen

#xtranslate oStatusbar        => Stack\[nDim,1]
...
#xtranslate oEnde              => Stack\[nDim,100]

STATIC aStack := {}
STATIC nDim    := 0

FUNCTION INIT_STACK()
   AADD( Stack, ARRAY( 100 ) )
   nDim++
   // fill Element
   oStatusbar := NIL
...
   oEnde := NIL
RETURN nDim

FUNCTION EXIT_STACK(nThread)
LOCAL iMax

   ADEL(Stack,nThread)
   DO WHILE .T.
      iMax := LEN(Stack)
      IF iMax = 0
         EXIT
      ELSEIF Stack[iMax] = NIL
         ASIZE(Stack,LEN(Stack) - 1)
      ELSE
         EXIT
      ENDIF
   ENDDO
   nDim := LEN(Stack)
RETURN nDim

FUNCTION SP_Statbar(xValue)
   IF PCOUNT() > 0
      oStatusbar := xValue
   ENDIF
RETURN oStatusbar
Ich habe also ein Array wo ich jedes Element per Function() anspreche.

Code: Alles auswählen

PROCEDURE MAIN
...
INIT_STACK()
...
oStatusbar := XbpStatusbar():new(oDlg:drawingArea)
oStatusbar:create(,,{0, 0}, {oDlg:drawingArea:currentsize()[1], 30})
// "speicher" Object in Array
SP_Statbar(oStatusbar)
und dann kannst du von "überall"

Code: Alles auswählen

SP_Statbar():getItem(1):caption := "neue Meldung"
ran

Durch nDim ist das ganze auch MDI / Thread fähig und eignet sich durch #xtranslate um Cl*pper SAY / GET Memvar weiter zu verwenden.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15707
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 71 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von brandelh »

Hi,

solange du die CARGO Variable nicht anderweitig benötigst ist das völlig OK.

Ich nutze nur spezielle iVars für mehrere globale Sachen ...

Code: Alles auswählen

*------------------------------------------------------------------------------------------------
* Applikationsvariablen im RootFenster merken -> Immer zugänglich ber RootWindow()

CLASS HBRootDialog FROM XbpDialog
   EXPORTED:
      VAR lDemoMode
      VAR DlgAboutBitmap     // Resource-ID fr DlgAboutBitmap (Hintergrund)
      VAR DlgAboutBG         // Hintergrundfarbe fr AboutDialog ohne Hintergrundbild
      VAR DlgAboutOption     // Art der BMP Anpassung
      VAR ProgName
      VAR ProgVersion
      VAR ProgVersionMitDatum // wenn .t. wird Version - Freigabedatum angezeigt
      VAR ProgFreiDatum
      VAR aProgOwner         // Lizenzgeber
      VAR aProgUser          // Lizenznehmer 2 Zeilen
      VAR aLizenzText        // Lizenztext  max 3 Zeilen
      VAR NotHideMenuItems   // Immer Bearbeiten und Fenster anzeigen
      VAR UserInfo                // Infos ber angemeldeten User -> Text für ErrorSys !
      VAR StandardDrucker    // NIL, wenn der Standarddrucker benutzt werden soll,
                             // sonst genau die Zeichenkette, die zur Druckerauswahl
                             // benötigt wird.
      VAR RunInReadOnlyMode  // wenn dies aktiviert ist, mssen alle memowrite etc.
                             // im Programmverzeichnis unterbleiben
      METHOD init
      METHOD resize          // Standardverhalten von xpp ist, das alle nach links unten
                             // ausgerichtet wird, das gef„llt mir nicht und ist auch nicht
                             // Windowsstandard
ENDCLASS
*------------------------------------------------------------------------------------------------
METHOD HBRootDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   * Methode der Superklasse rufen
   ::XbpDialog:init( oParent, oOwner, aPos, aSize, aPP, lVisible )
   ::ProgName            := "MDI-Programmgerst HB_XBASE\MDI"
   ::ProgVersion         := "0.00"
   ::ProgVersionMitDatum := .t.
   ::ProgFreiDatum       := "tt.mm.jjjj"
   ::aProgOwner          := {}  // Lizenzgeber  2 Zeilen
   ::aProgUser           := {}  // Lizenznehmer 2 Zeilen
   ::aLizenzText         := {}  // Lizenztext  max 3 Zeilen
   ::NotHideMenuItems    := .f. // Immer Bearbeiten und Fenster anzeigen
   ::lDemoMode           := .f. // .t. bei DEMO Programmen beachte auch Compilerschalter
   ::StandardDrucker     := NIL // NIL, wenn der Standarddrucker benutzt werden soll,
                                // sonst genau die Zeichenkette, die zur Druckerauswahl
                                // ben”tigt wird. Im Hauptprogramm aus INI setzten, falls
                                // gewnscht.
   ::icon                := ICON_APPLICATION // muss in ARC definiert sein !
   ::DlgAboutBitmap      := 0   // Standard ist KEINE Bitmap
   ::DlgAboutBG          := XBPSYSCLR_DIALOGBACKGROUND  // Standard ist Dialog Hintergrund
   ::DlgAboutOption      := XBP_IMAGE_NORMAL // Standard ist keine Anpassung
RETURN self
*-----------------------------------------------------------------------------
METHOD HBRootDialog:resize ( aOldSize, aNewSize )
   local nMoveOnY
   nMoveOnY := aOldSize[2] - aNewSize[2]     // Unterschied ermitteln
   aeval(::drawingArea:childList(),{|oXbp| oXbp:setPos( ;
                                              { oXbp:currentPos()[1],;
                                                oXbp:currentPos()[2] - nMoveOnY }, .f. ) } )
                                             // Position ändern, aber nicht anzeigen
   ::drawingArea:invalidateRect()            // nun neue Anzeige erzwingen
RETURN self
so als Beispiel in der ErrorSys gebe ich z.B. mehrere Infos über den aktuellen Fall aus.
Statt dort die nötigen Infos zu suchen speichere ich die beim Öffnen eines Falles direkt in die
globalen IVars ...

Die Funktion RootWindow() entspricht SetAppWindow(), ich sezte beide am Anfang gleich,
wobei ich ab und zu das SetAppWindow() wechsle, das RootWindow() NIE !
Gruß
Hubert
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2128
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 75 Mal

Re: Zugriff auf Statusbar des Haupt-Anwendungsfensters

Beitrag von Werner_Bayern »

Danke Jimmy, danke Hubert!
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten