AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

Ein Thema von taveuni · begonnen am 23. Jan 2023 · letzter Beitrag vom 23. Jan 2023
Antwort Antwort
Seite 1 von 2  1 2      
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#1

Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 07:24
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?
Miniaturansicht angehängter Grafiken
fit.jpg   hoch.jpg   breit.jpg  
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#2

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 08:25
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 09:26
Hallo Uwe,
Ich habe: noch nichts

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
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#4

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 11:34
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?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 12:10
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.
Miniaturansicht angehängter Grafiken
9-er-klein.jpg   9-er-gross.jpg  
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#6

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 12:23
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe (23. Jan 2023 um 12:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 13:15
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
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli (23. Jan 2023 um 13:23 Uhr)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 13:21
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
Miniaturansicht angehängter Grafiken
grid.jpg  
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
526 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 13:29
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.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.014 Beiträge
 
Delphi 12 Athens
 
#10

AW: Dynamische Multipanel Anordnung - Seitenverhältnis bei Resize

  Alt 23. Jan 2023, 14:31
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.
Angehängte Dateien
Dateityp: zip GridPanel.zip (2,4 KB, 7x aufgerufen)
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:16 Uhr.
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