Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize (https://www.delphipraxis.net/212302-dynamische-multipanel-anordnung-seitenverhaeltnis-bei-resize.html)

taveuni 23. Jan 2023 07:24

Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo zusammen,
Leider geht nicht alles in den Titel. Folgende Anforderung: Für einen Videoplayer müssen verschiedene Layouts dynamisch umgeschaltet werden können. Der Gesamtmonitor kann bis zu 32 Player enthalten. Wenn die Applikation in der Grösse verändert wird muss das Seitenverhältnis beibehalten werden. Das Seitenverhältnis kann ebenfalls umgestellt werden (16:9, 4:3 oder anderes). Zur Veranschaulichung habe ich die 3 Screenshots einer solchen Applikation angehängt.
Ich habe schon mit einem TGridPanel rumgespielt. Aber ich sehe auf die schnelle keinen Vorteil zu einer Variante wo alles von Hand gemacht wird. Hat vielleicht schon mal jemand so etwas realisiert?

Uwe Raabe 23. Jan 2023 08:25

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Zitat:

Zitat von taveuni (Beitrag 1517720)
Ich habe schon mit einem TGridPanel rumgespielt. Aber ich sehe auf die schnelle keinen Vorteil zu einer Variante wo alles von Hand gemacht wird.

Dann zeig doch mal, wie du das damit machst.

taveuni 23. Jan 2023 09:26

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Hallo Uwe,
Ich habe: noch nichts :wink:

Eine Idee ist:
- platziere ein Panel setze es align alclient. Dieses repräsentiert das Gesamt Display.
- platziere ein GridPanel auf dieses mit align none.
- erzeuge die maximal mögliche Anzahl an Playern und speichere diese in einer Objectliste.
- bei jedem Layoutwechsel müssen die Rows und Cols des Gridpanels entfernt oder/und neue erzeugt werden (vorher vermutlich die Player entfernt werden).
- bei jedem Layoutwechsel müssen die Playerobjekte neu den Control Collections zugeordnet werden.
- bei jedem Resize muss das Gridpanel left, top, height, width in Bezug auf die Displaygrösse und dem Seitenverhältnis gesetzt werden.
- bei jedem Resize müssen die Column- und RowItem Values bei Style ssAbsolute gesetzt werden.

Ist dies so - bevorzuge ich es die Player als einzelne Komponenten auf dem übergeordneten Panel (Display) zu platzieren. Denn dann muss ich nicht jedes Mal Rows und Cols erzeugen oder löschen und Objekte hinzufügen oder löschen. Ausserdem könnte ich mir vorstellen dass Events (mouse move, drag drop usw.) einfacher zu verarbeiten sind. Aber vielleicht irre ich mich und das Gridpanel hat schon einige Features "onboard"? Deshalb war die Frage ob schon mal jemand so etwas mit einem Gridpanel gelöst hat.

Danke und Gruss
Werner

Uwe Raabe 23. Jan 2023 11:34

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Zitat:

Zitat von taveuni (Beitrag 1517720)
Folgende Anforderung: Für einen Videoplayer müssen verschiedene Layouts dynamisch umgeschaltet werden können. Der Gesamtmonitor kann bis zu 32 Player enthalten. Wenn die Applikation in der Grösse verändert wird muss das Seitenverhältnis beibehalten werden.

Wie soll denn mit der Aufteilung in Zeilen und Spalten bei Größenänderung umgegangen werden? Sollen die fix bleiben oder sich dynamisch anpassen?

taveuni 23. Jan 2023 12:10

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Uwe Raabe (Beitrag 1517731)
Zitat:

Zitat von taveuni (Beitrag 1517720)
Folgende Anforderung: Für einen Videoplayer müssen verschiedene Layouts dynamisch umgeschaltet werden können. Der Gesamtmonitor kann bis zu 32 Player enthalten. Wenn die Applikation in der Grösse verändert wird muss das Seitenverhältnis beibehalten werden.

Wie soll denn mit der Aufteilung in Zeilen und Spalten bei Größenänderung umgegangen werden? Sollen die fix bleiben oder sich dynamisch anpassen?

Die Aufteilung (4-er, 9-er, 16-er, 3-er breit, 3-er hoch usw.) bleibt bei der Grössenänderung gleich. Es müssen "nur" die Grössen und die Positionen der Player proportional verändert werden. Und das ganze in der Mitte des Displays. Siehe dazu noch mal ein Beispiel im Anhang. Da ist nur die Grösse der Gesamtapplikation (=Display) geändert worden.

Uwe Raabe 23. Jan 2023 12:23

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Versuch es doch mal mit dem Aufruf von ResizePlayerGrid im FormCreate, dem Resize-Event des Grids und bei Änderung des Seitenverhältnisses (hier beispielhaft für 4:3 und 16:9):
Delphi-Quellcode:
procedure ResizeControlWithAspectRatio(AControl: TControl; RatioWidth, RatioHeight: Integer);
var
  actWidth: Integer;
  actHeight: Integer;
  calcHeight: Integer;
  calcWidth: Integer;
  margin: Integer;
  margin1: Integer;
  margin2: Integer;
begin
  actWidth := AControl.Margins.ControlWidth;
  actHeight := AControl.Margins.ControlHeight;
  calcHeight := MulDiv(actWidth, RatioHeight, RatioWidth);
  calcWidth := MulDiv(actHeight, RatioWidth, RatioHeight);
  if calcHeight < actHeight then
  begin
    margin := actHeight - calcHeight;
    margin1 := margin div 2;
    margin2 := margin - margin1;
    AControl.Margins.SetBounds(0, margin1, 0, margin2);
  end
  else
  begin
    margin := actWidth - calcWidth;
    margin1 := margin div 2;
    margin2 := margin - margin1;
    AControl.Margins.SetBounds(margin1, 0, margin2, 0);
  end;
end;

procedure ResizePlayerGrid(AGrid: TGridPanel; AWideScreen: Boolean);
var
  ratioHeight: Integer;
  ratioWidth: Integer;
begin
  ratioWidth := 4*AGrid.ColumnCollection.Count;
  ratioHeight := 3*AGrid.RowCollection.Count;
  if AWideScreen then begin
    ratioWidth := 4*ratioWidth;
    ratioHeight := 3*ratioHeight;
  end;
  ResizeControlWithAspectRatio(AGrid, ratioWidth, ratioHeight);
end;
Update: Ach ja: AlignWithMargins muss bei dem Grid aktiv sein.

stahli 23. Jan 2023 13:15

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Ich werfe Dir hier mal einfach meine 3 Komponenten für Control-Anordnungen rein.
Vielleicht kann Dir das Eine oder Andere als Anregung dienen (falls Dir Uwes Tipp nicht reicht)...

https://www.delphipraxis.net/117765-...llboxflow.html
https://www.delphipraxis.net/176186-...omponente.html
https://www.delphipraxis.net/204696-alignmentpanel.html

taveuni 23. Jan 2023 13:21

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Uwe Raabe (Beitrag 1517737)
Versuch es doch mal mit dem Aufruf von ResizePlayerGrid im FormCreate, dem Resize-Event des Grids und bei Änderung des Seitenverhältnisses (hier beispielhaft für 4:3 und 16:9):

Update: Ach ja: AlignWithMargins muss bei dem Grid aktiv sein.

Hallo Uwe,
besten Dank für Deine Hilfe. Mit Deinem Vorschlag wird schon mal das Grid Proportional vergrössert und verkleinert. Aber noch nicht unter der Berücksichtigung der maximalen Grösse (siehe im Anhang rot eingezeichnet) und nicht zentriert. Vermutlich werde ich das noch hinbekommen.

Was aber muss ich mit den Row- und ColItems machen? Einfach auf sspercent setzen? Oder auf ssAuto? Damit die mitziehen? Oder muss ich die Werte manuell setzen (insbesondere wenn das Layout ändert)?
Danke für Deine Hilfe.
Gruss Werner

taveuni 23. Jan 2023 13:29

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Zitat:

Zitat von stahli (Beitrag 1517743)
Ich werfe Dir hier mal einfach meine 3 Komponenten für Control-Anordnungen rein.
Vielleicht kann Dir das Eine oder Andere als Anregung dienen (falls Dir Uwes Tipp nicht reicht)...

https://www.delphipraxis.net/117765-...llboxflow.html
https://www.delphipraxis.net/176186-...omponente.html
https://www.delphipraxis.net/204696-alignmentpanel.html

Hallo Stahli,
ich habe mir Deine Sammlung bereits angeschaut. Das sind aber andere (beeindruckende) Ansätze. Meine Anforderung ist tatsächlich eine proportionale Grössenänderung in einer übergeordneten Anzeige welche wiederum dynamisch unterschiedliche Seitenverhältnisse haben kann. Und dass Ganze mit dynamischer Layoutanpassung (sowohl von der Anzahl, der Anordnung und des Seitenverhältnisses). Eigentlich eine triviale Sache - dachte ich vorher.

Uwe Raabe 23. Jan 2023 14:31

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von taveuni (Beitrag 1517744)
Was aber muss ich mit den Row- und ColItems machen? Einfach auf sspercent setzen? Oder auf ssAuto? Damit die mitziehen? Oder muss ich die Werte manuell setzen (insbesondere wenn das Layout ändert)?

Ich habe die hier auf ssPercent gesetzt, alle Rows bzw. Colums in der Strukturansicht selektiert und den Value auf 0 stellen. Dann werden die Prozente gleichmäßig aufgeteilt. Programmtechnisch gibt es dafür die Methode EquallySplitPercentuals in den entsprechenden Collections. Die einzelnen Player-Controls müssen dann Align = alClient gesetzt werden.

ssAuto bedeutet, dass sich die Zelle an die Größe des Controls anpasst. Das passt natürlich nicht zu dem Align.

Ich habe mal ein Beispiel angehängt mit dem du ja weiter probieren kannst. Als Platzhalter für die Player verwende ich TMemo.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz