AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Panels in einer Scrollbox anzeigen lassen
Thema durchsuchen
Ansicht
Themen-Optionen

Panels in einer Scrollbox anzeigen lassen

Ein Thema von Christian18 · begonnen am 5. Jan 2007 · letzter Beitrag vom 6. Jan 2007
Antwort Antwort
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

Panels in einer Scrollbox anzeigen lassen

  Alt 5. Jan 2007, 15:38
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
Miniaturansicht angehängter Grafiken
unbenannt_343.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 5. Jan 2007, 15:44
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;
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#3

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 5. Jan 2007, 15:47
Zitat von Alexander Roth:
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.
Hallo,

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
  Mit Zitat antworten Zitat
Benutzerbild von Alexander Roth
Alexander Roth

Registriert seit: 17. Mai 2004
Ort: Kenn
574 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 5. Jan 2007, 15:51
Ach so.
als für die linke spalte müsste das so sein:
Delphi-Quellcode:
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;
Die rechte ist genau so einfach:
Delphi-Quellcode:
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;
Findcomponent geht so:
  with TPanel(form1.Listbox1.FindComponent('PanelLinks'+inttostr(i))) do //mit form1.Listbox1 bin ich mir nicht so sicher, könnte auch form1. findcomponent sein Das sucht nach dem Namen der Komponente, also du musst es entsprechnd benannt haben.

Ein Array ist aber natürlich viel besser, gerade wenn du es dynamisch erstellst.

Gruß Alexander
Alexander Roth
Ich bin umgestiegen auf: Lazarus und Ubuntu! Alles OpenSource!

Besuch doch mal: www.roth.us.ms
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#5

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 6. Jan 2007, 10:51
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 6. Jan 2007, 11:35
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:
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;
Freundliche Grüße
Angehängte Dateien
Dateityp: zip scrollbox_777.zip (1,8 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#7

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 6. Jan 2007, 18:04
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 6. Jan 2007, 20:06
Hallo,

Zitat von Christian18:
... Das hat aber irgendwie gar nichts mehr mit meinem Code zu tun. ...
gar nicht wahr - ich habe dieselbe Sprache benutzt - irgendwie.

Zitat von Christian18:
... Wie muss ich denn meinen Code abwel, das die Top geschichte auch funktioniert. ...
Du könntest damit anfangen, dass du die Höhe richtig berechnest. Mit vier Panels zu testen war etwas ungeschickt - teste mal mit 6 Panels:

Delphi-Quellcode:
begin
  // ...
  h := Round((ScrollBox1.Height - 3 * r) / 2);
  // ...
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.

Zitat von Christian18:
... Aber das mit den Top funktioniert immernoch nicht. ...
Wenn du die Höhe richtig berechnet hast, dann musst du nur noch den Wert an Top zuweisen, was du momentan gar nicht machst.

Freundliche Grüße
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#9

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 6. Jan 2007, 21:22
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Panels in einer Scrollbox anzeigen lassen

  Alt 6. Jan 2007, 22:47
Ah, jetzt ja ...

Delphi-Quellcode:
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;
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.

Gute Nacht
  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 09:45 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