AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit GridPanel

Ein Thema von Gutelo · begonnen am 3. Okt 2013 · letzter Beitrag vom 3. Okt 2013
Antwort Antwort
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#1

Problem mit GridPanel

  Alt 3. Okt 2013, 12:40
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?

Geändert von Gutelo ( 3. Okt 2013 um 13:05 Uhr)
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#2

AW: Problem mit GridPanel

  Alt 3. Okt 2013, 13:05
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

Geändert von Gutelo ( 3. Okt 2013 um 13:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem mit GridPanel

  Alt 3. Okt 2013, 13:18
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Problem mit GridPanel

  Alt 3. Okt 2013, 13:27
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;
$2B or not $2B
  Mit Zitat antworten Zitat
Gutelo

Registriert seit: 29. Sep 2013
152 Beiträge
 
#5

AW: Problem mit GridPanel

  Alt 3. Okt 2013, 13:33
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:08 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