Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Anmeldungen zum Forentreffen 2018 sind auf der Anmeldeseite möglich
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

Zentrierung einer confirmBox() auf Arbeitsbildsch

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Werner
UDF-Programmierer
UDF-Programmierer
Beiträge: 73
Registriert: Sa, 18. Mär 2006 16:08

Zentrierung einer confirmBox() auf Arbeitsbildsch

Beitrag von Werner » Do, 23. Mär 2017 15:02

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

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1960
Registriert: Fr, 08. Feb 2008 21:29

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Beitrag von georg » Do, 23. Mär 2017 19:37

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.)
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12543
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Beitrag von Jan » Do, 23. Mär 2017 20:36

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
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

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

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Beitrag von brandelh » Fr, 24. Mär 2017 8:14

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.
*-------------------------------------------------------------

Gruß
Hubert

Benutzeravatar
mini990
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 354
Registriert: Sa, 28. Jan 2006 9:44
Wohnort: Berg-Richtheim bei Neumarkt i.d.Opf.

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Beitrag von mini990 » Fr, 24. Mär 2017 11:46

@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... :-)

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

Re: Zentrierung einer confirmBox() auf Arbeitsbildsch

Beitrag von brandelh » Fr, 24. Mär 2017 14:01

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
*-------------------------------------------------------
Gruß
Hubert

Antworten