Seite 1 von 1

LayoutManager()

Verfasst: Sa, 06. Jun 2015 21:41
von Jan
Hat jemand da schon mal mit gearbeitet? Ich bau das gerade bei mir ein, und das klappt hervorragend. Bis auf die relativen Angaben, also z. B. XBPLAYOUT_RELWIDTH oder XBPLAYOUT_RELRIGHT. Die reagieren überhaupt garnicht. Oder muß ich dabei irgendwas besonderes beachten?

Jan

Re: LayoutManager()

Verfasst: Sa, 06. Jun 2015 22:04
von Werner_Bayern
Yep. Bei mir klappt XBPLAYOUT_RELWIDTH so:

Code: Alles auswählen

nLayout := XBPLAYOUT_TOP + XBPLAYOUT_BOTTOM
.
.
.
nLayout += XBPLAYOUT_RELWIDTH + XBPLAYOUT_LEFT
oder auch

Code: Alles auswählen

nLayout += XBPLAYOUT_RELWIDTH + XBPLAYOUT_CENTERX

Re: LayoutManager()

Verfasst: Sa, 06. Jun 2015 22:06
von Jan
Hallo Werner,

ich hab z. B.

Code: Alles auswählen

XBPLAYOUT_RELRIGHT + XBPLAYOUT_TOP + XBPLAYOUT_BOTTOM + XBPLAYOUT_LEFT
Und das wird alles sauber umgesetzt - bis auf XBPLAYOUT_RELRIGHT. Das wird einfach ignoriert.

Jan

Re: LayoutManager()

Verfasst: So, 07. Jun 2015 13:43
von Werner_Bayern
Servus Jan,

XBPLAYOUT_RELRIGHT hab ich bisher noch nicht im Gebrauch, sorry.

Re: LayoutManager()

Verfasst: Sa, 28. Nov 2015 10:10
von Jan
Ich muß da noch einmal drauf zurück kommen. Ich kämpfe gerade mit folgendem Problem:

Ich habe einen Dialog, auf dem zwei Spalten mit Groupboxen sind. Rechts am Rand ist eine Spalte mit XbpPushbutton(). Die Buttons sind 100 Pixel breit. Die Groupboxen werden in der Breite (oParent:currentSize()[1] -130) / 2 gerechnet. Also Gesamtbreite abzüglich Platz für die Buttons, und davon die Hälfte.

Ich bekomme das mit den Layout-Angaben ganz sauber hin, die Position von links oder rechts festzulegen, das wird beim Resizing auch so umgesetzt. Aber die Breite der Groupboxen ändert sich nicht mit. Ich hab das mit relright oder relwidth versucht, aber ob ich das reinschreibe oder in China ein Spaten umfällt ...

Hat jemand von Euch eine Idee?

Jan

Re: LayoutManager()

Verfasst: Sa, 28. Nov 2015 11:12
von AUGE_OHR
Jan hat geschrieben:Rechts am Rand ist eine Spalte mit XbpPushbutton(). Die Buttons sind 100 Pixel breit.
Frage : soll die rechte Group/Buttons weiterhin nur 100 Pixel breit sein ?

Re: LayoutManager()

Verfasst: Sa, 28. Nov 2015 11:14
von Jan
Jimmy,

es soll dabei bleiben, das die Groupboxen (oParent - 130) / 2 breit sind. Natürlich immer in Abhängigkeit der Breite von oParent ...

Jan

Re: LayoutManager()

Verfasst: Sa, 28. Nov 2015 11:46
von AUGE_OHR
Jan hat geschrieben:es soll dabei bleiben, das die Groupboxen (oParent - 130) / 2 breit sind. Natürlich immer in Abhängigkeit der Breite von oParent ...
also soll das Layout wie mit einem Faktor arbeiten ?!

Code: Alles auswählen

XBP_LEFTEDGE+XBP_TOPEDGE+XBP_RELWIDTH+XBP_RELHEIGHT+XBP_RELXPOS+XBP_RELYPOS
sollte es doch bringen, oder ?
p.s. ein Snapshot wäre gut ...

Re: LayoutManager()

Verfasst: Sa, 28. Nov 2015 12:17
von AUGE_OHR
habs mal ausprobiert : wenn nicht alle XbParts in der horizontalen Ebene XBP_RELWIDTH haben dann entsteht vermutlich das Problem
XBP_RELWIDTH.jpg
XBP_RELWIDTH.jpg (28.41 KiB) 13472 mal betrachtet
wo der rote Strich ist "fehlt" was in der Breite ... weil die rechte Gruppe auf 130 Pixel festgenagelt und kein XBP_RELWIDTH verwendet wurde ... aber woher soll der dann seine% Rechnung machen da er vom ursprünglichem Verhältnis / Positionen ausgeht ?

p.s. Typischer Fall für XbpSplitbar() die ja "unsichtbar" sein kann

Re: LayoutManager()

Verfasst: Sa, 28. Nov 2015 20:05
von AUGE_OHR
... und alles klar ? sonst hätte ich noch einen Lösungsvorschlag.

Re: LayoutManager()

Verfasst: Di, 05. Apr 2016 15:34
von georg
Hallo,


ich wärme das Thema mal auf. Nach dem Forentreffen in Leverkusen weiss ich, dass der LayoutManager schon in der 1.90.355 vorhanden ist, leider sind aber nur ein paar der Konstanten definiert, die XBPLAYOUT_RELRIGHT und Co. jedoch nicht.

Da ich aktuell die 2.0 nicht installiert habe, fehlt mir der Zugriff auf die Definitionen - könnte die einer von Euch posten? Danke im voraus.

Re: LayoutManager()

Verfasst: Di, 05. Apr 2016 20:01
von AUGE_OHR
georg hat geschrieben:Da ich aktuell die 2.0 nicht installiert habe, fehlt mir der Zugriff auf die Definitionen - könnte die einer von Euch posten? Danke im voraus.
es müsste doch in einer Include Datei stehen ...

Code: Alles auswählen

#IF XPPVER > 1900331 .AND. XPPVER < 2000000
   // Xbase++ 1.9 compatibility
   #pragma library( "xppui3.lib" )

   #ifndef XBP_RELXPOS
   #define XBP_RELXPOS                    0x10
   #define XBP_RELYPOS                    0x20
   #define XBP_RELWIDTH                   0x40
   #define XBP_RELHEIGHT                  0x80
   #define XBP_XCENTER                    0x1000
   #define XBP_YCENTER                    0x2000
   #endif
#endif

Re: LayoutManager()

Verfasst: Mi, 06. Apr 2016 9:22
von georg
Danke, Jimmy -


ein Durchsuchen aller alaska-seitigen .CH-Dateien ergab leider keinen Treffer, daher habe ich nachgefragt.

Ich bin jetzt ein wenig weiter, aber auch ein wenig mehr frustriert - ich versuche gerade, das PreView-Beispiel aus den Alaska-Quellen mit dem LayoutManager zu versehen, aber das klappt nicht richtig.

Für das Fenster sowie rechts platzierten Buttons funktioniert es wie erwartet, jedoch das XbpPreview()-Objekt "verschwindet", wenn man die einzelnen Elemente mit der :layoutAlign iVar versieht. Ich denke, das Problem liegt in den fest definierten Grössen in der Methode :setSize(), aber da muss ich noch mal wühlen. Aber wenn jemand von Euch das schon durch hat, würde ich gerne von fremden Erfahrungen profitieren.

Re: LayoutManager()

Verfasst: Mi, 06. Apr 2016 9:57
von brandelh
Ich hatte ein Element unten und dachte, reicht wenn ich dem sage er solle oben unten und rechts anpassen ...
aber er "unterwanderte" dann die Elemente darüber ...

Ein solches ich passe mich überall an braucht eines darüber mit Ich passe mich nur seitwärts an als Obergrenze ...
ob auch ein NONE Eintrag geht weiß ich nicht, aber KEIN Eintrag ging nicht.

PS: die Schlüsselworte hab ich noch nicht im Kopf, daher die verbale Beschreibung ;-)

Re: LayoutManager()

Verfasst: Mi, 06. Apr 2016 10:34
von AUGE_OHR
georg hat geschrieben:Für das Fenster sowie rechts platzierten Buttons funktioniert es wie erwartet, jedoch das XbpPreview()-Objekt "verschwindet", wenn man die einzelnen Elemente mit der :layoutAlign iVar versieht. Ich denke, das Problem liegt in den fest definierten Grössen in der Methode :setSize(), aber da muss ich noch mal wühlen.
Nope ... die Preview enthält ein "Top-Window" und da wirkt der Layoutmanager nicht sondern nur auf die Childs.
aber die Lösung ist "einfach"

Code: Alles auswählen

// damit man maximieren kann
   oDlg:maxButton := .T.
// einfügen in Main
   oDlg:drawingArea:resize := {| aOldSize, aNewSize, oSelf | MainResize(aOldSize, aNewSize, oSelf) }
...

PROCEDURE MainResize(aOldSize, aNewSize, oSelf)
LOCAL aChild
LOCAL i,iMax

   IF aOldSize[1] == 0 .AND. aOldSize[2] == 0               // was minimize
      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

   oSelf:lockUpdate(.T.)

   aChild := oSelf:Childlist()
   iMax  := LEN(aChild)
   FOR i := 1 TO iMax
      IF aChild[i]:isDerivedFrom( "XbpPreview" )
         // Werte sind pi * daumen ... 
         aChild[i]:setsize({(aNewSize[1]/4*3)-20,aNewSize[2]-30})
         // das erledigt den Rest
         aChild[i]:Zoom()
*     ELSEIF aChild[i]:isDerivedFrom( "XbpPushbutton" )
      ENDIF
   NEXT

   oSelf:lockUpdate(.F.)
   oSelf:invalidateRect()
RETURN

Re: LayoutManager()

Verfasst: Mi, 06. Apr 2016 11:11
von georg
Danke, Jimmy - dafür hast Du (mal wieder) ein Bier (oder vergleichbares) gut.

Es verbleibt ein Problem:

Code: Alles auswählen

	oView:layoutAlign := XBP_LEFTEDGE + XBP_TOPEDGE + XBP_RELWIDTH + XBP_RELHEIGHT + XBP_RELXPOS + XBP_RELYPOS
Damit sollte das View-Fenster sich an der relativen Höhe und Breite orientieren - was eingeschränkt funktioniert, da die Breite sich zwar ändert, die Höhe aber nicht.

Re: LayoutManager()

Verfasst: Mi, 06. Apr 2016 11:11
von Jan
Georg,

ich habe die Erfahrung machen müssen, das einzelne Elemente, die ich mit dem Layout-Manager verwalte, in Dialogen verschwinden, wenn ich z. B. auf ein anderes Prorgamm gewechselt bin und dann auf den Dialog gehe. Ich hatte das Alaska schon gemeldet, da sind wir aber noch nicht weiter.

Jan

Re: LayoutManager()

Verfasst: Mi, 06. Apr 2016 11:29
von AUGE_OHR
georg hat geschrieben:Es verbleibt ein Problem:

Code: Alles auswählen

	oView:layoutAlign := XBP_LEFTEDGE + XBP_TOPEDGE + XBP_RELWIDTH + XBP_RELHEIGHT + XBP_RELXPOS + XBP_RELYPOS
das ist doch jetzt "doppelt gemoppelt" weil du ein o:resize auf das "Top-Fenster" setzt.

das Preview Demo hat ja nur noch 4 Buttons ... da benötigt man doch keinen Layoutmanager ;)

Re: LayoutManager()

Verfasst: Do, 07. Apr 2016 14:37
von georg
Hallo, Jimmy -


der Gedanke ist ein anderer: wenn der Anwender das Fenster vergrössern will (als Brillenträger denkt man da zuerst dran), um etwas besser erkennen zu können, sollte sich eben auch das XbpPreview-Fenster entsprechend vergrössern. Dass dann die Buttons auch eine neue, relative Position brauchen, ist klar, aber Schwerpunkt war das XbpPreview-Fenster.

Eine interessante Anekdote am Rande: ich habe mir vor Jahren das Beispiel angesehen und mit einer anderen Datenbasis versehen - und dann war die Anzeige leer. Weil Alaska das Beispiel so einfach aufgebaut hatte, dass es eben nur mit der im aktuellen Select()-Bereich geöffneten Datei arbeitet. Keine Datei offen, keine Anzeige. Aber das ist mir erst bei einem erneuten Versuch dieses Jahr aufgefallen.

So nett die Beispiele sind, ein wenig allgemeiner dürften sie schon sein, denn ich will ja nicht nur einfache Listen drucken, sondern auch mal andere Dinge wie Rechnungen oder so etwas.

Re: LayoutManager()

Verfasst: Fr, 11. Sep 2020 10:20
von Manfred
Sorry,
aber ich komme mit dem Teil nicht klar. Das Ergebnis ist bei mir grottenschlecht. Was mache ich falsch?
Kann mir mal jemand eine kleine ANleitung geben, wie man vorgehen muß um ein brauchbares Ergebnis zu bekommen?
Ich habe verschiedene :layoutalign kombiniert und erhalte im schlechtesten Ergebnis, das ich auf einmal den Dialog nicht mehr geschlossen bekomme (XBPLAYOUT_RELWIDTH + XBPLAYOUT_RELHEIGHT). Das Resizing klappt auch nicht richtig usw.

Re: LayoutManager()

Verfasst: Fr, 11. Sep 2020 12:35
von Tom
Aber Du hast doch mit dem Resizing- und Scaling-Zeug aus eXpress++ eigentlich alles, was Du brauchst.

Re: LayoutManager()

Verfasst: Fr, 11. Sep 2020 12:41
von Manfred
Ja, das stimmt. Ich habe aber vor langer Zeit angefangen ein paar Dinge in xbase pur zu erstellen um zu sehen und zu lernen, wie das gemacht werden muß. Das gehört auch dazu. Wenn ich das jetzt mit den dynamischen Parts alles in express++ neu machen wollte, das wäre zu aufwändig.

Re: LayoutManager()

Verfasst: Sa, 12. Sep 2020 2:12
von AUGE_OHR
hi,

ein Problem, was auch den LayoutManager() betrifft, ist die "relative" Veränderung vom letzten Zustand zum "ist" Zustand.

Code: Alles auswählen

   o:resize := {| aOldSize, aNewSize, self | ... }
wenn man aOldSize für die "relative" Veränderung nimmt funktioniert es irgendwann nicht mehr :^o

ich nutze deshalb aOldSize NICHT sondern beziehe mich auf die Grösse des Original Layout

Re: LayoutManager()

Verfasst: Sa, 12. Sep 2020 8:02
von Jan
Manfred,

ab und an habe ich auch das Problem, das der einfach nicht das macht was ich will. Aber ansonsten klappt das immer einwandfrei.

Abstand zum Parent immer an allen viel Seiten gleich: :layoutAlign := XBPLAYOUT_LEFT + XBPLAYOUT_RIGHT + XBPLAYOUT_TOP + XBPLAYOUT_BOTTOM
Prozentuel gleicher Abstand: :layoutAlign := XBPLAYOUT_RELLEFT + XBPLAYOUT_RELTOP (soweit ich mich erinnere darf man da nicht alle vier Seiten eintragen, aber das ist zu lange her das ich das getestet hatte)

An den wenigen Stellen, wo ich das darüber nicht hinbekommen, habe mach ich das weiterhin per :resize. Ist zwar erheblich aufwändiger zu pflegen, aber klappt dann immer.

Jan