![]() |
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:
Delphi kann einen in den Wahnsinn treiben :)
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; 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? |
AW: Problem mit GridPanel
Mein Nachtrag scheint in die richtige Richtung zu gehen, denn das folgende funktioniert tadellos:
Code:
Dann geht auf einmal auch das direkte Setzen von row und column via AddControl
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; |
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:
Und schau dir an, was da passiert.
Application.ProcessMessages;
Sleep(1000); 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:
Wenn du später nicht via FindComponent auf die Komponenten zugreifen willst/mußt, dann kannst du den .Name auch leer lassen.
for i := 6 downto 2 do
for j := 6 downto i do PS: Der [delphi]-Code macht sich bestimmt besser. |
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; |
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 09:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz