====== TFlowPanel — Kinder im Fluss anordnen ====== Ein [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]], das seine Kinder **selbst anordnet**: eins nach dem anderen in Fließrichtung, mit Umbruch am Rand. Nützlich überall dort, wo die Zahl der Elemente erst zur Laufzeit feststeht — Schaltflächenreihen, Merkmalslisten, Werkzeugsammlungen. Unit: ''vega.extctrls'' · Basis: [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] → [[lyx_-_programmiersprache:vega:controls|Alle Steuerelemente]] · [[lyx_-_programmiersprache:vega:klassenbaum|Klassenbaum]] · [[lyx_-_programmiersprache:vega:guides:komponenten|Guide: Komponenten]] ---- ===== Vererbung ===== **Kette:** [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] → [[lyx_-_programmiersprache:vega:controls:tcontrol|TControl]] → [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] → **TFlowPanel** **Direkte Nachfahren:** keine — diese Klasse wird nicht weiter abgeleitet. **Quelle:** ''vega/extctrls.lyx'' ---- ===== Verwendung ===== var fp: TFlowPanel := new TFlowPanel(); fp.SetBounds(8, 8, 320, 120); fp.SetSpacing(6); fp.SetAutoWrap(true); fp.SetParent(f); var i: int64 := 0; while (i < 8) { var b: TButton := new TButton("Knopf"); b.SetBounds(0, 0, 70, 26); // Groesse zaehlt, Position ordnet das Panel b.SetParent(fp as TControl); i := i + 1; } Die Kinder brauchen **keine** Position — nur eine Größe. Wer die Reihenfolge ändern will, greift über ''ControlList'' zu. ---- ===== Besonderheiten ===== * **''AutoWrap'' entscheidet über den Umbruch.** Ohne ihn laufen die Kinder über den Rand hinaus — das ist Delphis Verhalten und manchmal genau richtig (eine Werkzeugreihe, die abgeschnitten wird). * **''Spacing'' sitzt an der Fläche, nicht am Kind.** Delphi kennt das nicht und lässt jedes Kind seinen eigenen Abstand tragen; ein Wert am Panel ist das einfachere Mittel und wirkt sichtbar. * **''FlowStyle'' bestimmt die Richtung** — von links nach rechts, von oben nach unten und die jeweiligen Gegenrichtungen. * **''ControlList'' ist die Reihenfolge**, nicht die Kinderliste des Controls: dort steht, in welcher Folge angeordnet wird. ---- ===== Eigenschaften ===== Alle Eigenschaften, auch die geerbten. ^ Name ^ Typ ^ Bedeutung ^ Herkunft ^ | ''ComponentState'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Zustand als Bitmaske (''csLoading'', ''csDestroying'' …) | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''ComponentStyle'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Stil als Bitmaske; Vorgabe ''csInheritable'' | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''Name'' | [[lyx_-_programmiersprache:sprache:datentypen#8_zeiger|pchar]] | Name der Komponente — für ''FindComponent'' und beim Laden aus LFM | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''OwnedComponents'' | [[lyx_-_programmiersprache:vega:controls:tobjectlist|TObjectList]] | Die Komponenten, die DIESER gehoeren. Delphis Components[]. Zeigerliste, keine Kopien: TObjectList hält int64-Adressen | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''Owner'' | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | Wer diese Komponente wegraeumt. Nicht der Elternteil im Zeichenbaum — das ist bei TControl `Parent` | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''Tag'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Freier Wert für eigene Zwecke; die Bibliothek fasst ihn nicht an | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''Alignment'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Beschriftung mittig auf der Flaeche, wie in Delphi | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''BevelColor'' | ''TColor'' | Eigene Kantenfarbe. Durchsichtig heißt "Farben des Themes nehmen" — hell oben links, dunkel unten rechts | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''BevelInner'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Innere Kante: erhaben, vertieft oder keine | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''BevelOuter'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Delphis Kanten: aussen, innen, Breite jeder Kante, Abstand dazwischen | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''BevelWidth'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Breite der Kanten in Pixeln | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''Border'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Der aeltere Vega-Rahmen. Er bleibt, weil bestehende Formulare ihn setzen; PB_RAISED/PB_SUNKEN sind dasselbe wie BevelOuter, PB_SINGLE ist eine Linie, die Delphi so nicht kennt | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''ParentBackground'' | [[lyx_-_programmiersprache:sprache:datentypen#5_wahrheitswerte_bool|bool]] | Hintergrund nicht selbst fuellen, sondern den des Elternteils nehmen | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''ShowAccelChar'' | [[lyx_-_programmiersprache:sprache:datentypen#5_wahrheitswerte_bool|bool]] | ''&'' im Text als Tastenkürzel deuten statt anzuzeigen | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''TextLayout'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Senkrechte Ausrichtung der Beschriftung | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''AutoWrap'' | [[lyx_-_programmiersprache:sprache:datentypen#5_wahrheitswerte_bool|bool]] | Umbrechen, wenn die Reihe voll ist? Ohne AutoWrap laufen die Kinder über den Rand hinaus — das ist Delphis Verhalten und manchmal genau das, was man will (eine Werkzeugreihe, die … | eigen | | ''ControlList'' | ''TFlowPanelControls'' | Reihenfolge der angeordneten Kinder | eigen | | ''FlowStyle'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Fließrichtung der Anordnung | eigen | | ''Spacing'' | [[lyx_-_programmiersprache:sprache:datentypen#1_ganzzahl-typen_signiert|int64]] | Abstand zwischen den Kindern. Delphi hat ihn nicht und laesst jedes Kind seinen eigenen BorderSpacing tragen; hier ist ein Wert an der Flaeche das einfachere Mittel, und er wirkt sichtbar | eigen | ---- ===== Methoden ===== Alle Methoden, auch die geerbten. ^ Signatur ^ Zweck ^ Herkunft ^ | ''ClearState(bits: int64): void'' | Zustandsbits löschen | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''ComponentCount(): int64'' | Anzahl der eigenen Komponenten | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''ComponentIndex(): int64'' | Delphis ComponentIndex: der eigene Platz in der Liste des Besitzers | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''Components(index: int64): TComponent'' | Eigene Komponente an dieser Stelle | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''Destroy(): void'' | Raeumt die eigene Liste ab, aber NICHT die Einträge — welche Komponenten ihre Besitztuemer mitnehmen, entscheidet die Ableitung über DestroyComponents() | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''DestroyComponents(): void'' | Baut die Besitztuemer ab. Von hinten, weil jedes Destroy() sich selbst aus der Liste austraegt | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''FindComponent(name: pchar): TComponent'' | Sucht unter den EIGENEN Komponenten, eine Ebene tief — wie in Delphi | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''GetName(): pchar'' | Namen lesen | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''GetNamePath(): pchar'' | Der eigene Name. Delphi hängt bei Unterkomponenten den des Besitzers davor; Vega hat keine, also ist es der Name selbst | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''GetTag(): int64'' | ''Tag'' lesen | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''HasState(bits: int64): bool'' | Sind diese Zustandsbits gesetzt | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''InitComponent(): void'' | Kein Konstruktor: lyxc vererbt Konstruktoren nicht, jede Ableitung ruft InitComponent() im eigenen Create() | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''InsertComponent(c: TComponent): void'' | Komponente in Besitz nehmen; ein bisheriger Besitzer gibt sie ab | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''RemoveComponent(c: TComponent): void'' | Komponente aus dem Besitz nehmen | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''SetName(v: pchar): void'' | Setzt ''Name'' | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''SetState(bits: int64): void'' | Zustand setzen | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''SetTag(v: int64): void'' | Setzt ''Tag'' | [[lyx_-_programmiersprache:vega:controls:tcomponent|TComponent]] | | ''BorderStyle(): int64'' | Delphis BorderStyle kennt genau zwei Werte: kein Rahmen oder eine Linie. Das ist ein Ausschnitt aus Border (PB_*), und beide zeigen hier auf dasselbe Feld | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''ContentRect(): TRect'' | Die Flaeche innerhalb aller Kanten und Raender. Dahin gehört die Beschriftung — und wer Kinder von Hand setzt, rechnet damit. BorderWidth ist das geerbte Feld von TControl; die … | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''Create(): void'' | Anlegen; ''new TFlowPanel()'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetAlignment(v: int64): void'' | Setzt ''Alignment'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetBevelColor(v: TColor): void'' | Setzt ''BevelColor'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetBevelInner(v: int64): void'' | Setzt ''BevelInner'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetBevelOuter(v: int64): void'' | Setzt ''BevelOuter'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetBevelWidth(v: int64): void'' | Setzt ''BevelWidth'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetBorderStyle(v: int64): void'' | Fensterrahmen setzen | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetCaptionText(s: pchar): void'' | Text setzen und neu zeichnen | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''SetTextLayout(v: int64): void'' | Setzt ''TextLayout'' | [[lyx_-_programmiersprache:vega:controls:tpanel|TPanel]] | | ''AddFlowChild(c: TControl): TFlowPanelControl'' | Ein Kind aufnehmen UND in die Flussreihenfolge eintragen | eigen | | ''ArrangeFlow(): void'' | Die Kinder verteilen. Gerechnet wird IMMER links-oben-vorwaerts, und erst zum Schluss gespiegelt — sonst stuenden acht Faelle als acht Schleifen da, und sieben davon wären ungetestet | eigen | | ''Create(): void'' | Anlegen; ''new TFlowPanel()'' | eigen | | ''Destroy(): void'' | Gibt eigene Ressourcen frei | eigen | | ''FlowChild(i: int64): TControl'' | Angeordnetes Kind Nummer ''i'' | eigen | | ''FlowCount(): int64'' | Das n-te Kind in Flussreihenfolge. Ohne Einträge gilt die Reihenfolge im Baum — so verhaelt sich die Flaeche auch dann sinnvoll, wenn jemand seine Kinder mit dem gewoehnlichen AddChild … | eigen | | ''ReihenRueckwaerts(): bool'' | Und die Nebenrichtung — die, in der die Reihen aufeinander folgen | eigen | | ''Rueckwaerts(): bool'' | Laeuft die Hauptrichtung rueckwaerts? Bei waagerechtem Fluss heißt das rechts-nach-links, bei senkrechtem unten-nach-oben | eigen | | ''Waagerecht(): bool'' | Ob waagerecht gerollt wird | eigen | | ''WrapsAfter(i: int64): bool'' | Ob nach diesem Kind umgebrochen wird | eigen | ---- Letzte Aktualisierung: 2026-09-05 — Seite neu angelegt; erhoben aus ''vega/extctrls.lyx'' im Repo ''lyx-vcl''.