![]() |
Panels in einer Scrollbox anzeigen lassen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe ein kleines Problem!!! Ich will mit Delphi Panels in einer ScrollBox erzeugen. Die Anzahl der Panels hängt von der Anzahl der Datensätze in einer Tabelle ab. Mein eigentliches Problem ist die Positionierung der einzelnen Panels. Ich habe ein kleines Image zu meinem Problem gemalt. Damit ihr es vieleicht ein bisschen besser versteht. r ist der Abstand vom Rand und zwischen den Panels. Dieser soll 30 Pixel betragen, soll aber variabel sein. (Am Anfang der Procedure festlegen) w ist die Breite eines Panels, diese lässt sich durch folgende Formel berechnen: w = (Breite Scrollbox - 3 * r) / 2 h ist die Höhe eines Panels, diese lässt sich durch folgende Formel berechnen: h = (Höhe Scrollbox - 3 * r) / 2 Das war es eigentlich schon. Wie ich Panels erzeuge und diese in eine Scrollbox anzeigen lasse, dass weiß ich. Was ich nicht weiß, ist wie ich die Panels so erzeuge wie ich in meinem Image gemalt habe. Mit freundlichen Grüßen Christian18 |
Re: Panels in einer Scrollbox anzeigen lassen
also so ein panel hat ja die propertys height, width, top und left.
Die höhe und breite, die sind ja bei allen panels gleich und da hast du ja auch eine formel. Du musst nur top und left entsprechend zuweisen. beim ersten ist es dann top:=r; left:=r; beim rechts oben ist es left:=2r+w; top:=r; beim links unten ist es left:=r; top:=2r+w; beim rechts unten ist es left:=2r+w; top:=2r+w; |
Re: Panels in einer Scrollbox anzeigen lassen
Zitat:
vielen dank für die schnelle antwort. Das es die Eigenschaften Top und Left gibt ist mir bekannt. Aber wie ist die Formel die ich da rein schreiben muss, damit es fnktioniert??? Bei Top kann ich mir vorstellen, das die schleifenvariable auch mit Berücksichtigt werden muss. MFG Christian18 |
Re: Panels in einer Scrollbox anzeigen lassen
Ach so.
als für die linke spalte müsste das so sein:
Delphi-Quellcode:
Die rechte ist genau so einfach:
for i:=0 to anz do
with panellinks do // hier musst du wenn du nur die namen hast findcomponent einsetzten, oder wenn es ein array ist, das array begin left:=r; top:=(r+h)*i; end;
Delphi-Quellcode:
Findcomponent geht so:
for i:=0 to anz do
with panelrechts do // hier musst du wenn du nur die namen hast findcomponent einsetzten, oder wenn es ein array ist, das array begin left:=2*r+w; top:=(r+h)*i; end;
Delphi-Quellcode:
Das sucht nach dem Namen der Komponente, also du musst es entsprechnd benannt haben.
with TPanel(form1.Listbox1.FindComponent('PanelLinks'+inttostr(i))) do //mit form1.Listbox1 bin ich mir nicht so sicher, könnte auch form1. findcomponent sein
Ein Array ist aber natürlich viel besser, gerade wenn du es dynamisch erstellst. Gruß Alexander |
Re: Panels in einer Scrollbox anzeigen lassen
Hallo,
ich habe es mal versucht. Leider funktioniert es nicht so ganz wie ich es will. Wenn ich die Procedure aufrufe und eine 1 übergebe, dann funktioniert ja auch noch alles. Aber wenn ich eine 2 übergebe, dann funktioniert auch alles, außer der beschriftung. Die Breite und Höhe wird richtig berechnet. Wo liegt mein Fehler???
Delphi-Quellcode:
procedure TForm1.ShowPictures(a : Integer);
var p : Array of TPanel; r : Integer; j : Integer; begin SetLength(p, a); r:=10; for j:=1 to a do begin p[j - 1]:=TPanel.Create(nil); p[j - 1].Caption:='Panel ' + IntToStr(j); p[j - 1].Width:=Round((ScrollBox1.Width - 3 * r) / 2); p[j - 1].Height:=Round((ScrollBox1.Height - 3 * r) / 2); if j mod a = 0 then begin p[j - 1].Left:=r; p[j - 1].Top:=r; end else begin p[j - 1].Left:=Round(2 * r + (ScrollBox1.Width - 3 * r) / 2); p[j - 1].Top:=r; end; p[j - 1].Parent:=ScrollBox1; end; end; procedure TForm1.FormShow(Sender: TObject); begin ShowPictures(2); end; |
Re: Panels in einer Scrollbox anzeigen lassen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Christian,
ich habe deinen Code etwas aufgeräumt und die Signatur verändert, damit man ihn universeller verwenden kann. Die Captions werden bei mir auch richtig gesetzt:
Delphi-Quellcode:
Freundliche Grüße
procedure TDemoForm.CreatePanels(n, cols, gap: Integer; pc: TWinControl);
var i, rows: Integer; begin Panels.Clear; rows := Succ(n) div cols; while Panels.Count < n do with TPanel(Panels[Panels.Add(TPanel.Create(self))]) do begin i := Pred(Panels.Count); Parent := pc; Caption := Format('Panel %d', [Succ(i)]); Width := Round((pc.Width - Succ(cols) * gap) div cols); Height := Round((pc.Height - Succ(rows) * gap) div rows); Left := gap + (i mod cols) * (gap + Width); Top := gap + (i div cols) * (gap + Height); end; end; |
Re: Panels in einer Scrollbox anzeigen lassen
Hallo,
vielen dank für die Hilfe erst mal!!! Das hat aber irgendwie gar nichts mehr mit meinem Code zu tun. Jetzt weiß ich ja immer noch nicht was ich falsch gemacht habe. Wie muss ich denn meinen Code abwel, das die Top geschichte auch funktioniert. Ich habe an meinem Code jetzt nochmal ein bisschen gearbeitet. Aber das mit den Top funktioniert immernoch nicht. Jetzt funktioniert aber die Beschriftung richtig. Hier mein Code:
Delphi-Quellcode:
procedure TForm1.ShowPictures(a : Integer);
var p : Array of TPanel; r : Integer; w : Integer; h : Integer; j : Integer; begin SetLength(p, a); r:=30; w:=Round((ScrollBox1.Width - 3 * r) / 2); h:=Round((ScrollBox1.Height - 3 * r) / 2); for j:=1 to a do begin p[j - 1]:=TPanel.Create(nil); p[j - 1].Width:=w; p[j - 1].Height:=h; if j mod 2 = 0 then begin p[j - 1].Left:=2 * r + w; end else begin p[j - 1].Left:=r; end; p[j - 1].Parent:=ScrollBox1; end; end; procedure TForm1.FormShow(Sender: TObject); begin ShowPictures(4); end; |
Re: Panels in einer Scrollbox anzeigen lassen
Hallo,
Zitat:
Zitat:
Delphi-Quellcode:
Du nimmst die Höhe der ScrollBox zur Entwurfszeit ziehst dreimal den Gap-Value 30 ab und teilst durch zwei - offensichtlich rechnest du unabhängig von der Zahl der Panels immer mit zwei Spalten und zwei Zeilen. Merkst du jetzt was? In meinem Code gibt es eine entsprechende Zeile, die durch die sprechenden Namen zeigt, wie die Zahl der Panel die Berechnung beeinflusst.
begin
// ... h := Round((ScrollBox1.Height - 3 * r) / 2); // ... Zitat:
Freundliche Grüße |
Re: Panels in einer Scrollbox anzeigen lassen
Hallo,
die höhe soll so berechnet werden, deshalb habe ich ja auch die Berechnung vorgegeben,wie die Höhe berechnet wird. Wenn die Anzahl der Panels größer ist als 4, dann soll man Scrollen könnnen. Sonst hätte ich ja keine Scrollbox benötigt. Hätte ich vieleicht noch dazu schreiben sollen. Sry. Mein einziges Problem, was ich jetzt noch habe, ist wie ich den Top Wert berechne. Dann funktioniert alles so wie ich es mir vorstelle. [Edit] Ich weiß nicht wie ich den Wert berechne, den ich dann bei Top zuweisen muss. [/Edit] Mfg Christian18 |
Re: Panels in einer Scrollbox anzeigen lassen
Ah, jetzt ja ...
Delphi-Quellcode:
Die Zuweisung an Top kannst du bestimmt an deine Bedürfnisse anpassen. Die anderen Anpassungen an meinem Code sorgen dafür, dass der rechte Rand genauso groß wird wie der linke und dass der untere Rand so groß wird wie der obere.
procedure TDemoForm.CreatePanels(n, cols, gap: Integer; pc: TScrollBox);
var i, rows, pnlWidth, pnlHeight, vsbWidth: Integer; begin if n > 4 then vsbWidth := GetSystemMetrics(SM_CXVScroll) else vsbWidth := 0; pnlWidth := Round((pc.ClientWidth - vsbWidth - Succ(cols) * gap) div cols); pnlHeight := Round((pc.Height - Succ(cols) * gap) div cols); Panels.Clear; rows := Succ(n) div cols; pc.VertScrollBar.Range := gap + rows * (gap + pnlHeight) - 4; while Panels.Count < n do with TPanel(Panels[Panels.Add(TPanel.Create(self))]) do begin i := Pred(Panels.Count); Parent := pc; Caption := Format('Panel %d', [Succ(i)]); Width := pnlWidth; Height := pnlHeight; Left := gap + (i mod cols) * (gap + Width); Top := gap + (i div cols) * (gap + Height); end; end; Gute Nacht |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz