Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 09:47

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Okt 17, 2016 17:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich bastel aktuell meine UI und dabei hab ich mich gefragt, wie VCL/LCL mit dem neu layouten von Komponenten umgeht, wenn sich eine in ihrer Größe ändert.

Bisher hab ich meine Komponenten alle direkt an mein Fenster gehangen und dieses hat den Komponenten über eine Resize Methode den Kindern bescheit gesagt, dass sich das Fenster nun Ändern wird und nachdem alle durch sind wird die neue Größe übernommen.
Code:
  1. void Resize(const Size2D<>& NewSize);

So können die Kinder noch über Parent die aktuelle größe abfragen und mit NewSize die nun kommende Größe bekommen.
Ich hatte überlegt dies nun Recursive zu machen, also wenn sich eine Komponente auch anpasst, dann ruft diese noch die Resize Methode von den Kindern auf.

libRocket z.B. hat ein recht komplexen layouting Prozess, wo Resize/Reposition und das neu layouten in getrennten Schritten ablaufen.
Dort bleibt die Kontrolle beim Layouter und der vergrößert und verschiebt solange die Elemente bis alle Komponenten keine korrekturen mehr brauchen und dann wird der Rendering Code ausgeführt.
Dort liegt es wohl daran, dass durch HTML und CSS man recht komplexe Regeln für die Größe und Position basteln kann und entsprechend ein Resize viele male durchlaufen würde.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Okt 18, 2016 10:13 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Die LCL ist ja freie Software, da kannste einfach reinschauen :-). Wobei ich nicht weiß, wie sehr das vom Backend abhängt – die LCL kann ja gtk oder Qt oder wxwidgets(?) verwenden.

Ich finde allerdings das Layouting der LCL und VCL gegenüber dem von Qt oder Gtk mit dem Grid-/QLayout-basierten weniger schön. Der Qt/Gtk-Ansatz (die sind da recht ähnlich) hat den Vorteil, dass man relativ einfache Regeln hat und damit ziemlich mächtige Layouts, die gleichzeitig noch Informationen für Accessibility liefern (das Form Layout z.B.), bauen kann. Im Prinzip ist das vereinfachtes CSS3 Box Layouting, was aber in der Praxis vollkommen ausreicht.

So wie ich das bisher gesehen habe, ist das ein zweistufiger Prozess: Widgets geben ihre min/max/preferred Size an und haben eine Policy die angibt, wie diese Informationen verwendet werden sollen. Dann versucht das Layout die Widgets irgendwie unterzubringen. Mit Dingen wie Labels mit Word Wrap wird das ganze natürlich kompliziert, weil da die Height von der Width abhängt und so. In Qt kann man sowas in der Size Policy ansagen. Interne Details kenne ich da nicht, aber ich würd empfehlen einfach mal in die Doku und ggfs. in den Source (der Qt Source ist recht lesbar, wenn man erstmal diese merkwüdige PIMPL-Struktur durchblickt hat) reinzuklicken.

viele Grüße,
Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Okt 18, 2016 13:57 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hatte schon in den Code von LCL geguckt und die Teile für Events und Layouting ned gefunden.

VCL/LCL vs QT(QWidget und QML)/GTK bin ich genau der anderen Ansicht. Man kann mit beiden Layoutsystemen alles machen aber ich finde es geht wesentlich schneller mit VCL als z.B. mit QML.
Ich hab die Erfahrung gemacht dass man bei QML so 50% des Layouting sehr schnell hin bekommt und für den Rest dann ewig knobeln muss, bzw. der Teil noch nicht implementiert ist und man dann was selber schreiben muss. Das ganze System steckt allerdings noch in den Kinderschuhen.
GTK, QWidget hab ich eher das Gefühl das es ne 90% easy und 10% Aufwändig Ratio hat und WPF 95% einfach und 5% nahe Nervenzusammenbruch.
Boxlayout hab ich bisher nur kompliziert erlebt und VCL mit einem absolute Positionen System find ich viel verständlicher.
Bei WPF kann man auch diese Systeme mischen und bei GTK hab ich das auch schon gesehen.

Ich baue aktuell ein UI für mein Framework und ich hab in vergangenen Projekten die Erfahrung gemacht, dass UI Designer immer ein absolute Position System genutzt haben.
Bei Scaleform, EazyGUI(ein Unity Engine middleware) und dem custom UI system von der Engine, die wir Inhouse hatten, war es immer das gleiche.
Man hat diverse Elemente designed und die waren absolut, hatten auch selten Eltern/Kind Verhältnis und werden mit Z oder Layer fest gelegt.
Diese Elemente hat man dann mit einem Anker relative im Screen gesetzt und auch relative skaliert.
Man kann dann noch die Position vom Element absolut setzen oder relative verschieben.
Das war super schnell und sehr straight forward.
Man braucht dann aber Scripting um sowas wie ein Vertical Splitter oder Grid Layout zu machen.
Ich hatte dann libRocket in der Engine angebunden und fand es anfangs auch sehr toll, weil man halt html und css zur verfügung hat aber in der Produktion kamen weder die Designer mit HTML und CSS klar noch unsere Programmierer und in einigen Fällen hab auch ich echt knobeln müssen wie wir bestimmte sachen hin bekommen.
Wir sind dann auf Scaleform umgestiegen ^^
Man muss aber sagen libRocket kann den Box Style nur zum bruchteil und der ist dann doch nochmal ne andere Liga aber das ganze layouting ist extrem lahm.

Aktuell hab ich eine Eltern/Kind Beziehung drin und der rekursive Update Prozess ist noch ziemlich Performance/Fehleranfällig aber benötigt weniger Prüfungen für Mouse Events, da ich sehr schnell viele Komponenten ausschliessen kann, ohne alle zu prüfen.
Ich mache kein Layouting, die Komponenten bekommen von den Eltern Resize, Reposition und MausEvents und darauf entscheiden die wie groß und wo sie sich platzieren(default Position(0,0) und Size(Parent.Width, Parent.Height)).

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Okt 18, 2016 14:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hab mal ein bisschen tiefer in das Layouting und Policies von QWidget geguckt und werde eine Änderung bei mir machen.
QWidgets haben ein QLayout Pointer, der ist default nullptr und die Komponente macht ihr übliches ding.
Wenn es gesetzt wird, dann nimmt es die Größe und Position von der QLayouter instance.
Das werde ich übernehmen, da ich so den Code von meinen Komponenten vereinfachen kann.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 21, 2017 21:03 
Offline
DGL Member

Registriert: Di Aug 23, 2005 09:15
Beiträge: 31
Programmiersprache: FPC/Delphi XE3
Ich glaube VCL/LCL hat das gleiche Prinzip wie Latex, es wird glaub ich "tiling" genannt.

Wenn man ein Dimension bestimmen muss, darf es nur ein Variabele geben. (ein sogenannte Rubber Length). Aber man kann sie nesten (mit zb TPanel).

Der Bezeichner in Delphi für Rubber length ist alignment=alclient und geltet immer in beide Direktionen (X und Y).

Also man nehmt das Schirm und auf die obene Ebene ist das zb

  • 6 Komponente in die Breite
  • es darf nur eine alclient sein.
  • alclient Breite ist Formbreite-summe(andere 5 komponente)

Wenn dann eine Alclient Komponent intern auch wieder alclient Komponente hat recursiert man darein mit die gefundene Breite. Alles nur lineare Gleichungen, einfach.

Das hat aber das Problem das ein geneste Komponent das Globale Dimensionierung nicht beeinflussen kann, das legt schon fest.

Also, Programmierer denke oft das sie es besser machen können, und assignen OnResize die dieses System übergehen kann. Aber das tun sie selten Konsistent, was das Risiko auf die gefürchteten "WMSIZE loop detected" steigert.

Vielleicht sieht VCL/LCL nur besser aus weil die meiste Layoutung ohnen 3rd party Layouting (lese: Konsistent) abgewickelt wird. Wie weniger Onresize, desto besser die Chance das es funktioniert ohne schleife weil das Basisprizip Schleifelos ist.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 31 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.035s | 17 Queries | GZIP : On ]