Tendl - Do 30.06.05 15:40
Titel: Problem mit Scrollbox (Platzierung zur Laufzeit)
Ich habe folgendes Problem:
Ich möchte in einer Scrollbox quadratische Panels anordnen, mehrere Spalten und mehrere
Zeilen. In dem Moment in dem ich aber den Scrollbar verschiebe und dann einfüge wird das Panel nicht in die richtige Zeile sondern versetzt eingefügt, d.h es bleibe ganze Zeilen frei.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| TForm1 = class(TForm) .... private public panels1: TObjectlist; constructor create(AOwner: TComponent); override; end; |
Mit folgender Routine erzeuge ich die Panel-Liste:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| constructor TForm1.create(AOwner: TComponent); begin inherited create(AOwner); panels1 := TObjectlist.create; panels1.OwnsObjects:=true; end; |
Mit folgender Routine erzeuge ich zur Laufzeit die Panels:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.Add1Click(Sender: TObject); var new_panel:TPanel; index:integer; begin new_panel:=TPanel.Create(form1.ScrollBox1); new_panel.Height:=50; new_panel.Width:=50; new_panel.Color:=clwhite; new_panel.Parent:=form1.ScrollBox1; panels1.Add(new_panel); index:=panels1.Count-1; new_panel.Top:= ((index div 3)*70)+20; new_panel.left:= ((index mod 3)*70)+20; end; |
Meine Scrollbox wird nur Horizontal gescrollt und wenn ich das tue und anschließend ein
weiteres Panel einfüge so bleibt der Leerraum stehen.
Es ist egal ob ich die Orginal Delphi 7 Komponente oder die Jedi-Kompo nehme.
Im Moment habe ich keine Ahnung, wie ich das Problem in den Griff kriegen kann.
Weiß jemand Rat?
Danke Thomas
Tendl - Fr 01.07.05 14:03
Ich habe das Problem selbst gelöst, schaut für mich aber eher wie ein Work-Around aus als nach einer sauberen Lösung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| procedure TForm1.Add1Click(Sender: TObject); var new_panel: TPanel; index: integer; offset: Tpoint; begin new_panel := TPanel.Create(form1.ScrollBox1); new_panel.Height := 50; new_panel.Width := 50; new_panel.Color := clwhite; new_panel.Parent := form1.ScrollBox1; panels1.Add(new_panel); index := panels1.Count - 1; if scrollbox1.HorzScrollBar.Visible then offset.X := scrollbox1.HorzScrollBar.Position else offset.X := 0; if scrollbox1.VertScrollBar.Visible then offset.y := scrollbox1.VertScrollBar.Position else offset.y := 0; new_panel.Top := ((index div maxcol) * 70) + 20 - offset.y; new_panel.left := ((index mod maxcol) * 70) + 20 - offset.x; end; |
Man muß also beim Einfügen des Objekts den Offset der Scrollbalken abziehen.
Vielleicht hilft der Schnipsel ja auch noch jemand anderem.
Thomas