Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Seiten aus TPageControl entfernen
UweK - Di 05.05.20 16:49
Titel: Seiten aus TPageControl entfernen
Hallo,
Ich erstelle zur Laufzeit mehrere TTabSheet mit verschiedenen Inhalten und füge sie in ein TPageControl ein, das ich schon zur Entwurfszeit im Formular platzierte:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var MyTabSheets: array of TTabSheet;
SetLength(MyTabsheets, 10); for I:= 0 to 9 do begin TabSheets[I]:= TTabSheet.Create(MyPageControl); TTabSheet[I].PageControl:= MyPageControl;
end; |
Jetzt möchte ich mittendrin eins der TTabSheet aus TPageControl wieder eintfernen, so dass die nachfolgenden TTabSheet in der Anzeige von TPageControl aufrücken und TPageControl dann eine Seite weniger anzeigt. Mit z.B.
Delphi-Quelltext
1:
| MyPageControl.RemoveControl(MyTabSheets[3]) |
verschwindet aber nur der Inhalt dieses TTabSheet in der Anzeige. An der Stelle verbleibt eine leere Seite, und die Gesamtzahl der Seiten in TPageControl ist immer noch dieselbe. Was geht da schief?
Vielen Dank für Tipps.
Th69 - Di 05.05.20 17:50
Hallo,
lies mal die Beschreibung zu
RemoveControl [
http://docwiki.embarcadero.com/Libraries/Rio/de/Vcl.Controls.TWinControl.RemoveControl].
Man sollte einfach den
Parent setzen, also
Delphi-Quelltext
1:
| MyPageControl.Parent := nil; |
Und du solltest die Page auch wieder mit
Free freigeben.
Bedenke auch, wenn du eine Page mittendrin löschst, daß dann dein eigenes Array
MyTabSheets nicht mehr passend dazu ist (bzgl. der Indizes). Brauchst du überhaupt dieses Array?
Oder ist das nur ein lokales Array? Aber auch dann wäre dies so besser:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| var tabSheet: TTabSheet;
for I:= 0 to 9 do begin tabSheet := TTabSheet.Create(MyPageControl); tabSheet.PageControl := MyPageControl; end; |
UweK - Mi 06.05.20 12:14
Hallo Th69,
Den Tipp habe ich probiert, aber das Ergebnis bleibt zunächst mal dasselbe:
Delphi-Quelltext
1: 2: 3: 4: 5:
| for I:= 1 to 9 do begin MyPageControl.RemoveControl(MyTabSheets[I]); MyTabSheets[I].Parent:= nil; end; |
Egal ob ich in der Schleife den einen, den anderen oder beide Befehle stehen habe, bleiben im TPageControl die leeren Seiten übrig. Erst wenn ich in der Schleife als dritte Zeile
hinzufüge, verschwinden diese Leichen in TPageControl. So ist mein Problem zwar technisch gelöst, aber verstanden hätte ich diesen Effekt schon gern. Ist das eine bekannte Eigenart von TPageControl?
Das mit dem Rauslöschen mittendrin im Array ist mit bewusst. Die nachfolgenden Elemente des Array schiebe ich darum nach dem Löschen mittendrin um einen Index nach vorn, und setze zum Schluss die Länge des Array um Eins herunter. Ein bisschen umständlich, aber das Array brauche ich, um später auf die eingefügten Komponenten in den verschiedenen TTabSheet gezielt zugreifen zu können. In meinem Fall enthält jedes TTabSheet ein TDirectoryListBox für viele spezielle Einzelverzeichnisse, die an einer Stelle übersichtlich einstellbar sein sollen:
Delphi-Quelltext
1: 2:
| DirectoryListBox:= TDirectoryListBox.Create(Self); MyTabSheet[I].InsertControl(DirectoryListBox); |
Auf diese kann ich dann mit
Delphi-Quelltext
1:
| MyTabSheets[I].DirectoryListBox.Directory |
gezielt zugreifen. Würde das auch in deinem angegebenen Beispiel ohne Array irgendwie gehen? Dann könnte ich mir die Array-Verwaltung sparen.
Dank + Gruß, Uwe
Th69 - Mi 06.05.20 12:36
Das mit der leeren Seite kann ich dir leider auch nicht erklären (da scheinen die beiden Klassen
TPageControl und
TTabSheet irgendwie [eigenartig] miteinander gekoppelt zu sein).
Du kannst doch jederzeit mittels
Delphi-Quelltext
1: 2: 3:
| var tabSheet : TTabSheet;
tabSheet := MyPageControl.Pages[i]; |
auf die einzelnen Seiten zugreifen (bzw. dir eine Funktion dafür erstellen).
jaenicke - Mi 06.05.20 17:28
An der Stelle noch ein Hinweis:
Falls du Seiten dynamisch ein- und ausblenden möchtest, kannst du auch die Eigenschaft TabVisible der einzelnen Seiten auf True oder False setzen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!