Seite 1 von 1

Darstellungsproblem [erledigt]

Verfasst: Sa, 03. Nov 2018 10:11
von peternmb
Hallo,

ich lege auf die Ecke einer Groupbox einen Button um den Inhalt (in diesem Fall eine Bilddatei) mit dem dafür zugeordneten Standardprogramm zu öffnen - das funktioniert soweit wunderbar.
A.PNG
A.PNG (4.88 KiB) 6001 mal betrachtet

Nur sobald ich mein Programm in die Taskleiste verkleinere und dann wieder öffne überlagert die Groupbox meinen Button.
B.PNG
B.PNG (2.63 KiB) 6001 mal betrachtet

Ich hole den Button bei der nächsten Useraktion mit configure() wieder manuell in den Vordergrund - ist aber nicht der ideale Weg.
Gib es vielleicht eine Möglichkeit, damit das Problem gar nicht erst auftritt?

Ich verwende die 1.90.355 unter Windows-10.

Re: Darstellungsproblem

Verfasst: So, 04. Nov 2018 0:38
von AUGE_OHR
hi,
peternmb hat geschrieben: Sa, 03. Nov 2018 10:11 Gib es vielleicht eine Möglichkeit, damit das Problem gar nicht erst auftritt?
das Problem ist die Reihenfolge des o:Create().

bei einen re-paint, was bei MINIMIZED -> NORMALIZED passiert, werden in der Reihenfolge der o:Create() die XbParts gemalt. wenn also der Button nach der Groupbox erstellt wurde müsste es passen ...

Re: Darstellungsproblem

Verfasst: So, 04. Nov 2018 11:03
von peternmb
AUGE_OHR hat geschrieben: So, 04. Nov 2018 0:38 das Problem ist die Reihenfolge des o:Create().
die Buttons werden nach den Groupboxen erzeugt, bei der Erstellung passt ja auch alles (siehe Bild A).
Man sieht es sogar, dass beim repaint die Reihenfolge nicht korrekt abgearbeitet wird.

Kann ich vielleicht als Workaround den normalized-Event irgendwie in meine Eventloop einbauen und die Buttons mit configure() wieder nach vorn bringen?

Re: Darstellungsproblem

Verfasst: So, 04. Nov 2018 13:43
von georg
Hallo, Peter -


da sich die Cracks zurückhalten (ist ja Sonntag) ... Ich habe den Eindruck, dass die Xbase-Parts in der umgekehrten Reihenfolge abgearbeitet werden könnten was das Neuzeichnen angeht. Vertausch doch mal die Reihenfolge und erstelle zuerst den Button, dann die Groupbox (zeichne den Button neu) und probiere dann Minimieren/Wiederherstellen aus.

Re: Darstellungsproblem

Verfasst: So, 04. Nov 2018 14:50
von Martin Altmann
Vor allem: was ist der :parent und was der :owner von beiden!

Viele Grüße,
Martin

Re: Darstellungsproblem

Verfasst: So, 04. Nov 2018 17:36
von peternmb
georg hat geschrieben: So, 04. Nov 2018 13:43 ...Vertausch doch mal die Reihenfolge und erstelle zuerst den Button, dann die Groupbox (zeichne den Button neu) und probiere dann Minimieren/Wiederherstellen aus.
bringt leider Nichts, es ändert sich Nichts.

Die GroupBox und die Buttons haben als Parent eine TabPage, einen Owner habe ich nicht eingetragen.

Code: Alles auswählen

gBox1 := XbpStatic():new(oTab1,,{10,40},{465,590})
gBox1:type   := XBPSTATIC_TYPE_GROUPBOX
die TabPage hat als Parent oDlg:drawingArea und ebenfalls keinen Owner

Code: Alles auswählen

oTab1 := XbpTabPage():new( oDlg:drawingArea,,{1,3F},{765,667})

Re: Darstellungsproblem

Verfasst: Mo, 05. Nov 2018 0:09
von AUGE_OHR
peternmb hat geschrieben: So, 04. Nov 2018 11:03 Kann ich vielleicht als Workaround den normalized-Event irgendwie in meine Eventloop einbauen und die Buttons mit configure() wieder nach vorn bringen?
dafür gibt es den o:resize Callback Slot

Code: Alles auswählen

   oDlg:drawingArea:resize := {|aOld,aNew,oSelf| MainResize(aOld,aNew,oSelf) }

PROCEDURE MainResize(aOldSize,aNewSize,oSelf)
   IF aOldSize[1] == 0 .AND. aOldSize[2] == 0               // was minimize
      // hier wäre der Zustand
      aOldSize := aNewSize                                  // New Size
   ELSEIF aNewSize[1] == 0 .OR. aNewSize[2] == 0            // is now minimized
      RETURN
   ELSEIF aNewSize[1] == aOldSize[1] .AND. aNewSize[2] == aOldSize[2]
      RETURN
   ENDIF                                                    // same Size
   // hier geht es dann los
   oSelf:lockUpdate(.T.)
   aChild := oSelf:Childlist()
   iMax   := LEN(aChild )
   FOR i := 1 TO iMax
      DO CASE
         CASE aChild[i]:isDerivedFrom("XbpStatic")
            aChild[i]:setSize( aNewSize )      // geht hier über die gesamte o:DrawingArea
            aSubChild := aChild[i]:Childlist()
            jMax := LEN(aSubChild)
            FOR j := 1 TO jMax
                  // hier die SubItems
            NEXT
      ENDCASE
   NEXT
   oSelf:lockUpdate(.F.)
   oSelf:invalidateRect()
RETURN
wie du siehst würde man üblicherweise nichts weiter machen ausser die Pos/Size zu setzten.

wenn der Button nach der Groupbox angelegt wurde muss er in der Childlist() auch dahinter sei d.h. er wird später bearbeitet -> "übermalt" die Groupbox

Re: Darstellungsproblem

Verfasst: Mo, 05. Nov 2018 11:58
von peternmb
AUGE_OHR hat geschrieben: Mo, 05. Nov 2018 0:09 dafür gibt es den o:resize Callback Slot

Code: Alles auswählen

   oDlg:drawingArea:resize := {|aOld,aNew,oSelf| MainResize(aOld,aNew,oSelf) }
Ja, damit funktioniert es prima, ich habe deine Funktion dafür für meine Zwecke angepasst
Da es sich nur um 4 Buttons handelt bringe ich die nach dem maximize mit configure() wieder nach vorne.

Code: Alles auswählen

oDlg:drawingArea:resize := {|aOld,aNew,oSelf| ButtonShow(aOld,aNew,oSelf) }

PROCEDURE ButtonShow(oDlgOldSize,oDlgNewSize)
   IF oDlgOldSize[1] == 0 .AND. oDlgOldSize[2] == 0   //  oDlg ist wieder maximized
	pbFav1:configure()
	pbFav2:configure()
	pbedB:configure()
	pbedT:configure()
   ENDIF   
RETURN