Seite 1 von 1

Zentrierung einer confirmBox() auf Arbeitsbildsch

Verfasst: Do, 23. Mär 2017 15:02
von Werner
Hi!

Meine Xbase++ Entwicklung ist noch auf eine relativ kleine Bildschirmauflösung 800* 600 Pixels ausgelegt. Wenn das Programm jetzt auf einer höheren Bildschirmauflösung laufen soll, dann berechne
ich einen Vergrößerungsfaktor (z.B. yzaufl=1.6) und multipliziere alle SAY- oder GET-Koordinaten mit diesem Faktor. Somit setzt sich die Grunddatenmaske (etwas auseinandergezogen) in das von mir bestimmte Rechteck: z.B. aRect := {800,500,925,625}

Danach habe ich einen Frame definiert: z.B.

Code: Alles auswählen

oFrame := xbpStatic():new(,, {30.60}, {645,810})
oFrame:type := XBPSTATIC_TYPE_RAISEDBOX
oFrame:SetColorBG (GRA_CLR_BACKGROUND)
oFrame:create()
Wenn ich jetzt aber eine definierte Box (z.B. ConfirmBox()) aufrufe, dann setzt sich diese Box zentral in die Mitte des gesamten Bildschirms und nicht in die Mitte meines definierten Rechtecks. Dies sieht nicht immer so sehr gut aus! Eine solche Box sieht etwa so aus:

Code: Alles auswählen

texto := "Das ist meine Confim-Box"
if confirmBox[,texto,"RGB-Service",XBPMB_YESNO, XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_DEFBUTTON1== 6
store "J" to jn
else
store "N" to jn
endif
Wie könnte ich es erreichen, dass sich solche vordefinierten Boxen mittig in das von mir mit oFrame definierte Rechteck setzen?

Vielen Dank im Voraus!

MfG Werner

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Verfasst: Do, 23. Mär 2017 19:37
von georg
Hallo, Werner -


vor ein paar Tagen wurde ein ähnliches Thema hier: http://www.xbaseforum.de/viewtopic.php? ... ox#p110673 besprochen.

Vielleicht hilft Dir das weiter? (Es geht nicht, da es ein Windows-Control ist, aber man kann seine eigene Version der ConfirmBox() anhand des von Alaska gelieferten Beispiels erstellen.)

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Verfasst: Do, 23. Mär 2017 20:36
von Jan
Hallo Werner,

das Problem ist, das man bei der MsgBox() keinen Parent angeben kann. Bei der von Georg vorgeschlagenen ConfirmBox() dagegen schon. Der Nachteil ist, das man da halt auch mehr Parameter enistellen muß. Der Vorteil ist, das man mehr Parameter einstellen kann.

Jan

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Verfasst: Fr, 24. Mär 2017 8:14
von brandelh
Darum hab ich mir die ConfirmBox zu neuen eigenen MsgBoxen umgebaut, die spezielle Sachen machen ohne mit mehr Aufwand zu nerven, Beispiel:

Code: Alles auswählen

*-------------------------------------------------------
Function MyMsgBox(uText,cTitel,oOwner,nStyle)
   local cText,x,xMax
   DEFAULT nStyle TO XBPMB_WARNING + XBPMB_MOVEABLE
   // XBPMB_QUESTION       Fragezeichen
   // XBPMB_WARNING        Warnung        -> Standard MSGBOX()
   // XBPMB_INFORMATION    Information
   // XBPMB_CRITICAL       Kritische Situation

   // XBPMB_APPMODAL  Confirmbox ist modal in Bezug auf die Xbase++ Anwendung
   // XBPMB_SYSMODAL  Confirmbox ist systemweit modal
   // XBPMB_MOVEABLE  Confirmbox kann verschoben werden

   do case
      case valtype(uText) = "A"                     // reiner Text oder nur debugging
           cText := Var2Char(uText[1])
           xMax  := len(uText)
           for x := 2 to xMax
               cText += chr(13) + Var2Char(uText[x])
           next
      case valtype(uText) = "C"
           cText := uText
      case valtype(uText) = "N"
           cText := ntrim(uText)
      case valtype(uText) = "D"
           cText := ctod(uText)
      otherwise
           cText := "Parameterfehler bei MyMsgBox: "+valtype(uText)+;
                    " statt C, N, D oder A"+chr(13)+;
                    "Bitte diesen Fehler melden."
   endcase
   ConfirmBox(oOwner,cText,cTitel,XBPMB_OK,nStyle)
return NIL
*-------------------------------------------------------------
Function ErrBox(uText,cTitel,oOwner)
   DEFAULT cTitel TO "Fehlermeldung"
   // XBPMB_QUESTION       Fragezeichen
   // XBPMB_WARNING        Warnung
   // XBPMB_INFORMATION    Information
   // XBPMB_CRITICAL       Kritische Situation

   // XBPMB_APPMODAL  Confirmbox ist modal in Bezug auf die Xbase++ Anwendung
   // XBPMB_SYSMODAL  Confirmbox ist systemweit modal
   // XBPMB_MOVEABLE  Confirmbox kann verschoben werden
   MyMsgBox(uText,cTitel,oOwner, XBPMB_CRITICAL + XBPMB_MOVEABLE )
return NIL
*-------------------------------------------------------------
Function InfoBox(uText,cTitel,oOwner)
   DEFAULT cTitel TO "Hinweis"
   MyMsgBox(uText,cTitel,oOwner,XBPMB_INFORMATION + XBPMB_MOVEABLE )
return NIL
*-------------------------------------------------------------
FUNCTION NochNicht(uText,cTitel,oOwner)
   DEFAULT cTitel TO "Hinweis"
   DEFAULT uText  TO "Funktion ist noch nicht verfgbar"
   InfoBox(uText,cTitel,oOwner)
return NIL
*-------------------------------------------------------------
function JaNeinBox(cFrage, cTitel)        // Einfache Frage
   DEFAULT cFrage TO "Bitte w„hlen"
   DEFAULT cTitel TO "JaNeinBox()"
   if XBPMB_RET_YES = ConfirmBox( SetAppWindow(), cFrage, cTitel, XBPMB_YESNO, XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE )
      Return .t.
   endif
Return .f.
*-------------------------------------------------------------


Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Verfasst: Fr, 24. Mär 2017 11:46
von mini990
@Hubert:
...und wenn Deine MyMsgBox noch eine einstellbare Schriftgröße 7 Art hätte..... =D>

Gruß Stefan
PS: Aber die ist schon so recht gut, setzte sie ein... :-)

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Verfasst: Fr, 24. Mär 2017 14:01
von brandelh
Wie gesagt, die Schriftgröße etc. wird vom Betriebssystem geregelt (ConfirmBox).
Alles andere müsste man über ein eigenes Fenster machen, wie meine ZeigInfoBox() - Info mit Timeout ;-) :

Code: Alles auswählen

*-------------------------------------------------------
function ZeigInfo(cInfo,nSekunden,oOwner,cTitel)
   local oDlg, nEndeZeit, nBreite, nHoehe, lAnzeigen := .t., cAnzeigeZeit, cAktuelleAnzeigeZeit, nRestDauer, nAnzZeichen, nAnzZeilen, nAnzCR
   local nEvent, mp1 := NIL, mp2 := NIL, oPB, oText, oIco, oXbp := nil, drawingArea, nPosX, nPosY, nSizeX, nSizeY

   DEFAULT cTitel    TO "Hinweis"
   DEFAULT cInfo     TO "Infotext"
   DEFAULT nSekunden TO 10
   DEFAULT oOwner    TO SetAppWindow()  // oOwner blockieren

   SetAppWindow():disable()

   nEndeZeit := min( seconds()+nSekunden+1, 86399 ) // 60*60*24-1
   cAktuelleAnzeigeZeit := "#"

   nBreite := 300
   nHoehe  := 100

   // Sicher ist sicher, alles nach CR umsetzen und doppelte Zeilen verhindern
   cInfo       := strTran(cInfo,CRLF,chr(13))
   cInfo       := strTran(cInfo,chr(10),chr(13))

   nAnzCR      := CharCount(cInfo,chr(13))
   nAnzZeichen := len(cInfo) - 10 * nAnzCR  // 10 Zeichen je Zeilenschaltung entfernen
   nAnzZeilen  := nAnzZeichen / 45 + nAnzCR // grobe Schätzung reicht, Platz ist für 3 Zeilen.

   if nAnzZeilen > 3
      nHoehe += 15 * (nAnzZeilen-3)
   endif

   oDlg := XbpDialog():new( AppDesktop(), oOwner ,,,, .F.)
   oDlg:ClientSize := {nBreite,nHoehe}
   oDlg:border := XBPDLG_DLGBORDER
   oDlg:taskList := .T.
   oDlg:title    := cTitel
   oDlg:close    := {|| lAnzeigen := .f. }
   oDlg:create()

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

   oPB := XbpPushButton():new( drawingArea, , {nBreite/2-100,10},{200,nPBHoehe} , { { XBP_PP_BGCLR, XBPSYSCLR_BUTTONMIDDLE }, { XBP_PP_FGCLR, -58 } } )
   oPB:tabStop := .T.
   oPB:default := .T.
   oPB:cancel := .T.
   oPB:create()
   oPB:activate := {|| lAnzeigen := .f. }

   oIco := XbpStatic():new( drawingArea, , {10,nHoehe-46}, {36,36}, { { XBP_PP_BGCLR, -255 } } )
   oIco:caption := XBPSTATIC_SYSICON_ICONINFORMATION
   oIco:clipSiblings := .F.
   oIco:type := XBPSTATIC_TYPE_SYSICON
   oIco:create()

   nPosX  := oIco:currentPos()[1]+oIco:currentSize()[2]+10
   nPosY  :=  oPB:currentPos()[2]+oPB:currentSize()[2]+10
   nSizeX := nBreite - nPosX - 10
   nSizeY := nHoehe  - nPosY - 10
   oText := XbpStatic():new( drawingArea, , {nPosX, nPosY}, {nSizeX, nSizeY} )
   oText:caption      := cInfo
   oText:ClipParent   := .f.
   oText:ClipChildren := .t.
   oText:ClipSiblings := .f.
   oText:autosize     := .f.
   oText:type         := XBPSTATIC_TYPE_TEXT
   oText:options      := XBPSTATIC_TEXT_WORDBREAK
   oText:create()

   CenterControl(oDlg)

   oDlg:show()

   SetAppFocus(oDlg)
   nEvent := xbe_None
   DO WHILE lAnzeigen
      nEvent := AppEvent( @mp1, @mp2, @oXbp, 100 )
      if nEvent # xbe_None
         oXbp:handleEvent( nEvent, mp1, mp2 )
      endif
      nRestDauer := int(nEndeZeit-seconds())
      if nRestDauer < 1
         exit
      endif
      cAnzeigeZeit := alltrim(str(nRestDauer))
      if cAnzeigeZeit # cAktuelleAnzeigeZeit
         cAktuelleAnzeigeZeit := cAnzeigeZeit
         oPB:setCaption("Schließen oder "+cAnzeigeZeit+" Sekunden warten")
      endif
   ENDDO

   oDlg:destroy()
   SetAppWindow():enable() // Sperren will ich das per SetAppWindow() eingestellte Fenster.
   SetAppFocus(oOwner)     // Zurück zu dem Fenster, das angegeben wurde.
return nil
*-------------------------------------------------------