2016-04-01 3 views
1

Ich bin seit ein paar Jahren weg von Delphi, Web-Apps zu tun.Auto-Layout von vertikalen Panels in Delphi

Ich habe mich gewöhnt, in HTML von nur <div> ... </div> aufeinanderfolgend zu deklarieren und sie untereinander platziert, mit Abstand von CSS zur Verfügung gestellt.

Ich möchte eine Delphi-App erstellen, wo ich eine Sammlung von Daten habe, sagen wir mal, es sind Daten über Filme. Anfangs würde ich für jeden eine Tafel haben, die nur den Titel zeigen würde. Wenn du auf einen klickst, wird er erweitert, um Schauspieler, Regisseur, Handlung, etc. zu zeigen. Klicke auf einen anderen und der erste wird schrumpfen & der neue expandieren (max 1 expanded; klicke erneut auf diesen um ihn zu schricken).

So habe ich zwei Layout-Probleme: 1) um die erste .top von jedem Panel zu berechnen und 2) neu zu berechnen, wie verschiedene Panels angeklickt werden.

Ich bin natürlich in der Lage, alles manuell zu kodieren, aber es scheint mühsam und fehleranfällig.

Gibt es einen akzeptierten Weg, dies zu tun? Eine VCL-Komponente, die mit Delphi geliefert wird? Sollte ich auf https://softwarerecs.stackexchange.com/ für eine VCL-Komponente eines Drittanbieters fragen?

+2

Eine Kategorie Panel-Gruppe kommt in der Nähe. Sie können alle Bereiche außer dem erweiterten Kategoriebereich ausblenden, wenn auf einen geklickt wird. –

+0

Danke! (+1) Fühlen Sie sich frei, das als Antwort zu posten. – Mawg

+1

Fertig .. Gern geschehen. –

Antwort

4

Die nächste VCL-Steuerung ist wahrscheinlich TCategoryPanelGroup, die aus vertikal ausgerichteten erweiterbaren Panels besteht (TCategoryPanel).

Die Steuerung verfügt nicht über eine ‚autocollapsepanels‘ oder "maxexpandedpanelcount Eigentum, aber Sie können einige einfache Code verwenden, das gewünschte Verhalten zu erreichen. Zum Beispiel die unter OnExpand Event-Handler, wenn in der Gruppe auf alle Kategorie Paneele angebracht ist, wird eine erweiterte Panel schließen andere verursachen.

procedure TForm1.CategoryPanelExpand(Sender: TObject); 
var 
    I: Integer; 
begin 
    if Sender is TCategoryPanel then 
    for I := 0 to CategoryPanelGroup1.Panels.Count - 1 do 
     if CategoryPanelGroup1.Panels[i] <> Sender then 
     TCategoryPanel(CategoryPanelGroup1.Panels[i]).Collapse; 
end; 


Sie AlignWithMargins Eigenschaft Panels auf true gesetzt, dann Abstand anpassen, indem Sie die Margins Eigenschaften der Platten verwendet wird.