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 (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 (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