Delphi-PRAXiS

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/)
-   -   Problem mit GridPanel (https://www.delphipraxis.net/176908-problem-mit-gridpanel.html)

Gutelo 3. Okt 2013 11:40

Problem mit GridPanel
 
Hallo,

Ich hab auch noch ein Problem mit GridPanel. Ich will zur Laufzeit Checkboxes in ein 5x5 GridPanel erzeugen (Nur das Rechte obere "Dreieck" des Grids wird gefuellt). Dazu definiere ich mir erstmal ein Array of TCheckbox. Dann erstelle ich Instanzen von TCheckBox mit Parent=GridPanel. Zum Problem kommt es bei Row und Column. Es werden alle Checkboxes an die richtige Stelle plaziert ausser diejenigen in der zweiten Zeile. In der zweiten Zeile sind die Checkboxes aus mir unerklaerlichen Gruenden alle eine Position nach links versetzt. Weiterhin musste ich mir kompliziert die Checkboxes ueber Items[i] besorgen um die "column" und "row" properties zu setzen. Eine direkte Uebergabe mit AddControl hat keinerlei Einfluss auf beide properties und wird schlichtweg ignoriert.

Code:
Procedure AddRadioItems(TG : TGridPanel);
var RB : Array[2..6,2..6] of TCheckBox;
    i,j: Integer;
begin
   TG.ControlCollection.BeginUpdate;
   for i := 2 to 6 do
    for j := i to 6 do
    begin
      RB[i,j] := TCheckbox.Create(TG);
      RB[i,j].Parent := TG;
      RB[i,j].caption := inttostr(i) + ' if ' + inttostr(j);
      RB[i,j].name := 'RB' + inttostr(i) + 'if' + inttostr(j);
      RB[i,j].enabled := false;
      //TG.ControlCollection.AddControl(RB[i,j],j-2,i-2);
      TG.ControlCollection.Items[TG.ControlCollection.Count-1].Column := j-2;
      TG.ControlCollection.Items[TG.ControlCollection.Count-1].Row := i-2;
    end;
   TG.ControlCollection.EndUpdate;
end;
Delphi kann einen in den Wahnsinn treiben :)

Schoene Gruesse

Gutelo

Nachtrag: Kann es sein, dass man das Grid nicht partiell fuellen kann und row + column nur Sinn machen wenn jede Zelle eine Komponente zugewiesen bekommt?

Gutelo 3. Okt 2013 12:05

AW: Problem mit GridPanel
 
Mein Nachtrag scheint in die richtige Richtung zu gehen, denn das folgende funktioniert tadellos:

Code:
Procedure AddRadioItems(TG : TGridPanel);
var RB : Array[2..6,2..6] of TCheckBox;
    i,j: Integer;
begin
   TG.ControlCollection.BeginUpdate;
   for i := 2 to 6 do
    for j := 2 to 6 do
    begin
      RB[i,j] := TCheckbox.Create(TG);
      RB[i,j].Parent := TG;
      RB[i,j].caption := inttostr(i) + ' if ' + inttostr(j);
      RB[i,j].name := 'RB' + inttostr(i) + 'if' + inttostr(j);
      RB[i,j].enabled := false;
      if j>=i then RB[i,j].visible := true else RB[i,j].visible := false;
      TG.ControlCollection.Items[TG.ControlCollection.Count-1].Column := j-2;
      TG.ControlCollection.Items[TG.ControlCollection.Count-1].Row := i-2;
    end;
   TG.ControlCollection.EndUpdate;
end;
Dann geht auf einmal auch das direkte Setzen von row und column via AddControl

himitsu 3. Okt 2013 12:18

AW: Problem mit GridPanel
 
Da das GridPanel die Komponenten selber ausrichtet, wirst du immer Probleme bekommen, wenn man da versucht selber was einzuordnen.
Vorallem dann, wenn die Position wo was einsortiert wird, mit denen von dir kollidiert.

Füge mal diesen Code ans Ende deiner inneren Schleife. (hinter die derstellte CheckBox)

Delphi-Quellcode:
Application.ProcessMessages;
Sleep(1000);
Und schau dir an, was da passiert.
Genau auf die Position der neuen und "alten" CheckBox achten.

So, und nun dreh mal die Erstellungsreihenfolge um, so daß keine Kollitionen mehr entstehen.

Delphi-Quellcode:
for i := 6 downto 2 do
  for j := 6 downto i do
Wenn du später nicht via FindComponent auf die Komponenten zugreifen willst/mußt, dann kannst du den .Name auch leer lassen.

PS: Der [delphi]-Code macht sich bestimmt besser.

himitsu 3. Okt 2013 12:27

AW: Problem mit GridPanel
 
Erst AddControl und dann der Parent geht scheinbar auch.
Delphi-Quellcode:
for i := 2 to 6 do
  for j := i to 6 do
  begin
    RB[i,j] := TCheckbox.Create(TG);
    RB[i,j].caption := inttostr(i) + ' if ' + inttostr(j);
    RB[i,j].enabled := false;
    TG.ControlCollection.AddControl(RB[i,j], j-2, i-2);
    RB[i,j].Parent := TG;
  end;

Gutelo 3. Okt 2013 12:33

AW: Problem mit GridPanel
 
Hallo Himitsu,

ja per "slow motion" hatte ich inzwischen auch gesehen dass er beim Fuellen der 3. Zeile die Elemente in der zweiten Zeile nach links verschiebt. Allerdings macht er das bei den weiteren Zeilen nichtmehr.

Dass Gridpanel die Objekte selber sortiert ist meines Erachtens eine hirnlose Funktion, vorallem wenn man dem User explizit die Moeglichkeit gibt die properties row und column zu setzen. Kontrolle der Platzierung sollte meines Erachtens beim User liegen und nicht beim Grid.

Vielen Dank fuer deine Hilfe,

Gutelo

PS: Das war erstmal eine Proof-of-Principle Schnellimplementierung :)


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