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/)
-   -   Flowpanel geeignetes Control ? (https://www.delphipraxis.net/195036-flowpanel-geeignetes-control.html)

v2afrank 29. Jan 2018 05:59

Flowpanel geeignetes Control ?
 
Hallo zusammen,
in meinem Programm hat der User die Möglichkeit bis zu sechs Gruppen auszuwählen die anschließend angezeigt werden. Dabei soll die einzelne Gruppe möglichst groß angezeigt werden. Bei 6 Gruppen sollte es z.B. so aussehen:
1 | 2 | 3
4 | 5 | 6

wenn nur vier Gruppen angezeigt werden sollen so
1 | 2
3 | 4

usw.
Könnte man so etwas mit eine Grid/Flowpanel hinbekommen oder muss ich das Layout selber berechnen ? Hat vielleicht jemand noch eine andere Idee ?

CarlAshnikov 29. Jan 2018 06:37

AW: Flowpanel geeignetes Control ?
 
Ich denke mit einem Gridpanel sollte das klappen. Einfach die Zeilen und Spalten entsprechend anlegen. Das Hinzufügen sollte in der Reihenfolge sein wie du es haben möchtest. Wichtig ist, wenn alle Zeilen und Spalten gleich groß sein sollen, dass diese gleichzeitg auf die Größe gesetzt werden mit beginUpdate und endUpdate.

Der schöne Günther 29. Jan 2018 07:58

AW: Flowpanel geeignetes Control ?
 
Das FlowPanel kennst du ja schon. Da dir das "bis die Zeile/Spalte voll ist, dann Umbruch" anscheinend nicht reicht und du eine genaue Vorstellung hast wie es sein soll musst du wohl selbst ran.

Wenn ich das System richtig verstanden habe dann ist es bei
Delphi-Quellcode:
n
Einträgen in X und Y-Richtung
Delphi-Quellcode:
√n
Zellen mit der Präferenz in X-Richtung eine Zelle mehr zu haben. Richtig?

v2afrank 29. Jan 2018 08:28

AW: Flowpanel geeignetes Control ?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1392348)
Das FlowPanel kennst du ja schon.

Ich kenne es vom Namen her. Genutzt habe ich es noch nicht :oops:

Was Du mit Deiner Wurzel meinst verstehe ich wiederum nicht.
Im Prinzip soll es vier Möglichkeiten geben. Hätte ich sofort alle schreiben sollen
1 | 2 | 3
4 | 5 | 6

1 | 2
3 | 4

1 | 2

1

Ich hoffe jetzt ist es klar. Hätte ich wirklich sofort schreiben können. Entschuldigung

CarlAshnikov 29. Jan 2018 09:37

AW: Flowpanel geeignetes Control ?
 
Ich habe mal was gebastelt wie ich es lösen würde. Voraussetzung sind ein Gridpanel und zwei Spinedits zum einstellen der Zeilen und Spalten dann kannst du probieren ob das das ist was du brauchst:

Delphi-Quellcode:
type
  TForm2 = class(TForm)
    gpTest: TGridPanel;
    bTest: TButton;
    seRows: TSpinEdit;
    seCols: TSpinEdit;
    procedure bTestClick(Sender: TObject);

  private
    procedure AddControlsToGridPanel(AGridPanel: TGridPanel; ARows, ACols: integer;
      AControls: TArray<TControl>);

  public
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.AddControlsToGridPanel(AGridPanel: TGridPanel; ARows, ACols: integer;
  AControls: TArray<TControl>);
var
  i: integer;
begin
  Assert(ARows * ACols = Length(AControls));
  AGridPanel.ControlCollection.Clear;
  with AGridPanel do
  begin
    ColumnCollection.BeginUpdate;
    if ColumnCollection.Count <> ACols then
    begin
      ColumnCollection.Clear;
      for i := 0 to ACols - 1 do
      begin
        ColumnCollection.Add;
        ColumnCollection.Items[i].Value := 50;
      end;
    end;
    ColumnCollection.EndUpdate;

    RowCollection.BeginUpdate;
    if RowCollection.Count <> ARows then
    begin
      RowCollection.Clear;
      for i := 0 to ARows - 1 do
      begin
        RowCollection.Add;
        RowCollection.Items[i].Value := 50;
      end;
    end;
    RowCollection.EndUpdate;
  end;

  for i := Low(AControls) to High(AControls) do
  begin
    AControls[i].Parent := AGridPanel;
    AControls[i].Align := alClient;
  end;
end;

procedure TForm2.bTestClick(Sender: TObject);
var
  vControls: TArray<TControl>;
  vB:       TButton;
  i:        integer;
begin
  Setlength(vControls, seRows.Value * seCols.Value);
  for i := 0 to seRows.Value * seCols.Value - 1 do
  begin
    vB := TButton.Create(gpTest);
    vB.Caption := i.tostring();
    vControls[i] := vB;
  end;
  AddControlsToGridPanel(gpTest, seCols.Value, seRows.Value, vControls);
end;

v2afrank 29. Jan 2018 09:43

AW: Flowpanel geeignetes Control ?
 
Perfekt. Das ist es. Genauso wollte ich es haben. Danke vielmals

Der schöne Günther 29. Jan 2018 10:40

AW: Flowpanel geeignetes Control ?
 
BeginUpdate()/EndUpdate() ohne try..finally ist aber auch mutig.

CarlAshnikov 29. Jan 2018 10:51

AW: Flowpanel geeignetes Control ?
 
Das ist richtig, ich schrieb aber auch gebastelt :-D

Hier die verbesserte Variante:
Delphi-Quellcode:
procedure TForm2.AddControlsToGridPanel(AGridPanel: TGridPanel; ARows, ACols: integer;
  AControls: TArray<TControl>);
var
  i: integer;
begin
  Assert(ARows * ACols = Length(AControls));
  AGridPanel.ControlCollection.Clear;
  with AGridPanel do
  begin
    ColumnCollection.BeginUpdate;
    try
      if ColumnCollection.Count <> ACols then
      begin
        ColumnCollection.Clear;
        for i := 0 to ACols - 1 do
          ColumnCollection.Add.Value := 50;
      end;
    finally
      ColumnCollection.EndUpdate;
    end;

    RowCollection.BeginUpdate;
    try
      if RowCollection.Count <> ARows then
      begin
        RowCollection.Clear;
        for i := 0 to ARows - 1 do
          RowCollection.Add.Value := 50;
      end;
    finally
      RowCollection.EndUpdate;
    end;
  end;

  for i := Low(AControls) to High(AControls) do
  begin
    AControls[i].Parent := AGridPanel;
    AControls[i].Align := alClient;
  end;
end;

BergLoewe 18. Mär 2024 10:07

AW: Flowpanel geeignetes Control ?
 
Hallo,

ich will auch gerade ein FlowPanel einsetzen und darin LabeledEdits platzieren. Nun ordnet das FlowPanel die einzelnen Elemente ja automatisch an. Soll es auch. Aber es zieht die für meine Begriffe zu eng aneinander. Ich finde aber keine Eigenschaft, wo ich einstellen kann, dass zwischen den eizelnen LabelEdits gößere Zwischenräume bleiben.

Kann da jemand helfen?

himitsu 18. Mär 2024 10:54

AW: Flowpanel geeignetes Control ?
 
Das Padding beim FlowPanel bezieht sich leider nur auf den gesamten Client-Bereich und nicht auf die Ausrichtung der einzelnen SubControls, also nur außenrum der Rand nach innen.
Für die Zwischenräume fehlt dem Panel leider eine Eigenschafft.

Also mußt du die Margins der einzlnen Edits setzen.
ABER dort nicht vergessen zusätzlich AlignWithMargins auf True zu setzen.
Ich weiß, es ist totaler Schwachsinn, dass standardmäßig Margins gesetzt sind, diese aber ignoriert werden, außer es wird ein weit entferntes anderes Property gesetzt, an statt es wie beim Padding einfach standardmäßig auf 0 steht.

Alle Edits markieren (mit Shift+Klick, im Designer oder der Struktur) und dann AlignWithMargins=True und bei den Margins dann den Abstand.
* entweder bei jedem Edit die Hälfte
* oder jeweils neu eine Seite (z.B. Top und Left) und zusätzlich eventuell dann noch die andere Seite (z.B. Bottom und Right) über das Padding im Panel.

Padding = Abstand nach innen
Margins = Abstand nach außen


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 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